bind_template.hpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345
  1. //
  2. // bind/bind_template.hpp
  3. //
  4. // Do not include this header directly.
  5. //
  6. // Copyright (c) 2001-2004 Peter Dimov and Multi Media Ltd.
  7. //
  8. // Distributed under the Boost Software License, Version 1.0. (See
  9. // accompanying file LICENSE_1_0.txt or copy at
  10. // http://www.boost.org/LICENSE_1_0.txt)
  11. //
  12. // See http://www.boost.org/libs/bind/bind.html for documentation.
  13. //
  14. typedef typename result_traits<R, F>::type result_type;
  15. result_type operator()()
  16. {
  17. list0 a;
  18. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  19. }
  20. result_type operator()() const
  21. {
  22. list0 a;
  23. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  24. }
  25. template<class A1> result_type operator()(A1 & a1)
  26. {
  27. list1<A1 &> a(a1);
  28. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  29. }
  30. template<class A1> result_type operator()(A1 & a1) const
  31. {
  32. list1<A1 &> a(a1);
  33. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  34. }
  35. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  36. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  37. template<class A1> result_type operator()(A1 const & a1)
  38. {
  39. list1<A1 const &> a(a1);
  40. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  41. }
  42. template<class A1> result_type operator()(A1 const & a1) const
  43. {
  44. list1<A1 const &> a(a1);
  45. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  46. }
  47. #endif
  48. template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2)
  49. {
  50. list2<A1 &, A2 &> a(a1, a2);
  51. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  52. }
  53. template<class A1, class A2> result_type operator()(A1 & a1, A2 & a2) const
  54. {
  55. list2<A1 &, A2 &> a(a1, a2);
  56. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  57. }
  58. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  59. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  60. template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2)
  61. {
  62. list2<A1 const &, A2 &> a(a1, a2);
  63. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  64. }
  65. template<class A1, class A2> result_type operator()(A1 const & a1, A2 & a2) const
  66. {
  67. list2<A1 const &, A2 &> a(a1, a2);
  68. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  69. }
  70. template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2)
  71. {
  72. list2<A1 &, A2 const &> a(a1, a2);
  73. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  74. }
  75. template<class A1, class A2> result_type operator()(A1 & a1, A2 const & a2) const
  76. {
  77. list2<A1 &, A2 const &> a(a1, a2);
  78. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  79. }
  80. template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2)
  81. {
  82. list2<A1 const &, A2 const &> a(a1, a2);
  83. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  84. }
  85. template<class A1, class A2> result_type operator()(A1 const & a1, A2 const & a2) const
  86. {
  87. list2<A1 const &, A2 const &> a(a1, a2);
  88. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  89. }
  90. #endif
  91. template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3)
  92. {
  93. list3<A1 &, A2 &, A3 &> a(a1, a2, a3);
  94. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  95. }
  96. template<class A1, class A2, class A3> result_type operator()(A1 & a1, A2 & a2, A3 & a3) const
  97. {
  98. list3<A1 &, A2 &, A3 &> a(a1, a2, a3);
  99. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  100. }
  101. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  102. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  103. template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3)
  104. {
  105. list3<A1 const &, A2 const &, A3 const &> a(a1, a2, a3);
  106. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  107. }
  108. template<class A1, class A2, class A3> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3) const
  109. {
  110. list3<A1 const &, A2 const &, A3 const &> a(a1, a2, a3);
  111. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  112. }
  113. #endif
  114. template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4)
  115. {
  116. list4<A1 &, A2 &, A3 &, A4 &> a(a1, a2, a3, a4);
  117. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  118. }
  119. template<class A1, class A2, class A3, class A4> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4) const
  120. {
  121. list4<A1 &, A2 &, A3 &, A4 &> a(a1, a2, a3, a4);
  122. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  123. }
  124. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  125. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  126. template<class A1, class A2, class A3, class A4> result_type operator()(A1 const & a1, A2 const & a2, A3 const & a3, A4 const & a4)
  127. {
  128. list4<A1 const &, A2 const &, A3 const &, A4 const &> a(a1, a2, a3, a4);
  129. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  130. }
  131. 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
  132. {
  133. list4<A1 const &, A2 const &, A3 const &, A4 const &> a(a1, a2, a3, a4);
  134. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  135. }
  136. #endif
  137. template<class A1, class A2, class A3, class A4, class A5> result_type operator()(A1 & a1, A2 & a2, A3 & a3, A4 & a4, A5 & a5)
  138. {
  139. list5<A1 &, A2 &, A3 &, A4 &, A5 &> a(a1, a2, a3, a4, a5);
  140. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  141. }
  142. 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
  143. {
  144. list5<A1 &, A2 &, A3 &, A4 &, A5 &> a(a1, a2, a3, a4, a5);
  145. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  146. }
  147. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  148. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  149. 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)
  150. {
  151. list5<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &> a(a1, a2, a3, a4, a5);
  152. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  153. }
  154. 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
  155. {
  156. list5<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &> a(a1, a2, a3, a4, a5);
  157. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  158. }
  159. #endif
  160. 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)
  161. {
  162. list6<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &> a(a1, a2, a3, a4, a5, a6);
  163. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  164. }
  165. 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
  166. {
  167. list6<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &> a(a1, a2, a3, a4, a5, a6);
  168. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  169. }
  170. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  171. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  172. 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)
  173. {
  174. list6<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &> a(a1, a2, a3, a4, a5, a6);
  175. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  176. }
  177. 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
  178. {
  179. list6<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &> a(a1, a2, a3, a4, a5, a6);
  180. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  181. }
  182. #endif
  183. 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)
  184. {
  185. list7<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &> a(a1, a2, a3, a4, a5, a6, a7);
  186. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  187. }
  188. 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
  189. {
  190. list7<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &> a(a1, a2, a3, a4, a5, a6, a7);
  191. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  192. }
  193. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  194. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  195. 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)
  196. {
  197. list7<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &> a(a1, a2, a3, a4, a5, a6, a7);
  198. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  199. }
  200. 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
  201. {
  202. list7<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &> a(a1, a2, a3, a4, a5, a6, a7);
  203. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  204. }
  205. #endif
  206. 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)
  207. {
  208. list8<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &> a(a1, a2, a3, a4, a5, a6, a7, a8);
  209. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  210. }
  211. 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
  212. {
  213. list8<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &> a(a1, a2, a3, a4, a5, a6, a7, a8);
  214. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  215. }
  216. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  217. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  218. 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)
  219. {
  220. list8<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &> a(a1, a2, a3, a4, a5, a6, a7, a8);
  221. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  222. }
  223. 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
  224. {
  225. list8<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &> a(a1, a2, a3, a4, a5, a6, a7, a8);
  226. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  227. }
  228. #endif
  229. 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)
  230. {
  231. list9<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &, A9 &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  232. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  233. }
  234. 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
  235. {
  236. list9<A1 &, A2 &, A3 &, A4 &, A5 &, A6 &, A7 &, A8 &, A9 &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  237. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  238. }
  239. #if !defined(BOOST_NO_FUNCTION_TEMPLATE_ORDERING) \
  240. && !BOOST_WORKAROUND(__EDG_VERSION__, <= 238)
  241. 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)
  242. {
  243. list9<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &, A9 const &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  244. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  245. }
  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) const
  247. {
  248. list9<A1 const &, A2 const &, A3 const &, A4 const &, A5 const &, A6 const &, A7 const &, A8 const &, A9 const &> a(a1, a2, a3, a4, a5, a6, a7, a8, a9);
  249. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  250. }
  251. #endif
  252. template<class A> result_type eval(A & a)
  253. {
  254. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  255. }
  256. template<class A> result_type eval(A & a) const
  257. {
  258. BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
  259. }
  260. template<class V> void accept(V & v) const
  261. {
  262. #if !defined( BOOST_NO_ARGUMENT_DEPENDENT_LOOKUP ) && !defined( BOOST_BORLANDC )
  263. using boost::visit_each;
  264. #endif
  265. BOOST_BIND_VISIT_EACH(v, f_, 0);
  266. l_.accept(v);
  267. }
  268. bool compare(this_type const & rhs) const
  269. {
  270. return ref_compare(f_, rhs.f_, 0) && l_ == rhs.l_;
  271. }
  272. private:
  273. F f_;
  274. L l_;