1 ///////////////////////////////////////////////////////////////////////////////
2 /// \file default_eval.hpp
3 /// Contains specializations of the default_eval\<\> class template.
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>
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
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)
21 result_type operator ()(Expr &expr, Context &context) const
23 return this->invoke(expr, context, is_member_function_pointer<function_type>());
26 result_type invoke(Expr &expr, Context &context, mpl::false_) const
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)
32 result_type invoke(Expr &expr, Context &context, mpl::true_) const
34 BOOST_PROTO_USE_GET_POINTER();
35 typedef typename detail::class_member_traits<function_type>::class_type class_type;
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));
42 template<typename Expr, typename Context>
43 struct default_eval<Expr, Context, proto::tag::function, 4>
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
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)
55 result_type operator ()(Expr &expr, Context &context) const
57 return this->invoke(expr, context, is_member_function_pointer<function_type>());
60 result_type invoke(Expr &expr, Context &context, mpl::false_) const
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)
66 result_type invoke(Expr &expr, Context &context, mpl::true_) const
68 BOOST_PROTO_USE_GET_POINTER();
69 typedef typename detail::class_member_traits<function_type>::class_type class_type;
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));
76 template<typename Expr, typename Context>
77 struct default_eval<Expr, Context, proto::tag::function, 5>
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
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)
89 result_type operator ()(Expr &expr, Context &context) const
91 return this->invoke(expr, context, is_member_function_pointer<function_type>());
94 result_type invoke(Expr &expr, Context &context, mpl::false_) const
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)
100 result_type invoke(Expr &expr, Context &context, mpl::true_) const
102 BOOST_PROTO_USE_GET_POINTER();
103 typedef typename detail::class_member_traits<function_type>::class_type class_type;
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));
110 template<typename Expr, typename Context>
111 struct default_eval<Expr, Context, proto::tag::function, 6>
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
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)
123 result_type operator ()(Expr &expr, Context &context) const
125 return this->invoke(expr, context, is_member_function_pointer<function_type>());
128 result_type invoke(Expr &expr, Context &context, mpl::false_) const
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)
134 result_type invoke(Expr &expr, Context &context, mpl::true_) const
136 BOOST_PROTO_USE_GET_POINTER();
137 typedef typename detail::class_member_traits<function_type>::class_type class_type;
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));
144 template<typename Expr, typename Context>
145 struct default_eval<Expr, Context, proto::tag::function, 7>
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
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)
157 result_type operator ()(Expr &expr, Context &context) const
159 return this->invoke(expr, context, is_member_function_pointer<function_type>());
162 result_type invoke(Expr &expr, Context &context, mpl::false_) const
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)
168 result_type invoke(Expr &expr, Context &context, mpl::true_) const
170 BOOST_PROTO_USE_GET_POINTER();
171 typedef typename detail::class_member_traits<function_type>::class_type class_type;
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));
178 template<typename Expr, typename Context>
179 struct default_eval<Expr, Context, proto::tag::function, 8>
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
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)
191 result_type operator ()(Expr &expr, Context &context) const
193 return this->invoke(expr, context, is_member_function_pointer<function_type>());
196 result_type invoke(Expr &expr, Context &context, mpl::false_) const
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)
202 result_type invoke(Expr &expr, Context &context, mpl::true_) const
204 BOOST_PROTO_USE_GET_POINTER();
205 typedef typename detail::class_member_traits<function_type>::class_type class_type;
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));
212 template<typename Expr, typename Context>
213 struct default_eval<Expr, Context, proto::tag::function, 9>
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
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)
225 result_type operator ()(Expr &expr, Context &context) const
227 return this->invoke(expr, context, is_member_function_pointer<function_type>());
230 result_type invoke(Expr &expr, Context &context, mpl::false_) const
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)
236 result_type invoke(Expr &expr, Context &context, mpl::true_) const
238 BOOST_PROTO_USE_GET_POINTER();
239 typedef typename detail::class_member_traits<function_type>::class_type class_type;
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));
246 template<typename Expr, typename Context>
247 struct default_eval<Expr, Context, proto::tag::function, 10>
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
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)
259 result_type operator ()(Expr &expr, Context &context) const
261 return this->invoke(expr, context, is_member_function_pointer<function_type>());
264 result_type invoke(Expr &expr, Context &context, mpl::false_) const
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)
270 result_type invoke(Expr &expr, Context &context, mpl::true_) const
272 BOOST_PROTO_USE_GET_POINTER();
273 typedef typename detail::class_member_traits<function_type>::class_type class_type;
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));