1 ///////////////////////////////////////////////////////////////////////////////
2 /// \file expr_variadic.hpp
3 /// Contains definition of expr\<\> 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)
36 template<typename Tag, typename Arg0>
37 struct expr<Tag, term<Arg0>, 0>
39 typedef Tag proto_tag;
40 static const long proto_arity_c = 0;
41 typedef mpl::long_<0 > proto_arity;
42 typedef expr proto_base_expr;
43 typedef term<Arg0> proto_args;
44 typedef basic_expr<Tag, proto_args, 0 > proto_grammar;
45 typedef default_domain proto_domain;
46 typedef default_generator proto_generator;
47 typedef proto::tag::proto_expr<Tag, proto_domain> fusion_tag;
48 typedef expr proto_derived_expr;
49 typedef void proto_is_expr_;
50 typedef Arg0 proto_child0; proto_child0 child0;
51 typedef void proto_child1; typedef void proto_child2; typedef void proto_child3; typedef void proto_child4; typedef void proto_child5; typedef void proto_child6; typedef void proto_child7; typedef void proto_child8; typedef void proto_child9;
55 expr const &proto_base() const
71 static expr const make(A0 &a0)
73 return detail::make_terminal(a0, static_cast<expr *>(0), static_cast<proto_args *>(0));
79 static expr const make(A0 const &a0)
81 return detail::make_terminal(a0, static_cast<expr *>(0), static_cast<proto_args *>(0));
85 typedef detail::not_a_valid_type address_of_hack_type_;
93 , list2<expr &, expr const &>
96 operator =(expr const &a)
100 , list2<expr &, expr const &>
113 , list2<expr const &, typename result_of::as_child<A>::type>
116 operator =(A &a) const
120 , list2<expr const &, typename result_of::as_child<A>::type>
122 > that = {*this, proto::as_child(a)};
131 , list2<expr const &, typename result_of::as_child<A const>::type>
134 operator =(A const &a) const
138 , list2<expr const &, typename result_of::as_child<A const>::type>
140 > that = {*this, proto::as_child(a)};
149 , list2<expr &, typename result_of::as_child<A>::type>
156 , list2<expr &, typename result_of::as_child<A>::type>
158 > that = {*this, proto::as_child(a)};
167 , list2<expr &, typename result_of::as_child<A const>::type>
170 operator =(A const &a)
174 , list2<expr &, typename result_of::as_child<A const>::type>
176 > that = {*this, proto::as_child(a)};
186 proto::tag::subscript
187 , list2<expr const &, typename result_of::as_child<A>::type>
190 operator [](A &a) const
193 proto::tag::subscript
194 , list2<expr const &, typename result_of::as_child<A>::type>
196 > that = {*this, proto::as_child(a)};
204 proto::tag::subscript
205 , list2<expr const &, typename result_of::as_child<A const>::type>
208 operator [](A const &a) const
211 proto::tag::subscript
212 , list2<expr const &, typename result_of::as_child<A const>::type>
214 > that = {*this, proto::as_child(a)};
222 proto::tag::subscript
223 , list2<expr &, typename result_of::as_child<A>::type>
229 proto::tag::subscript
230 , list2<expr &, typename result_of::as_child<A>::type>
232 > that = {*this, proto::as_child(a)};
240 proto::tag::subscript
241 , list2<expr &, typename result_of::as_child<A const>::type>
244 operator [](A const &a)
247 proto::tag::subscript
248 , list2<expr &, typename result_of::as_child<A const>::type>
250 > that = {*this, proto::as_child(a)};
255 template<typename Sig>
258 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
262 template<typename ...A>
264 typename result_of::funop<
265 expr const(A const &...)
269 operator ()(A const &... a) const
271 return result_of::funop<
272 expr const(A const &...)
275 >::call(*this, a...);
279 template<typename ...A>
281 typename result_of::funop<
286 operator ()(A const &... a)
288 return result_of::funop<
292 >::call(*this, a...);
322 template<typename Tag , typename Arg0>
323 struct expr<Tag, list1<Arg0>, 1 >
325 typedef Tag proto_tag;
326 static const long proto_arity_c = 1;
327 typedef mpl::long_<1 > proto_arity;
328 typedef expr proto_base_expr;
329 typedef list1<Arg0> proto_args;
330 typedef basic_expr<Tag, proto_args, 1 > proto_grammar;
331 typedef default_domain proto_domain;
332 typedef default_generator proto_generator;
333 typedef proto::tag::proto_expr<Tag, proto_domain> fusion_tag;
334 typedef expr proto_derived_expr;
335 typedef void proto_is_expr_;
336 typedef Arg0 proto_child0; proto_child0 child0;
337 typedef void proto_child1; typedef void proto_child2; typedef void proto_child3; typedef void proto_child4; typedef void proto_child5; typedef void proto_child6; typedef void proto_child7; typedef void proto_child8; typedef void proto_child9;
341 expr const &proto_base() const
355 template<typename A0>
357 static expr const make(A0 const &a0)
365 typedef typename detail::address_of_hack<Tag, proto_child0>::type address_of_hack_type_;
374 operator address_of_hack_type_() const
376 return boost::addressof(this->child0);
385 , list2<expr &, expr const &>
388 operator =(expr const &a)
392 , list2<expr &, expr const &>
405 , list2<expr const &, typename result_of::as_child<A>::type>
408 operator =(A &a) const
412 , list2<expr const &, typename result_of::as_child<A>::type>
414 > that = {*this, proto::as_child(a)};
423 , list2<expr const &, typename result_of::as_child<A const>::type>
426 operator =(A const &a) const
430 , list2<expr const &, typename result_of::as_child<A const>::type>
432 > that = {*this, proto::as_child(a)};
442 proto::tag::subscript
443 , list2<expr const &, typename result_of::as_child<A>::type>
446 operator [](A &a) const
449 proto::tag::subscript
450 , list2<expr const &, typename result_of::as_child<A>::type>
452 > that = {*this, proto::as_child(a)};
460 proto::tag::subscript
461 , list2<expr const &, typename result_of::as_child<A const>::type>
464 operator [](A const &a) const
467 proto::tag::subscript
468 , list2<expr const &, typename result_of::as_child<A const>::type>
470 > that = {*this, proto::as_child(a)};
475 template<typename Sig>
478 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
482 template<typename ...A>
484 typename result_of::funop<
485 expr const(A const &...)
489 operator ()(A const &... a) const
491 return result_of::funop<
492 expr const(A const &...)
495 >::call(*this, a...);
525 template<typename Tag , typename Arg0 , typename Arg1>
526 struct expr<Tag, list2<Arg0 , Arg1>, 2 >
528 typedef Tag proto_tag;
529 static const long proto_arity_c = 2;
530 typedef mpl::long_<2 > proto_arity;
531 typedef expr proto_base_expr;
532 typedef list2<Arg0 , Arg1> proto_args;
533 typedef basic_expr<Tag, proto_args, 2 > proto_grammar;
534 typedef default_domain proto_domain;
535 typedef default_generator proto_generator;
536 typedef proto::tag::proto_expr<Tag, proto_domain> fusion_tag;
537 typedef expr proto_derived_expr;
538 typedef void proto_is_expr_;
539 typedef Arg0 proto_child0; proto_child0 child0; typedef Arg1 proto_child1; proto_child1 child1;
540 typedef void proto_child2; typedef void proto_child3; typedef void proto_child4; typedef void proto_child5; typedef void proto_child6; typedef void proto_child7; typedef void proto_child8; typedef void proto_child9;
544 expr const &proto_base() const
558 template<typename A0 , typename A1>
560 static expr const make(A0 const &a0 , A1 const &a1)
562 expr that = {a0 , a1};
567 typedef detail::not_a_valid_type address_of_hack_type_;
575 , list2<expr &, expr const &>
578 operator =(expr const &a)
582 , list2<expr &, expr const &>
595 , list2<expr const &, typename result_of::as_child<A>::type>
598 operator =(A &a) const
602 , list2<expr const &, typename result_of::as_child<A>::type>
604 > that = {*this, proto::as_child(a)};
613 , list2<expr const &, typename result_of::as_child<A const>::type>
616 operator =(A const &a) const
620 , list2<expr const &, typename result_of::as_child<A const>::type>
622 > that = {*this, proto::as_child(a)};
632 proto::tag::subscript
633 , list2<expr const &, typename result_of::as_child<A>::type>
636 operator [](A &a) const
639 proto::tag::subscript
640 , list2<expr const &, typename result_of::as_child<A>::type>
642 > that = {*this, proto::as_child(a)};
650 proto::tag::subscript
651 , list2<expr const &, typename result_of::as_child<A const>::type>
654 operator [](A const &a) const
657 proto::tag::subscript
658 , list2<expr const &, typename result_of::as_child<A const>::type>
660 > that = {*this, proto::as_child(a)};
665 template<typename Sig>
668 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
672 template<typename ...A>
674 typename result_of::funop<
675 expr const(A const &...)
679 operator ()(A const &... a) const
681 return result_of::funop<
682 expr const(A const &...)
685 >::call(*this, a...);
715 template<typename Tag , typename Arg0 , typename Arg1 , typename Arg2>
716 struct expr<Tag, list3<Arg0 , Arg1 , Arg2>, 3 >
718 typedef Tag proto_tag;
719 static const long proto_arity_c = 3;
720 typedef mpl::long_<3 > proto_arity;
721 typedef expr proto_base_expr;
722 typedef list3<Arg0 , Arg1 , Arg2> proto_args;
723 typedef basic_expr<Tag, proto_args, 3 > proto_grammar;
724 typedef default_domain proto_domain;
725 typedef default_generator proto_generator;
726 typedef proto::tag::proto_expr<Tag, proto_domain> fusion_tag;
727 typedef expr proto_derived_expr;
728 typedef void proto_is_expr_;
729 typedef Arg0 proto_child0; proto_child0 child0; typedef Arg1 proto_child1; proto_child1 child1; typedef Arg2 proto_child2; proto_child2 child2;
730 typedef void proto_child3; typedef void proto_child4; typedef void proto_child5; typedef void proto_child6; typedef void proto_child7; typedef void proto_child8; typedef void proto_child9;
734 expr const &proto_base() const
748 template<typename A0 , typename A1 , typename A2>
750 static expr const make(A0 const &a0 , A1 const &a1 , A2 const &a2)
752 expr that = {a0 , a1 , a2};
757 typedef detail::not_a_valid_type address_of_hack_type_;
765 , list2<expr &, expr const &>
768 operator =(expr const &a)
772 , list2<expr &, expr const &>
785 , list2<expr const &, typename result_of::as_child<A>::type>
788 operator =(A &a) const
792 , list2<expr const &, typename result_of::as_child<A>::type>
794 > that = {*this, proto::as_child(a)};
803 , list2<expr const &, typename result_of::as_child<A const>::type>
806 operator =(A const &a) const
810 , list2<expr const &, typename result_of::as_child<A const>::type>
812 > that = {*this, proto::as_child(a)};
822 proto::tag::subscript
823 , list2<expr const &, typename result_of::as_child<A>::type>
826 operator [](A &a) const
829 proto::tag::subscript
830 , list2<expr const &, typename result_of::as_child<A>::type>
832 > that = {*this, proto::as_child(a)};
840 proto::tag::subscript
841 , list2<expr const &, typename result_of::as_child<A const>::type>
844 operator [](A const &a) const
847 proto::tag::subscript
848 , list2<expr const &, typename result_of::as_child<A const>::type>
850 > that = {*this, proto::as_child(a)};
855 template<typename Sig>
858 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
862 template<typename ...A>
864 typename result_of::funop<
865 expr const(A const &...)
869 operator ()(A const &... a) const
871 return result_of::funop<
872 expr const(A const &...)
875 >::call(*this, a...);
905 template<typename Tag , typename Arg0 , typename Arg1 , typename Arg2 , typename Arg3>
906 struct expr<Tag, list4<Arg0 , Arg1 , Arg2 , Arg3>, 4 >
908 typedef Tag proto_tag;
909 static const long proto_arity_c = 4;
910 typedef mpl::long_<4 > proto_arity;
911 typedef expr proto_base_expr;
912 typedef list4<Arg0 , Arg1 , Arg2 , Arg3> proto_args;
913 typedef basic_expr<Tag, proto_args, 4 > proto_grammar;
914 typedef default_domain proto_domain;
915 typedef default_generator proto_generator;
916 typedef proto::tag::proto_expr<Tag, proto_domain> fusion_tag;
917 typedef expr proto_derived_expr;
918 typedef void proto_is_expr_;
919 typedef Arg0 proto_child0; proto_child0 child0; typedef Arg1 proto_child1; proto_child1 child1; typedef Arg2 proto_child2; proto_child2 child2; typedef Arg3 proto_child3; proto_child3 child3;
920 typedef void proto_child4; typedef void proto_child5; typedef void proto_child6; typedef void proto_child7; typedef void proto_child8; typedef void proto_child9;
924 expr const &proto_base() const
938 template<typename A0 , typename A1 , typename A2 , typename A3>
940 static expr const make(A0 const &a0 , A1 const &a1 , A2 const &a2 , A3 const &a3)
942 expr that = {a0 , a1 , a2 , a3};
947 typedef detail::not_a_valid_type address_of_hack_type_;
955 , list2<expr &, expr const &>
958 operator =(expr const &a)
962 , list2<expr &, expr const &>
975 , list2<expr const &, typename result_of::as_child<A>::type>
978 operator =(A &a) const
982 , list2<expr const &, typename result_of::as_child<A>::type>
984 > that = {*this, proto::as_child(a)};
993 , list2<expr const &, typename result_of::as_child<A const>::type>
996 operator =(A const &a) const
1000 , list2<expr const &, typename result_of::as_child<A const>::type>
1002 > that = {*this, proto::as_child(a)};
1009 template<typename A>
1012 proto::tag::subscript
1013 , list2<expr const &, typename result_of::as_child<A>::type>
1016 operator [](A &a) const
1019 proto::tag::subscript
1020 , list2<expr const &, typename result_of::as_child<A>::type>
1022 > that = {*this, proto::as_child(a)};
1027 template<typename A>
1030 proto::tag::subscript
1031 , list2<expr const &, typename result_of::as_child<A const>::type>
1034 operator [](A const &a) const
1037 proto::tag::subscript
1038 , list2<expr const &, typename result_of::as_child<A const>::type>
1040 > that = {*this, proto::as_child(a)};
1045 template<typename Sig>
1048 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
1052 template<typename ...A>
1054 typename result_of::funop<
1055 expr const(A const &...)
1059 operator ()(A const &... a) const
1061 return result_of::funop<
1062 expr const(A const &...)
1065 >::call(*this, a...);
1095 template<typename Tag , typename Arg0 , typename Arg1 , typename Arg2 , typename Arg3 , typename Arg4>
1096 struct expr<Tag, list5<Arg0 , Arg1 , Arg2 , Arg3 , Arg4>, 5 >
1098 typedef Tag proto_tag;
1099 static const long proto_arity_c = 5;
1100 typedef mpl::long_<5 > proto_arity;
1101 typedef expr proto_base_expr;
1102 typedef list5<Arg0 , Arg1 , Arg2 , Arg3 , Arg4> proto_args;
1103 typedef basic_expr<Tag, proto_args, 5 > proto_grammar;
1104 typedef default_domain proto_domain;
1105 typedef default_generator proto_generator;
1106 typedef proto::tag::proto_expr<Tag, proto_domain> fusion_tag;
1107 typedef expr proto_derived_expr;
1108 typedef void proto_is_expr_;
1109 typedef Arg0 proto_child0; proto_child0 child0; typedef Arg1 proto_child1; proto_child1 child1; typedef Arg2 proto_child2; proto_child2 child2; typedef Arg3 proto_child3; proto_child3 child3; typedef Arg4 proto_child4; proto_child4 child4;
1110 typedef void proto_child5; typedef void proto_child6; typedef void proto_child7; typedef void proto_child8; typedef void proto_child9;
1114 expr const &proto_base() const
1128 template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
1130 static expr const make(A0 const &a0 , A1 const &a1 , A2 const &a2 , A3 const &a3 , A4 const &a4)
1132 expr that = {a0 , a1 , a2 , a3 , a4};
1137 typedef detail::not_a_valid_type address_of_hack_type_;
1145 , list2<expr &, expr const &>
1148 operator =(expr const &a)
1152 , list2<expr &, expr const &>
1154 > that = {*this, a};
1161 template<typename A>
1165 , list2<expr const &, typename result_of::as_child<A>::type>
1168 operator =(A &a) const
1172 , list2<expr const &, typename result_of::as_child<A>::type>
1174 > that = {*this, proto::as_child(a)};
1179 template<typename A>
1183 , list2<expr const &, typename result_of::as_child<A const>::type>
1186 operator =(A const &a) const
1190 , list2<expr const &, typename result_of::as_child<A const>::type>
1192 > that = {*this, proto::as_child(a)};
1199 template<typename A>
1202 proto::tag::subscript
1203 , list2<expr const &, typename result_of::as_child<A>::type>
1206 operator [](A &a) const
1209 proto::tag::subscript
1210 , list2<expr const &, typename result_of::as_child<A>::type>
1212 > that = {*this, proto::as_child(a)};
1217 template<typename A>
1220 proto::tag::subscript
1221 , list2<expr const &, typename result_of::as_child<A const>::type>
1224 operator [](A const &a) const
1227 proto::tag::subscript
1228 , list2<expr const &, typename result_of::as_child<A const>::type>
1230 > that = {*this, proto::as_child(a)};
1235 template<typename Sig>
1238 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
1242 template<typename ...A>
1244 typename result_of::funop<
1245 expr const(A const &...)
1249 operator ()(A const &... a) const
1251 return result_of::funop<
1252 expr const(A const &...)
1255 >::call(*this, a...);
1285 template<typename Tag , typename Arg0 , typename Arg1 , typename Arg2 , typename Arg3 , typename Arg4 , typename Arg5>
1286 struct expr<Tag, list6<Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5>, 6 >
1288 typedef Tag proto_tag;
1289 static const long proto_arity_c = 6;
1290 typedef mpl::long_<6 > proto_arity;
1291 typedef expr proto_base_expr;
1292 typedef list6<Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5> proto_args;
1293 typedef basic_expr<Tag, proto_args, 6 > proto_grammar;
1294 typedef default_domain proto_domain;
1295 typedef default_generator proto_generator;
1296 typedef proto::tag::proto_expr<Tag, proto_domain> fusion_tag;
1297 typedef expr proto_derived_expr;
1298 typedef void proto_is_expr_;
1299 typedef Arg0 proto_child0; proto_child0 child0; typedef Arg1 proto_child1; proto_child1 child1; typedef Arg2 proto_child2; proto_child2 child2; typedef Arg3 proto_child3; proto_child3 child3; typedef Arg4 proto_child4; proto_child4 child4; typedef Arg5 proto_child5; proto_child5 child5;
1300 typedef void proto_child6; typedef void proto_child7; typedef void proto_child8; typedef void proto_child9;
1304 expr const &proto_base() const
1318 template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
1320 static expr const make(A0 const &a0 , A1 const &a1 , A2 const &a2 , A3 const &a3 , A4 const &a4 , A5 const &a5)
1322 expr that = {a0 , a1 , a2 , a3 , a4 , a5};
1327 typedef detail::not_a_valid_type address_of_hack_type_;
1335 , list2<expr &, expr const &>
1338 operator =(expr const &a)
1342 , list2<expr &, expr const &>
1344 > that = {*this, a};
1351 template<typename A>
1355 , list2<expr const &, typename result_of::as_child<A>::type>
1358 operator =(A &a) const
1362 , list2<expr const &, typename result_of::as_child<A>::type>
1364 > that = {*this, proto::as_child(a)};
1369 template<typename A>
1373 , list2<expr const &, typename result_of::as_child<A const>::type>
1376 operator =(A const &a) const
1380 , list2<expr const &, typename result_of::as_child<A const>::type>
1382 > that = {*this, proto::as_child(a)};
1389 template<typename A>
1392 proto::tag::subscript
1393 , list2<expr const &, typename result_of::as_child<A>::type>
1396 operator [](A &a) const
1399 proto::tag::subscript
1400 , list2<expr const &, typename result_of::as_child<A>::type>
1402 > that = {*this, proto::as_child(a)};
1407 template<typename A>
1410 proto::tag::subscript
1411 , list2<expr const &, typename result_of::as_child<A const>::type>
1414 operator [](A const &a) const
1417 proto::tag::subscript
1418 , list2<expr const &, typename result_of::as_child<A const>::type>
1420 > that = {*this, proto::as_child(a)};
1425 template<typename Sig>
1428 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
1432 template<typename ...A>
1434 typename result_of::funop<
1435 expr const(A const &...)
1439 operator ()(A const &... a) const
1441 return result_of::funop<
1442 expr const(A const &...)
1445 >::call(*this, a...);
1475 template<typename Tag , typename Arg0 , typename Arg1 , typename Arg2 , typename Arg3 , typename Arg4 , typename Arg5 , typename Arg6>
1476 struct expr<Tag, list7<Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6>, 7 >
1478 typedef Tag proto_tag;
1479 static const long proto_arity_c = 7;
1480 typedef mpl::long_<7 > proto_arity;
1481 typedef expr proto_base_expr;
1482 typedef list7<Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6> proto_args;
1483 typedef basic_expr<Tag, proto_args, 7 > proto_grammar;
1484 typedef default_domain proto_domain;
1485 typedef default_generator proto_generator;
1486 typedef proto::tag::proto_expr<Tag, proto_domain> fusion_tag;
1487 typedef expr proto_derived_expr;
1488 typedef void proto_is_expr_;
1489 typedef Arg0 proto_child0; proto_child0 child0; typedef Arg1 proto_child1; proto_child1 child1; typedef Arg2 proto_child2; proto_child2 child2; typedef Arg3 proto_child3; proto_child3 child3; typedef Arg4 proto_child4; proto_child4 child4; typedef Arg5 proto_child5; proto_child5 child5; typedef Arg6 proto_child6; proto_child6 child6;
1490 typedef void proto_child7; typedef void proto_child8; typedef void proto_child9;
1494 expr const &proto_base() const
1508 template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
1510 static expr const make(A0 const &a0 , A1 const &a1 , A2 const &a2 , A3 const &a3 , A4 const &a4 , A5 const &a5 , A6 const &a6)
1512 expr that = {a0 , a1 , a2 , a3 , a4 , a5 , a6};
1517 typedef detail::not_a_valid_type address_of_hack_type_;
1525 , list2<expr &, expr const &>
1528 operator =(expr const &a)
1532 , list2<expr &, expr const &>
1534 > that = {*this, a};
1541 template<typename A>
1545 , list2<expr const &, typename result_of::as_child<A>::type>
1548 operator =(A &a) const
1552 , list2<expr const &, typename result_of::as_child<A>::type>
1554 > that = {*this, proto::as_child(a)};
1559 template<typename A>
1563 , list2<expr const &, typename result_of::as_child<A const>::type>
1566 operator =(A const &a) const
1570 , list2<expr const &, typename result_of::as_child<A const>::type>
1572 > that = {*this, proto::as_child(a)};
1579 template<typename A>
1582 proto::tag::subscript
1583 , list2<expr const &, typename result_of::as_child<A>::type>
1586 operator [](A &a) const
1589 proto::tag::subscript
1590 , list2<expr const &, typename result_of::as_child<A>::type>
1592 > that = {*this, proto::as_child(a)};
1597 template<typename A>
1600 proto::tag::subscript
1601 , list2<expr const &, typename result_of::as_child<A const>::type>
1604 operator [](A const &a) const
1607 proto::tag::subscript
1608 , list2<expr const &, typename result_of::as_child<A const>::type>
1610 > that = {*this, proto::as_child(a)};
1615 template<typename Sig>
1618 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
1622 template<typename ...A>
1624 typename result_of::funop<
1625 expr const(A const &...)
1629 operator ()(A const &... a) const
1631 return result_of::funop<
1632 expr const(A const &...)
1635 >::call(*this, a...);
1665 template<typename Tag , typename Arg0 , typename Arg1 , typename Arg2 , typename Arg3 , typename Arg4 , typename Arg5 , typename Arg6 , typename Arg7>
1666 struct expr<Tag, list8<Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7>, 8 >
1668 typedef Tag proto_tag;
1669 static const long proto_arity_c = 8;
1670 typedef mpl::long_<8 > proto_arity;
1671 typedef expr proto_base_expr;
1672 typedef list8<Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7> proto_args;
1673 typedef basic_expr<Tag, proto_args, 8 > proto_grammar;
1674 typedef default_domain proto_domain;
1675 typedef default_generator proto_generator;
1676 typedef proto::tag::proto_expr<Tag, proto_domain> fusion_tag;
1677 typedef expr proto_derived_expr;
1678 typedef void proto_is_expr_;
1679 typedef Arg0 proto_child0; proto_child0 child0; typedef Arg1 proto_child1; proto_child1 child1; typedef Arg2 proto_child2; proto_child2 child2; typedef Arg3 proto_child3; proto_child3 child3; typedef Arg4 proto_child4; proto_child4 child4; typedef Arg5 proto_child5; proto_child5 child5; typedef Arg6 proto_child6; proto_child6 child6; typedef Arg7 proto_child7; proto_child7 child7;
1680 typedef void proto_child8; typedef void proto_child9;
1684 expr const &proto_base() const
1698 template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
1700 static expr const make(A0 const &a0 , A1 const &a1 , A2 const &a2 , A3 const &a3 , A4 const &a4 , A5 const &a5 , A6 const &a6 , A7 const &a7)
1702 expr that = {a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7};
1707 typedef detail::not_a_valid_type address_of_hack_type_;
1715 , list2<expr &, expr const &>
1718 operator =(expr const &a)
1722 , list2<expr &, expr const &>
1724 > that = {*this, a};
1731 template<typename A>
1735 , list2<expr const &, typename result_of::as_child<A>::type>
1738 operator =(A &a) const
1742 , list2<expr const &, typename result_of::as_child<A>::type>
1744 > that = {*this, proto::as_child(a)};
1749 template<typename A>
1753 , list2<expr const &, typename result_of::as_child<A const>::type>
1756 operator =(A const &a) const
1760 , list2<expr const &, typename result_of::as_child<A const>::type>
1762 > that = {*this, proto::as_child(a)};
1769 template<typename A>
1772 proto::tag::subscript
1773 , list2<expr const &, typename result_of::as_child<A>::type>
1776 operator [](A &a) const
1779 proto::tag::subscript
1780 , list2<expr const &, typename result_of::as_child<A>::type>
1782 > that = {*this, proto::as_child(a)};
1787 template<typename A>
1790 proto::tag::subscript
1791 , list2<expr const &, typename result_of::as_child<A const>::type>
1794 operator [](A const &a) const
1797 proto::tag::subscript
1798 , list2<expr const &, typename result_of::as_child<A const>::type>
1800 > that = {*this, proto::as_child(a)};
1805 template<typename Sig>
1808 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
1812 template<typename ...A>
1814 typename result_of::funop<
1815 expr const(A const &...)
1819 operator ()(A const &... a) const
1821 return result_of::funop<
1822 expr const(A const &...)
1825 >::call(*this, a...);
1855 template<typename Tag , typename Arg0 , typename Arg1 , typename Arg2 , typename Arg3 , typename Arg4 , typename Arg5 , typename Arg6 , typename Arg7 , typename Arg8>
1856 struct expr<Tag, list9<Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8>, 9 >
1858 typedef Tag proto_tag;
1859 static const long proto_arity_c = 9;
1860 typedef mpl::long_<9 > proto_arity;
1861 typedef expr proto_base_expr;
1862 typedef list9<Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8> proto_args;
1863 typedef basic_expr<Tag, proto_args, 9 > proto_grammar;
1864 typedef default_domain proto_domain;
1865 typedef default_generator proto_generator;
1866 typedef proto::tag::proto_expr<Tag, proto_domain> fusion_tag;
1867 typedef expr proto_derived_expr;
1868 typedef void proto_is_expr_;
1869 typedef Arg0 proto_child0; proto_child0 child0; typedef Arg1 proto_child1; proto_child1 child1; typedef Arg2 proto_child2; proto_child2 child2; typedef Arg3 proto_child3; proto_child3 child3; typedef Arg4 proto_child4; proto_child4 child4; typedef Arg5 proto_child5; proto_child5 child5; typedef Arg6 proto_child6; proto_child6 child6; typedef Arg7 proto_child7; proto_child7 child7; typedef Arg8 proto_child8; proto_child8 child8;
1870 typedef void proto_child9;
1874 expr const &proto_base() const
1888 template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
1890 static expr const make(A0 const &a0 , A1 const &a1 , A2 const &a2 , A3 const &a3 , A4 const &a4 , A5 const &a5 , A6 const &a6 , A7 const &a7 , A8 const &a8)
1892 expr that = {a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8};
1897 typedef detail::not_a_valid_type address_of_hack_type_;
1905 , list2<expr &, expr const &>
1908 operator =(expr const &a)
1912 , list2<expr &, expr const &>
1914 > that = {*this, a};
1921 template<typename A>
1925 , list2<expr const &, typename result_of::as_child<A>::type>
1928 operator =(A &a) const
1932 , list2<expr const &, typename result_of::as_child<A>::type>
1934 > that = {*this, proto::as_child(a)};
1939 template<typename A>
1943 , list2<expr const &, typename result_of::as_child<A const>::type>
1946 operator =(A const &a) const
1950 , list2<expr const &, typename result_of::as_child<A const>::type>
1952 > that = {*this, proto::as_child(a)};
1959 template<typename A>
1962 proto::tag::subscript
1963 , list2<expr const &, typename result_of::as_child<A>::type>
1966 operator [](A &a) const
1969 proto::tag::subscript
1970 , list2<expr const &, typename result_of::as_child<A>::type>
1972 > that = {*this, proto::as_child(a)};
1977 template<typename A>
1980 proto::tag::subscript
1981 , list2<expr const &, typename result_of::as_child<A const>::type>
1984 operator [](A const &a) const
1987 proto::tag::subscript
1988 , list2<expr const &, typename result_of::as_child<A const>::type>
1990 > that = {*this, proto::as_child(a)};
1995 template<typename Sig>
1998 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
2002 template<typename ...A>
2004 typename result_of::funop<
2005 expr const(A const &...)
2009 operator ()(A const &... a) const
2011 return result_of::funop<
2012 expr const(A const &...)
2015 >::call(*this, a...);
2045 template<typename Tag , typename Arg0 , typename Arg1 , typename Arg2 , typename Arg3 , typename Arg4 , typename Arg5 , typename Arg6 , typename Arg7 , typename Arg8 , typename Arg9>
2046 struct expr<Tag, list10<Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 , Arg9>, 10 >
2048 typedef Tag proto_tag;
2049 static const long proto_arity_c = 10;
2050 typedef mpl::long_<10 > proto_arity;
2051 typedef expr proto_base_expr;
2052 typedef list10<Arg0 , Arg1 , Arg2 , Arg3 , Arg4 , Arg5 , Arg6 , Arg7 , Arg8 , Arg9> proto_args;
2053 typedef basic_expr<Tag, proto_args, 10 > proto_grammar;
2054 typedef default_domain proto_domain;
2055 typedef default_generator proto_generator;
2056 typedef proto::tag::proto_expr<Tag, proto_domain> fusion_tag;
2057 typedef expr proto_derived_expr;
2058 typedef void proto_is_expr_;
2059 typedef Arg0 proto_child0; proto_child0 child0; typedef Arg1 proto_child1; proto_child1 child1; typedef Arg2 proto_child2; proto_child2 child2; typedef Arg3 proto_child3; proto_child3 child3; typedef Arg4 proto_child4; proto_child4 child4; typedef Arg5 proto_child5; proto_child5 child5; typedef Arg6 proto_child6; proto_child6 child6; typedef Arg7 proto_child7; proto_child7 child7; typedef Arg8 proto_child8; proto_child8 child8; typedef Arg9 proto_child9; proto_child9 child9;
2064 expr const &proto_base() const
2078 template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
2080 static expr const make(A0 const &a0 , 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)
2082 expr that = {a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9};
2087 typedef detail::not_a_valid_type address_of_hack_type_;
2095 , list2<expr &, expr const &>
2098 operator =(expr const &a)
2102 , list2<expr &, expr const &>
2104 > that = {*this, a};
2111 template<typename A>
2115 , list2<expr const &, typename result_of::as_child<A>::type>
2118 operator =(A &a) const
2122 , list2<expr const &, typename result_of::as_child<A>::type>
2124 > that = {*this, proto::as_child(a)};
2129 template<typename A>
2133 , list2<expr const &, typename result_of::as_child<A const>::type>
2136 operator =(A const &a) const
2140 , list2<expr const &, typename result_of::as_child<A const>::type>
2142 > that = {*this, proto::as_child(a)};
2149 template<typename A>
2152 proto::tag::subscript
2153 , list2<expr const &, typename result_of::as_child<A>::type>
2156 operator [](A &a) const
2159 proto::tag::subscript
2160 , list2<expr const &, typename result_of::as_child<A>::type>
2162 > that = {*this, proto::as_child(a)};
2167 template<typename A>
2170 proto::tag::subscript
2171 , list2<expr const &, typename result_of::as_child<A const>::type>
2174 operator [](A const &a) const
2177 proto::tag::subscript
2178 , list2<expr const &, typename result_of::as_child<A const>::type>
2180 > that = {*this, proto::as_child(a)};
2185 template<typename Sig>
2188 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
2192 template<typename ...A>
2194 typename result_of::funop<
2195 expr const(A const &...)
2199 operator ()(A const &... a) const
2201 return result_of::funop<
2202 expr const(A const &...)
2205 >::call(*this, a...);