default_eval.hpp 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. ///////////////////////////////////////////////////////////////////////////////
  2. /// \file default_eval.hpp
  3. /// Contains specializations of the default_eval\<\> class template.
  4. //
  5. // Copyright 2008 Eric Niebler. Distributed under the Boost
  6. // Software License, Version 1.0. (See accompanying file
  7. // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  8. template<typename Expr, typename Context>
  9. struct default_eval<Expr, Context, proto::tag::function, 3>
  10. {
  11. typedef
  12. typename proto::detail::result_of_fixup<
  13. typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 0>::type >::type , Context >::type
  14. >::type
  15. function_type;
  16. typedef
  17. typename BOOST_PROTO_RESULT_OF<
  18. function_type(typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 1>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 2>::type >::type , Context >::type)
  19. >::type
  20. result_type;
  21. result_type operator ()(Expr &expr, Context &context) const
  22. {
  23. return this->invoke(expr, context, is_member_function_pointer<function_type>());
  24. }
  25. private:
  26. result_type invoke(Expr &expr, Context &context, mpl::false_) const
  27. {
  28. return proto::eval(proto::child_c< 0>( expr), context)(
  29. proto::eval(proto::child_c< 1>( expr), context) , proto::eval(proto::child_c< 2>( expr), context)
  30. );
  31. }
  32. result_type invoke(Expr &expr, Context &context, mpl::true_) const
  33. {
  34. BOOST_PROTO_USE_GET_POINTER();
  35. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  36. return (
  37. BOOST_PROTO_GET_POINTER(class_type, (proto::eval(proto::child_c< 1>( expr), context))) ->*
  38. proto::eval(proto::child_c< 0>( expr), context)
  39. )(proto::eval(proto::child_c< 2>( expr), context));
  40. }
  41. };
  42. template<typename Expr, typename Context>
  43. struct default_eval<Expr, Context, proto::tag::function, 4>
  44. {
  45. typedef
  46. typename proto::detail::result_of_fixup<
  47. typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 0>::type >::type , Context >::type
  48. >::type
  49. function_type;
  50. typedef
  51. typename BOOST_PROTO_RESULT_OF<
  52. function_type(typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 1>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 2>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 3>::type >::type , Context >::type)
  53. >::type
  54. result_type;
  55. result_type operator ()(Expr &expr, Context &context) const
  56. {
  57. return this->invoke(expr, context, is_member_function_pointer<function_type>());
  58. }
  59. private:
  60. result_type invoke(Expr &expr, Context &context, mpl::false_) const
  61. {
  62. return proto::eval(proto::child_c< 0>( expr), context)(
  63. proto::eval(proto::child_c< 1>( expr), context) , proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context)
  64. );
  65. }
  66. result_type invoke(Expr &expr, Context &context, mpl::true_) const
  67. {
  68. BOOST_PROTO_USE_GET_POINTER();
  69. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  70. return (
  71. BOOST_PROTO_GET_POINTER(class_type, (proto::eval(proto::child_c< 1>( expr), context))) ->*
  72. proto::eval(proto::child_c< 0>( expr), context)
  73. )(proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context));
  74. }
  75. };
  76. template<typename Expr, typename Context>
  77. struct default_eval<Expr, Context, proto::tag::function, 5>
  78. {
  79. typedef
  80. typename proto::detail::result_of_fixup<
  81. typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 0>::type >::type , Context >::type
  82. >::type
  83. function_type;
  84. typedef
  85. typename BOOST_PROTO_RESULT_OF<
  86. function_type(typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 1>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 2>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 3>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 4>::type >::type , Context >::type)
  87. >::type
  88. result_type;
  89. result_type operator ()(Expr &expr, Context &context) const
  90. {
  91. return this->invoke(expr, context, is_member_function_pointer<function_type>());
  92. }
  93. private:
  94. result_type invoke(Expr &expr, Context &context, mpl::false_) const
  95. {
  96. return proto::eval(proto::child_c< 0>( expr), context)(
  97. proto::eval(proto::child_c< 1>( expr), context) , proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context) , proto::eval(proto::child_c< 4>( expr), context)
  98. );
  99. }
  100. result_type invoke(Expr &expr, Context &context, mpl::true_) const
  101. {
  102. BOOST_PROTO_USE_GET_POINTER();
  103. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  104. return (
  105. BOOST_PROTO_GET_POINTER(class_type, (proto::eval(proto::child_c< 1>( expr), context))) ->*
  106. proto::eval(proto::child_c< 0>( expr), context)
  107. )(proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context) , proto::eval(proto::child_c< 4>( expr), context));
  108. }
  109. };
  110. template<typename Expr, typename Context>
  111. struct default_eval<Expr, Context, proto::tag::function, 6>
  112. {
  113. typedef
  114. typename proto::detail::result_of_fixup<
  115. typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 0>::type >::type , Context >::type
  116. >::type
  117. function_type;
  118. typedef
  119. typename BOOST_PROTO_RESULT_OF<
  120. function_type(typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 1>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 2>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 3>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 4>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 5>::type >::type , Context >::type)
  121. >::type
  122. result_type;
  123. result_type operator ()(Expr &expr, Context &context) const
  124. {
  125. return this->invoke(expr, context, is_member_function_pointer<function_type>());
  126. }
  127. private:
  128. result_type invoke(Expr &expr, Context &context, mpl::false_) const
  129. {
  130. return proto::eval(proto::child_c< 0>( expr), context)(
  131. proto::eval(proto::child_c< 1>( expr), context) , proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context) , proto::eval(proto::child_c< 4>( expr), context) , proto::eval(proto::child_c< 5>( expr), context)
  132. );
  133. }
  134. result_type invoke(Expr &expr, Context &context, mpl::true_) const
  135. {
  136. BOOST_PROTO_USE_GET_POINTER();
  137. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  138. return (
  139. BOOST_PROTO_GET_POINTER(class_type, (proto::eval(proto::child_c< 1>( expr), context))) ->*
  140. proto::eval(proto::child_c< 0>( expr), context)
  141. )(proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context) , proto::eval(proto::child_c< 4>( expr), context) , proto::eval(proto::child_c< 5>( expr), context));
  142. }
  143. };
  144. template<typename Expr, typename Context>
  145. struct default_eval<Expr, Context, proto::tag::function, 7>
  146. {
  147. typedef
  148. typename proto::detail::result_of_fixup<
  149. typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 0>::type >::type , Context >::type
  150. >::type
  151. function_type;
  152. typedef
  153. typename BOOST_PROTO_RESULT_OF<
  154. function_type(typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 1>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 2>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 3>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 4>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 5>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 6>::type >::type , Context >::type)
  155. >::type
  156. result_type;
  157. result_type operator ()(Expr &expr, Context &context) const
  158. {
  159. return this->invoke(expr, context, is_member_function_pointer<function_type>());
  160. }
  161. private:
  162. result_type invoke(Expr &expr, Context &context, mpl::false_) const
  163. {
  164. return proto::eval(proto::child_c< 0>( expr), context)(
  165. proto::eval(proto::child_c< 1>( expr), context) , proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context) , proto::eval(proto::child_c< 4>( expr), context) , proto::eval(proto::child_c< 5>( expr), context) , proto::eval(proto::child_c< 6>( expr), context)
  166. );
  167. }
  168. result_type invoke(Expr &expr, Context &context, mpl::true_) const
  169. {
  170. BOOST_PROTO_USE_GET_POINTER();
  171. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  172. return (
  173. BOOST_PROTO_GET_POINTER(class_type, (proto::eval(proto::child_c< 1>( expr), context))) ->*
  174. proto::eval(proto::child_c< 0>( expr), context)
  175. )(proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context) , proto::eval(proto::child_c< 4>( expr), context) , proto::eval(proto::child_c< 5>( expr), context) , proto::eval(proto::child_c< 6>( expr), context));
  176. }
  177. };
  178. template<typename Expr, typename Context>
  179. struct default_eval<Expr, Context, proto::tag::function, 8>
  180. {
  181. typedef
  182. typename proto::detail::result_of_fixup<
  183. typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 0>::type >::type , Context >::type
  184. >::type
  185. function_type;
  186. typedef
  187. typename BOOST_PROTO_RESULT_OF<
  188. function_type(typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 1>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 2>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 3>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 4>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 5>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 6>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 7>::type >::type , Context >::type)
  189. >::type
  190. result_type;
  191. result_type operator ()(Expr &expr, Context &context) const
  192. {
  193. return this->invoke(expr, context, is_member_function_pointer<function_type>());
  194. }
  195. private:
  196. result_type invoke(Expr &expr, Context &context, mpl::false_) const
  197. {
  198. return proto::eval(proto::child_c< 0>( expr), context)(
  199. proto::eval(proto::child_c< 1>( expr), context) , proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context) , proto::eval(proto::child_c< 4>( expr), context) , proto::eval(proto::child_c< 5>( expr), context) , proto::eval(proto::child_c< 6>( expr), context) , proto::eval(proto::child_c< 7>( expr), context)
  200. );
  201. }
  202. result_type invoke(Expr &expr, Context &context, mpl::true_) const
  203. {
  204. BOOST_PROTO_USE_GET_POINTER();
  205. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  206. return (
  207. BOOST_PROTO_GET_POINTER(class_type, (proto::eval(proto::child_c< 1>( expr), context))) ->*
  208. proto::eval(proto::child_c< 0>( expr), context)
  209. )(proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context) , proto::eval(proto::child_c< 4>( expr), context) , proto::eval(proto::child_c< 5>( expr), context) , proto::eval(proto::child_c< 6>( expr), context) , proto::eval(proto::child_c< 7>( expr), context));
  210. }
  211. };
  212. template<typename Expr, typename Context>
  213. struct default_eval<Expr, Context, proto::tag::function, 9>
  214. {
  215. typedef
  216. typename proto::detail::result_of_fixup<
  217. typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 0>::type >::type , Context >::type
  218. >::type
  219. function_type;
  220. typedef
  221. typename BOOST_PROTO_RESULT_OF<
  222. function_type(typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 1>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 2>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 3>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 4>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 5>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 6>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 7>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 8>::type >::type , Context >::type)
  223. >::type
  224. result_type;
  225. result_type operator ()(Expr &expr, Context &context) const
  226. {
  227. return this->invoke(expr, context, is_member_function_pointer<function_type>());
  228. }
  229. private:
  230. result_type invoke(Expr &expr, Context &context, mpl::false_) const
  231. {
  232. return proto::eval(proto::child_c< 0>( expr), context)(
  233. proto::eval(proto::child_c< 1>( expr), context) , proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context) , proto::eval(proto::child_c< 4>( expr), context) , proto::eval(proto::child_c< 5>( expr), context) , proto::eval(proto::child_c< 6>( expr), context) , proto::eval(proto::child_c< 7>( expr), context) , proto::eval(proto::child_c< 8>( expr), context)
  234. );
  235. }
  236. result_type invoke(Expr &expr, Context &context, mpl::true_) const
  237. {
  238. BOOST_PROTO_USE_GET_POINTER();
  239. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  240. return (
  241. BOOST_PROTO_GET_POINTER(class_type, (proto::eval(proto::child_c< 1>( expr), context))) ->*
  242. proto::eval(proto::child_c< 0>( expr), context)
  243. )(proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context) , proto::eval(proto::child_c< 4>( expr), context) , proto::eval(proto::child_c< 5>( expr), context) , proto::eval(proto::child_c< 6>( expr), context) , proto::eval(proto::child_c< 7>( expr), context) , proto::eval(proto::child_c< 8>( expr), context));
  244. }
  245. };
  246. template<typename Expr, typename Context>
  247. struct default_eval<Expr, Context, proto::tag::function, 10>
  248. {
  249. typedef
  250. typename proto::detail::result_of_fixup<
  251. typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 0>::type >::type , Context >::type
  252. >::type
  253. function_type;
  254. typedef
  255. typename BOOST_PROTO_RESULT_OF<
  256. function_type(typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 1>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 2>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 3>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 4>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 5>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 6>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 7>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 8>::type >::type , Context >::type , typename proto::result_of::eval< typename remove_reference< typename proto::result_of::child_c< Expr, 9>::type >::type , Context >::type)
  257. >::type
  258. result_type;
  259. result_type operator ()(Expr &expr, Context &context) const
  260. {
  261. return this->invoke(expr, context, is_member_function_pointer<function_type>());
  262. }
  263. private:
  264. result_type invoke(Expr &expr, Context &context, mpl::false_) const
  265. {
  266. return proto::eval(proto::child_c< 0>( expr), context)(
  267. proto::eval(proto::child_c< 1>( expr), context) , proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context) , proto::eval(proto::child_c< 4>( expr), context) , proto::eval(proto::child_c< 5>( expr), context) , proto::eval(proto::child_c< 6>( expr), context) , proto::eval(proto::child_c< 7>( expr), context) , proto::eval(proto::child_c< 8>( expr), context) , proto::eval(proto::child_c< 9>( expr), context)
  268. );
  269. }
  270. result_type invoke(Expr &expr, Context &context, mpl::true_) const
  271. {
  272. BOOST_PROTO_USE_GET_POINTER();
  273. typedef typename detail::class_member_traits<function_type>::class_type class_type;
  274. return (
  275. BOOST_PROTO_GET_POINTER(class_type, (proto::eval(proto::child_c< 1>( expr), context))) ->*
  276. proto::eval(proto::child_c< 0>( expr), context)
  277. )(proto::eval(proto::child_c< 2>( expr), context) , proto::eval(proto::child_c< 3>( expr), context) , proto::eval(proto::child_c< 4>( expr), context) , proto::eval(proto::child_c< 5>( expr), context) , proto::eval(proto::child_c< 6>( expr), context) , proto::eval(proto::child_c< 7>( expr), context) , proto::eval(proto::child_c< 8>( expr), context) , proto::eval(proto::child_c< 9>( expr), context));
  278. }
  279. };