protect.hpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. #ifndef BOOST_BIND_PROTECT_HPP_INCLUDED
  2. #define BOOST_BIND_PROTECT_HPP_INCLUDED
  3. //
  4. // protect.hpp
  5. //
  6. // Copyright 2002, 2020 Peter Dimov
  7. // Copyright 2009 Steven Watanabe
  8. //
  9. // Distributed under the Boost Software License, Version 1.0. (See
  10. // accompanying file LICENSE_1_0.txt or copy at
  11. // http://www.boost.org/LICENSE_1_0.txt)
  12. //
  13. #include <boost/bind/detail/requires_cxx11.hpp>
  14. #include <boost/config.hpp>
  15. #include <boost/config/workaround.hpp>
  16. #include <utility>
  17. namespace boost
  18. {
  19. namespace _bi
  20. {
  21. #if !defined(BOOST_NO_CXX11_VARIADIC_TEMPLATES) && !defined(BOOST_NO_CXX11_RVALUE_REFERENCES) && !defined(BOOST_NO_CXX11_DECLTYPE) && !(defined(BOOST_GCC) && BOOST_GCC < 40600)
  22. template<class T> struct protect_make_void
  23. {
  24. typedef void type;
  25. };
  26. template<class F, class E = void> struct protect_result_type
  27. {
  28. };
  29. template<class F> struct protect_result_type< F, typename protect_make_void<typename F::result_type>::type >
  30. {
  31. typedef typename F::result_type result_type;
  32. };
  33. template<class F> class protected_bind_t: public protect_result_type<F>
  34. {
  35. private:
  36. F f_;
  37. public:
  38. explicit protected_bind_t( F f ): f_( f )
  39. {
  40. }
  41. template<class... A> auto operator()( A&&... a ) -> decltype( f_( std::forward<A>(a)... ) )
  42. {
  43. return f_( std::forward<A>(a)... );
  44. }
  45. template<class... A> auto operator()( A&&... a ) const -> decltype( f_( std::forward<A>(a)... ) )
  46. {
  47. return f_( std::forward<A>(a)... );
  48. }
  49. };
  50. #else
  51. template<class F> class protected_bind_t
  52. {
  53. private:
  54. F f_;
  55. public:
  56. typedef typename F::result_type result_type;
  57. explicit protected_bind_t(F f): f_(f)
  58. {
  59. }
  60. result_type operator()()
  61. {
  62. return f_();
  63. }
  64. result_type operator()() const
  65. {
  66. return f_();
  67. }
  68. template<class A1> result_type operator()(A1 & a1)
  69. {
  70. return f_(a1);
  71. }
  72. template<class A1> result_type operator()(A1 & a1) const
  73. {
  74. return f_(a1);
  75. }
  76. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  77. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  78. template<class A1> result_type operator()(const A1 & a1)
  79. {
  80. return f_(a1);
  81. }
  82. template<class A1> result_type operator()(const A1 & a1) const
  83. {
  84. return f_(a1);
  85. }
  86. #endif
  87. template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2)
  88. {
  89. return f_(a1, a2);
  90. }
  91. template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2) const
  92. {
  93. return f_(a1, a2);
  94. }
  95. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  96. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  97. template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2)
  98. {
  99. return f_(a1, a2);
  100. }
  101. template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2) const
  102. {
  103. return f_(a1, a2);
  104. }
  105. template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2)
  106. {
  107. return f_(a1, a2);
  108. }
  109. template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2) const
  110. {
  111. return f_(a1, a2);
  112. }
  113. template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2)
  114. {
  115. return f_(a1, a2);
  116. }
  117. template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2) const
  118. {
  119. return f_(a1, a2);
  120. }
  121. #endif
  122. template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3)
  123. {
  124. return f_(a1, a2, a3);
  125. }
  126. template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3) const
  127. {
  128. return f_(a1, a2, a3);
  129. }
  130. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  131. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  132. template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3)
  133. {
  134. return f_(a1, a2, a3);
  135. }
  136. template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3) const
  137. {
  138. return f_(a1, a2, a3);
  139. }
  140. #endif
  141. template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4)
  142. {
  143. return f_(a1, a2, a3, a4);
  144. }
  145. template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4) const
  146. {
  147. return f_(a1, a2, a3, a4);
  148. }
  149. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  150. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  151. template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4)
  152. {
  153. return f_(a1, a2, a3, a4);
  154. }
  155. template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4) const
  156. {
  157. return f_(a1, a2, a3, a4);
  158. }
  159. #endif
  160. template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5)
  161. {
  162. return f_(a1, a2, a3, a4, a5);
  163. }
  164. template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5) const
  165. {
  166. return f_(a1, a2, a3, a4, a5);
  167. }
  168. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  169. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  170. template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5)
  171. {
  172. return f_(a1, a2, a3, a4, a5);
  173. }
  174. template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5) const
  175. {
  176. return f_(a1, a2, a3, a4, a5);
  177. }
  178. #endif
  179. template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6)
  180. {
  181. return f_(a1, a2, a3, a4, a5, a6);
  182. }
  183. template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6) const
  184. {
  185. return f_(a1, a2, a3, a4, a5, a6);
  186. }
  187. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  188. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  189. template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6)
  190. {
  191. return f_(a1, a2, a3, a4, a5, a6);
  192. }
  193. template<class A1, class A2, class A3, class A4, class A5, class A6> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6) const
  194. {
  195. return f_(a1, a2, a3, a4, a5, a6);
  196. }
  197. #endif
  198. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7)
  199. {
  200. return f_(a1, a2, a3, a4, a5, a6, a7);
  201. }
  202. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7) const
  203. {
  204. return f_(a1, a2, a3, a4, a5, a6, a7);
  205. }
  206. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  207. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  208. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7)
  209. {
  210. return f_(a1, a2, a3, a4, a5, a6, a7);
  211. }
  212. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7) const
  213. {
  214. return f_(a1, a2, a3, a4, a5, a6, a7);
  215. }
  216. #endif
  217. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8)
  218. {
  219. return f_(a1, a2, a3, a4, a5, a6, a7, a8);
  220. }
  221. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8) const
  222. {
  223. return f_(a1, a2, a3, a4, a5, a6, a7, a8);
  224. }
  225. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  226. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  227. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8)
  228. {
  229. return f_(a1, a2, a3, a4, a5, a6, a7, a8);
  230. }
  231. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8) const
  232. {
  233. return f_(a1, a2, a3, a4, a5, a6, a7, a8);
  234. }
  235. #endif
  236. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9)
  237. {
  238. return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  239. }
  240. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5, A6 & a6, A7 & a7, A8 & a8, A9 & a9) const
  241. {
  242. return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  243. }
  244. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  245. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  246. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9)
  247. {
  248. return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  249. }
  250. template<class A1, class A2, class A3, class A4, class A5, class A6, class A7, class A8, class A9> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4, A5 const & a5, A6 const & a6, A7 const & a7, A8 const & a8, A9 const & a9) const
  251. {
  252. return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  253. }
  254. #endif
  255. };
  256. #endif
  257. } // namespace _bi
  258. template<class F> _bi::protected_bind_t<F> protect(F f)
  259. {
  260. return _bi::protected_bind_t<F>(f);
  261. }
  262. } // namespace boost
  263. #endif // #ifndef BOOST_BIND_PROTECT_HPP_INCLUDED