protect.hpp 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. #ifndef BOOST_BIND_PROTECT_HPP_INCLUDED
  2. #define BOOST_BIND_PROTECT_HPP_INCLUDED
  3. //
  4. // protect.hpp
  5. //
  6. // Copyright (c) 2002 Peter Dimov and Multi Media Ltd.
  7. // Copyright (c) 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/config.hpp>
  14. #include <boost/detail/workaround.hpp>
  15. namespace boost
  16. {
  17. namespace _bi
  18. {
  19. template<class F> class protected_bind_t
  20. {
  21. public:
  22. typedef typename F::result_type result_type;
  23. explicit protected_bind_t(F f): f_(f)
  24. {
  25. }
  26. result_type operator()()
  27. {
  28. return f_();
  29. }
  30. result_type operator()() const
  31. {
  32. return f_();
  33. }
  34. template<class A1> result_type operator()(A1 & a1)
  35. {
  36. return f_(a1);
  37. }
  38. template<class A1> result_type operator()(A1 & a1) const
  39. {
  40. return f_(a1);
  41. }
  42. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  43. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  44. template<class A1> result_type operator()(const A1 & a1)
  45. {
  46. return f_(a1);
  47. }
  48. template<class A1> result_type operator()(const A1 & a1) const
  49. {
  50. return f_(a1);
  51. }
  52. #endif
  53. template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2)
  54. {
  55. return f_(a1, a2);
  56. }
  57. template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2) const
  58. {
  59. return f_(a1, a2);
  60. }
  61. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  62. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  63. template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2)
  64. {
  65. return f_(a1, a2);
  66. }
  67. template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2) const
  68. {
  69. return f_(a1, a2);
  70. }
  71. template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2)
  72. {
  73. return f_(a1, a2);
  74. }
  75. template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2) const
  76. {
  77. return f_(a1, a2);
  78. }
  79. template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2)
  80. {
  81. return f_(a1, a2);
  82. }
  83. template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2) const
  84. {
  85. return f_(a1, a2);
  86. }
  87. #endif
  88. template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3)
  89. {
  90. return f_(a1, a2, a3);
  91. }
  92. template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3) const
  93. {
  94. return f_(a1, a2, a3);
  95. }
  96. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  97. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  98. template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3)
  99. {
  100. return f_(a1, a2, a3);
  101. }
  102. template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3) const
  103. {
  104. return f_(a1, a2, a3);
  105. }
  106. #endif
  107. template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4)
  108. {
  109. return f_(a1, a2, a3, a4);
  110. }
  111. template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4) const
  112. {
  113. return f_(a1, a2, a3, a4);
  114. }
  115. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  116. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  117. template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4)
  118. {
  119. return f_(a1, a2, a3, a4);
  120. }
  121. 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
  122. {
  123. return f_(a1, a2, a3, a4);
  124. }
  125. #endif
  126. template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5)
  127. {
  128. return f_(a1, a2, a3, a4, a5);
  129. }
  130. 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
  131. {
  132. return f_(a1, a2, a3, a4, a5);
  133. }
  134. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  135. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  136. 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)
  137. {
  138. return f_(a1, a2, a3, a4, a5);
  139. }
  140. 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
  141. {
  142. return f_(a1, a2, a3, a4, a5);
  143. }
  144. #endif
  145. 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)
  146. {
  147. return f_(a1, a2, a3, a4, a5, a6);
  148. }
  149. 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
  150. {
  151. return f_(a1, a2, a3, a4, a5, a6);
  152. }
  153. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  154. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  155. 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)
  156. {
  157. return f_(a1, a2, a3, a4, a5, a6);
  158. }
  159. 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
  160. {
  161. return f_(a1, a2, a3, a4, a5, a6);
  162. }
  163. #endif
  164. 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)
  165. {
  166. return f_(a1, a2, a3, a4, a5, a6, a7);
  167. }
  168. 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
  169. {
  170. return f_(a1, a2, a3, a4, a5, a6, a7);
  171. }
  172. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  173. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  174. 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)
  175. {
  176. return f_(a1, a2, a3, a4, a5, a6, a7);
  177. }
  178. 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
  179. {
  180. return f_(a1, a2, a3, a4, a5, a6, a7);
  181. }
  182. #endif
  183. 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)
  184. {
  185. return f_(a1, a2, a3, a4, a5, a6, a7, a8);
  186. }
  187. 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
  188. {
  189. return f_(a1, a2, a3, a4, a5, a6, a7, a8);
  190. }
  191. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  192. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  193. 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)
  194. {
  195. return f_(a1, a2, a3, a4, a5, a6, a7, a8);
  196. }
  197. 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
  198. {
  199. return f_(a1, a2, a3, a4, a5, a6, a7, a8);
  200. }
  201. #endif
  202. 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)
  203. {
  204. return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  205. }
  206. 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
  207. {
  208. return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  209. }
  210. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  211. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  212. 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)
  213. {
  214. return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  215. }
  216. 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
  217. {
  218. return f_(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  219. }
  220. #endif
  221. private:
  222. F f_;
  223. };
  224. } // namespace _bi
  225. template<class F> _bi::protected_bind_t<F> protect(F f)
  226. {
  227. return _bi::protected_bind_t<F>(f);
  228. }
  229. } // namespace boost
  230. #endif // #ifndef BOOST_BIND_PROTECT_HPP_INCLUDED