1 ///////////////////////////////////////////////////////////////////////////////
2 /// \file expr_variadic.hpp
3 /// Contains definition of expr\<\> 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
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 template<typename Tag, typename Arg0>
37 struct expr<Tag, term<Arg0>, 0>
38 {
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;
52
53
54 BOOST_FORCEINLINE
55 expr const &proto_base() const
56 {
57 return *this;
58 }
59
60
61 BOOST_FORCEINLINE
62 expr &proto_base()
63 {
64 return *this;
65 }
66
67
68
69 template<typename A0>
70 BOOST_FORCEINLINE
71 static expr const make(A0 &a0)
72 {
73 return detail::make_terminal(a0, static_cast<expr *>(0), static_cast<proto_args *>(0));
74 }
75
76
77 template<typename A0>
78 BOOST_FORCEINLINE
79 static expr const make(A0 const &a0)
80 {
81 return detail::make_terminal(a0, static_cast<expr *>(0), static_cast<proto_args *>(0));
82 }
83
84
85 typedef detail::not_a_valid_type address_of_hack_type_;
86
87
88
89
90 BOOST_FORCEINLINE
91 proto::expr<
92 proto::tag::assign
93 , list2<expr &, expr const &>
94 , 2
95 > const
96 operator =(expr const &a)
97 {
98 proto::expr<
99 proto::tag::assign
100 , list2<expr &, expr const &>
101 , 2
102 > that = {*this, a};
103 return that;
104 }
105
106
107
108
109 template<typename A>
110 BOOST_FORCEINLINE
111 proto::expr<
112 proto::tag::assign
113 , list2<expr const &, typename result_of::as_child<A>::type>
114 , 2
115 > const
116 operator =(A &a) const
117 {
118 proto::expr<
119 proto::tag::assign
120 , list2<expr const &, typename result_of::as_child<A>::type>
121 , 2
122 > that = {*this, proto::as_child(a)};
123 return that;
124 }
125
126
127 template<typename A>
128 BOOST_FORCEINLINE
129 proto::expr<
130 proto::tag::assign
131 , list2<expr const &, typename result_of::as_child<A const>::type>
132 , 2
133 > const
134 operator =(A const &a) const
135 {
136 proto::expr<
137 proto::tag::assign
138 , list2<expr const &, typename result_of::as_child<A const>::type>
139 , 2
140 > that = {*this, proto::as_child(a)};
141 return that;
142 }
143
144
145 template<typename A>
146 BOOST_FORCEINLINE
147 proto::expr<
148 proto::tag::assign
149 , list2<expr &, typename result_of::as_child<A>::type>
150 , 2
151 > const
152 operator =(A &a)
153 {
154 proto::expr<
155 proto::tag::assign
156 , list2<expr &, typename result_of::as_child<A>::type>
157 , 2
158 > that = {*this, proto::as_child(a)};
159 return that;
160 }
161
162
163 template<typename A>
164 BOOST_FORCEINLINE
165 proto::expr<
166 proto::tag::assign
167 , list2<expr &, typename result_of::as_child<A const>::type>
168 , 2
169 > const
170 operator =(A const &a)
171 {
172 proto::expr<
173 proto::tag::assign
174 , list2<expr &, typename result_of::as_child<A const>::type>
175 , 2
176 > that = {*this, proto::as_child(a)};
177 return that;
178 }
179
180
181
182
183 template<typename A>
184 BOOST_FORCEINLINE
185 proto::expr<
186 proto::tag::subscript
187 , list2<expr const &, typename result_of::as_child<A>::type>
188 , 2
189 > const
190 operator [](A &a) const
191 {
192 proto::expr<
193 proto::tag::subscript
194 , list2<expr const &, typename result_of::as_child<A>::type>
195 , 2
196 > that = {*this, proto::as_child(a)};
197 return that;
198 }
199
200
201 template<typename A>
202 BOOST_FORCEINLINE
203 proto::expr<
204 proto::tag::subscript
205 , list2<expr const &, typename result_of::as_child<A const>::type>
206 , 2
207 > const
208 operator [](A const &a) const
209 {
210 proto::expr<
211 proto::tag::subscript
212 , list2<expr const &, typename result_of::as_child<A const>::type>
213 , 2
214 > that = {*this, proto::as_child(a)};
215 return that;
216 }
217
218
219 template<typename A>
220 BOOST_FORCEINLINE
221 proto::expr<
222 proto::tag::subscript
223 , list2<expr &, typename result_of::as_child<A>::type>
224 , 2
225 > const
226 operator [](A &a)
227 {
228 proto::expr<
229 proto::tag::subscript
230 , list2<expr &, typename result_of::as_child<A>::type>
231 , 2
232 > that = {*this, proto::as_child(a)};
233 return that;
234 }
235
236
237 template<typename A>
238 BOOST_FORCEINLINE
239 proto::expr<
240 proto::tag::subscript
241 , list2<expr &, typename result_of::as_child<A const>::type>
242 , 2
243 > const
244 operator [](A const &a)
245 {
246 proto::expr<
247 proto::tag::subscript
248 , list2<expr &, typename result_of::as_child<A const>::type>
249 , 2
250 > that = {*this, proto::as_child(a)};
251 return that;
252 }
253
254
255 template<typename Sig>
256 struct result
257 {
258 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
259 };
260
261
262 template<typename ...A>
263 BOOST_FORCEINLINE
264 typename result_of::funop<
265 expr const(A const &...)
266 , expr
267 , default_domain
268 >::type const
269 operator ()(A const &... a) const
270 {
271 return result_of::funop<
272 expr const(A const &...)
273 , expr
274 , default_domain
275 >::call(*this, a...);
276 }
277
278
279 template<typename ...A>
280 BOOST_FORCEINLINE
281 typename result_of::funop<
282 expr(A const &...)
283 , expr
284 , default_domain
285 >::type const
286 operator ()(A const &... a)
287 {
288 return result_of::funop<
289 expr(A const &...)
290 , expr
291 , default_domain
292 >::call(*this, a...);
293 }
294 };
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322 template<typename Tag , typename Arg0>
323 struct expr<Tag, list1<Arg0>, 1 >
324 {
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;
338
339
340 BOOST_FORCEINLINE
341 expr const &proto_base() const
342 {
343 return *this;
344 }
345
346
347 BOOST_FORCEINLINE
348 expr &proto_base()
349 {
350 return *this;
351 }
352
353
354
355 template<typename A0>
356 BOOST_FORCEINLINE
357 static expr const make(A0 const &a0)
358 {
359 expr that = {a0};
360 return that;
361 }
362
363
364
365 typedef typename detail::address_of_hack<Tag, proto_child0>::type address_of_hack_type_;
366
367
368
369
370
371
372
373 BOOST_FORCEINLINE
374 operator address_of_hack_type_() const
375 {
376 return boost::addressof(this->child0);
377 }
378
379
380
381
382 BOOST_FORCEINLINE
383 proto::expr<
384 proto::tag::assign
385 , list2<expr &, expr const &>
386 , 2
387 > const
388 operator =(expr const &a)
389 {
390 proto::expr<
391 proto::tag::assign
392 , list2<expr &, expr const &>
393 , 2
394 > that = {*this, a};
395 return that;
396 }
397
398
399
400
401 template<typename A>
402 BOOST_FORCEINLINE
403 proto::expr<
404 proto::tag::assign
405 , list2<expr const &, typename result_of::as_child<A>::type>
406 , 2
407 > const
408 operator =(A &a) const
409 {
410 proto::expr<
411 proto::tag::assign
412 , list2<expr const &, typename result_of::as_child<A>::type>
413 , 2
414 > that = {*this, proto::as_child(a)};
415 return that;
416 }
417
418
419 template<typename A>
420 BOOST_FORCEINLINE
421 proto::expr<
422 proto::tag::assign
423 , list2<expr const &, typename result_of::as_child<A const>::type>
424 , 2
425 > const
426 operator =(A const &a) const
427 {
428 proto::expr<
429 proto::tag::assign
430 , list2<expr const &, typename result_of::as_child<A const>::type>
431 , 2
432 > that = {*this, proto::as_child(a)};
433 return that;
434 }
435
436
437
438
439 template<typename A>
440 BOOST_FORCEINLINE
441 proto::expr<
442 proto::tag::subscript
443 , list2<expr const &, typename result_of::as_child<A>::type>
444 , 2
445 > const
446 operator [](A &a) const
447 {
448 proto::expr<
449 proto::tag::subscript
450 , list2<expr const &, typename result_of::as_child<A>::type>
451 , 2
452 > that = {*this, proto::as_child(a)};
453 return that;
454 }
455
456
457 template<typename A>
458 BOOST_FORCEINLINE
459 proto::expr<
460 proto::tag::subscript
461 , list2<expr const &, typename result_of::as_child<A const>::type>
462 , 2
463 > const
464 operator [](A const &a) const
465 {
466 proto::expr<
467 proto::tag::subscript
468 , list2<expr const &, typename result_of::as_child<A const>::type>
469 , 2
470 > that = {*this, proto::as_child(a)};
471 return that;
472 }
473
474
475 template<typename Sig>
476 struct result
477 {
478 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
479 };
480
481
482 template<typename ...A>
483 BOOST_FORCEINLINE
484 typename result_of::funop<
485 expr const(A const &...)
486 , expr
487 , default_domain
488 >::type const
489 operator ()(A const &... a) const
490 {
491 return result_of::funop<
492 expr const(A const &...)
493 , expr
494 , default_domain
495 >::call(*this, a...);
496 }
497 };
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525 template<typename Tag , typename Arg0 , typename Arg1>
526 struct expr<Tag, list2<Arg0 , Arg1>, 2 >
527 {
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;
541
542
543 BOOST_FORCEINLINE
544 expr const &proto_base() const
545 {
546 return *this;
547 }
548
549
550 BOOST_FORCEINLINE
551 expr &proto_base()
552 {
553 return *this;
554 }
555
556
557
558 template<typename A0 , typename A1>
559 BOOST_FORCEINLINE
560 static expr const make(A0 const &a0 , A1 const &a1)
561 {
562 expr that = {a0 , a1};
563 return that;
564 }
565
566
567 typedef detail::not_a_valid_type address_of_hack_type_;
568
569
570
571
572 BOOST_FORCEINLINE
573 proto::expr<
574 proto::tag::assign
575 , list2<expr &, expr const &>
576 , 2
577 > const
578 operator =(expr const &a)
579 {
580 proto::expr<
581 proto::tag::assign
582 , list2<expr &, expr const &>
583 , 2
584 > that = {*this, a};
585 return that;
586 }
587
588
589
590
591 template<typename A>
592 BOOST_FORCEINLINE
593 proto::expr<
594 proto::tag::assign
595 , list2<expr const &, typename result_of::as_child<A>::type>
596 , 2
597 > const
598 operator =(A &a) const
599 {
600 proto::expr<
601 proto::tag::assign
602 , list2<expr const &, typename result_of::as_child<A>::type>
603 , 2
604 > that = {*this, proto::as_child(a)};
605 return that;
606 }
607
608
609 template<typename A>
610 BOOST_FORCEINLINE
611 proto::expr<
612 proto::tag::assign
613 , list2<expr const &, typename result_of::as_child<A const>::type>
614 , 2
615 > const
616 operator =(A const &a) const
617 {
618 proto::expr<
619 proto::tag::assign
620 , list2<expr const &, typename result_of::as_child<A const>::type>
621 , 2
622 > that = {*this, proto::as_child(a)};
623 return that;
624 }
625
626
627
628
629 template<typename A>
630 BOOST_FORCEINLINE
631 proto::expr<
632 proto::tag::subscript
633 , list2<expr const &, typename result_of::as_child<A>::type>
634 , 2
635 > const
636 operator [](A &a) const
637 {
638 proto::expr<
639 proto::tag::subscript
640 , list2<expr const &, typename result_of::as_child<A>::type>
641 , 2
642 > that = {*this, proto::as_child(a)};
643 return that;
644 }
645
646
647 template<typename A>
648 BOOST_FORCEINLINE
649 proto::expr<
650 proto::tag::subscript
651 , list2<expr const &, typename result_of::as_child<A const>::type>
652 , 2
653 > const
654 operator [](A const &a) const
655 {
656 proto::expr<
657 proto::tag::subscript
658 , list2<expr const &, typename result_of::as_child<A const>::type>
659 , 2
660 > that = {*this, proto::as_child(a)};
661 return that;
662 }
663
664
665 template<typename Sig>
666 struct result
667 {
668 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
669 };
670
671
672 template<typename ...A>
673 BOOST_FORCEINLINE
674 typename result_of::funop<
675 expr const(A const &...)
676 , expr
677 , default_domain
678 >::type const
679 operator ()(A const &... a) const
680 {
681 return result_of::funop<
682 expr const(A const &...)
683 , expr
684 , default_domain
685 >::call(*this, a...);
686 }
687 };
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715 template<typename Tag , typename Arg0 , typename Arg1 , typename Arg2>
716 struct expr<Tag, list3<Arg0 , Arg1 , Arg2>, 3 >
717 {
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;
731
732
733 BOOST_FORCEINLINE
734 expr const &proto_base() const
735 {
736 return *this;
737 }
738
739
740 BOOST_FORCEINLINE
741 expr &proto_base()
742 {
743 return *this;
744 }
745
746
747
748 template<typename A0 , typename A1 , typename A2>
749 BOOST_FORCEINLINE
750 static expr const make(A0 const &a0 , A1 const &a1 , A2 const &a2)
751 {
752 expr that = {a0 , a1 , a2};
753 return that;
754 }
755
756
757 typedef detail::not_a_valid_type address_of_hack_type_;
758
759
760
761
762 BOOST_FORCEINLINE
763 proto::expr<
764 proto::tag::assign
765 , list2<expr &, expr const &>
766 , 2
767 > const
768 operator =(expr const &a)
769 {
770 proto::expr<
771 proto::tag::assign
772 , list2<expr &, expr const &>
773 , 2
774 > that = {*this, a};
775 return that;
776 }
777
778
779
780
781 template<typename A>
782 BOOST_FORCEINLINE
783 proto::expr<
784 proto::tag::assign
785 , list2<expr const &, typename result_of::as_child<A>::type>
786 , 2
787 > const
788 operator =(A &a) const
789 {
790 proto::expr<
791 proto::tag::assign
792 , list2<expr const &, typename result_of::as_child<A>::type>
793 , 2
794 > that = {*this, proto::as_child(a)};
795 return that;
796 }
797
798
799 template<typename A>
800 BOOST_FORCEINLINE
801 proto::expr<
802 proto::tag::assign
803 , list2<expr const &, typename result_of::as_child<A const>::type>
804 , 2
805 > const
806 operator =(A const &a) const
807 {
808 proto::expr<
809 proto::tag::assign
810 , list2<expr const &, typename result_of::as_child<A const>::type>
811 , 2
812 > that = {*this, proto::as_child(a)};
813 return that;
814 }
815
816
817
818
819 template<typename A>
820 BOOST_FORCEINLINE
821 proto::expr<
822 proto::tag::subscript
823 , list2<expr const &, typename result_of::as_child<A>::type>
824 , 2
825 > const
826 operator [](A &a) const
827 {
828 proto::expr<
829 proto::tag::subscript
830 , list2<expr const &, typename result_of::as_child<A>::type>
831 , 2
832 > that = {*this, proto::as_child(a)};
833 return that;
834 }
835
836
837 template<typename A>
838 BOOST_FORCEINLINE
839 proto::expr<
840 proto::tag::subscript
841 , list2<expr const &, typename result_of::as_child<A const>::type>
842 , 2
843 > const
844 operator [](A const &a) const
845 {
846 proto::expr<
847 proto::tag::subscript
848 , list2<expr const &, typename result_of::as_child<A const>::type>
849 , 2
850 > that = {*this, proto::as_child(a)};
851 return that;
852 }
853
854
855 template<typename Sig>
856 struct result
857 {
858 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
859 };
860
861
862 template<typename ...A>
863 BOOST_FORCEINLINE
864 typename result_of::funop<
865 expr const(A const &...)
866 , expr
867 , default_domain
868 >::type const
869 operator ()(A const &... a) const
870 {
871 return result_of::funop<
872 expr const(A const &...)
873 , expr
874 , default_domain
875 >::call(*this, a...);
876 }
877 };
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905 template<typename Tag , typename Arg0 , typename Arg1 , typename Arg2 , typename Arg3>
906 struct expr<Tag, list4<Arg0 , Arg1 , Arg2 , Arg3>, 4 >
907 {
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;
921
922
923 BOOST_FORCEINLINE
924 expr const &proto_base() const
925 {
926 return *this;
927 }
928
929
930 BOOST_FORCEINLINE
931 expr &proto_base()
932 {
933 return *this;
934 }
935
936
937
938 template<typename A0 , typename A1 , typename A2 , typename A3>
939 BOOST_FORCEINLINE
940 static expr const make(A0 const &a0 , A1 const &a1 , A2 const &a2 , A3 const &a3)
941 {
942 expr that = {a0 , a1 , a2 , a3};
943 return that;
944 }
945
946
947 typedef detail::not_a_valid_type address_of_hack_type_;
948
949
950
951
952 BOOST_FORCEINLINE
953 proto::expr<
954 proto::tag::assign
955 , list2<expr &, expr const &>
956 , 2
957 > const
958 operator =(expr const &a)
959 {
960 proto::expr<
961 proto::tag::assign
962 , list2<expr &, expr const &>
963 , 2
964 > that = {*this, a};
965 return that;
966 }
967
968
969
970
971 template<typename A>
972 BOOST_FORCEINLINE
973 proto::expr<
974 proto::tag::assign
975 , list2<expr const &, typename result_of::as_child<A>::type>
976 , 2
977 > const
978 operator =(A &a) const
979 {
980 proto::expr<
981 proto::tag::assign
982 , list2<expr const &, typename result_of::as_child<A>::type>
983 , 2
984 > that = {*this, proto::as_child(a)};
985 return that;
986 }
987
988
989 template<typename A>
990 BOOST_FORCEINLINE
991 proto::expr<
992 proto::tag::assign
993 , list2<expr const &, typename result_of::as_child<A const>::type>
994 , 2
995 > const
996 operator =(A const &a) const
997 {
998 proto::expr<
999 proto::tag::assign
1000 , list2<expr const &, typename result_of::as_child<A const>::type>
1001 , 2
1002 > that = {*this, proto::as_child(a)};
1003 return that;
1004 }
1005
1006
1007
1008
1009 template<typename A>
1010 BOOST_FORCEINLINE
1011 proto::expr<
1012 proto::tag::subscript
1013 , list2<expr const &, typename result_of::as_child<A>::type>
1014 , 2
1015 > const
1016 operator [](A &a) const
1017 {
1018 proto::expr<
1019 proto::tag::subscript
1020 , list2<expr const &, typename result_of::as_child<A>::type>
1021 , 2
1022 > that = {*this, proto::as_child(a)};
1023 return that;
1024 }
1025
1026
1027 template<typename A>
1028 BOOST_FORCEINLINE
1029 proto::expr<
1030 proto::tag::subscript
1031 , list2<expr const &, typename result_of::as_child<A const>::type>
1032 , 2
1033 > const
1034 operator [](A const &a) const
1035 {
1036 proto::expr<
1037 proto::tag::subscript
1038 , list2<expr const &, typename result_of::as_child<A const>::type>
1039 , 2
1040 > that = {*this, proto::as_child(a)};
1041 return that;
1042 }
1043
1044
1045 template<typename Sig>
1046 struct result
1047 {
1048 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
1049 };
1050
1051
1052 template<typename ...A>
1053 BOOST_FORCEINLINE
1054 typename result_of::funop<
1055 expr const(A const &...)
1056 , expr
1057 , default_domain
1058 >::type const
1059 operator ()(A const &... a) const
1060 {
1061 return result_of::funop<
1062 expr const(A const &...)
1063 , expr
1064 , default_domain
1065 >::call(*this, a...);
1066 }
1067 };
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
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 >
1097 {
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;
1111
1112
1113 BOOST_FORCEINLINE
1114 expr const &proto_base() const
1115 {
1116 return *this;
1117 }
1118
1119
1120 BOOST_FORCEINLINE
1121 expr &proto_base()
1122 {
1123 return *this;
1124 }
1125
1126
1127
1128 template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
1129 BOOST_FORCEINLINE
1130 static expr const make(A0 const &a0 , A1 const &a1 , A2 const &a2 , A3 const &a3 , A4 const &a4)
1131 {
1132 expr that = {a0 , a1 , a2 , a3 , a4};
1133 return that;
1134 }
1135
1136
1137 typedef detail::not_a_valid_type address_of_hack_type_;
1138
1139
1140
1141
1142 BOOST_FORCEINLINE
1143 proto::expr<
1144 proto::tag::assign
1145 , list2<expr &, expr const &>
1146 , 2
1147 > const
1148 operator =(expr const &a)
1149 {
1150 proto::expr<
1151 proto::tag::assign
1152 , list2<expr &, expr const &>
1153 , 2
1154 > that = {*this, a};
1155 return that;
1156 }
1157
1158
1159
1160
1161 template<typename A>
1162 BOOST_FORCEINLINE
1163 proto::expr<
1164 proto::tag::assign
1165 , list2<expr const &, typename result_of::as_child<A>::type>
1166 , 2
1167 > const
1168 operator =(A &a) const
1169 {
1170 proto::expr<
1171 proto::tag::assign
1172 , list2<expr const &, typename result_of::as_child<A>::type>
1173 , 2
1174 > that = {*this, proto::as_child(a)};
1175 return that;
1176 }
1177
1178
1179 template<typename A>
1180 BOOST_FORCEINLINE
1181 proto::expr<
1182 proto::tag::assign
1183 , list2<expr const &, typename result_of::as_child<A const>::type>
1184 , 2
1185 > const
1186 operator =(A const &a) const
1187 {
1188 proto::expr<
1189 proto::tag::assign
1190 , list2<expr const &, typename result_of::as_child<A const>::type>
1191 , 2
1192 > that = {*this, proto::as_child(a)};
1193 return that;
1194 }
1195
1196
1197
1198
1199 template<typename A>
1200 BOOST_FORCEINLINE
1201 proto::expr<
1202 proto::tag::subscript
1203 , list2<expr const &, typename result_of::as_child<A>::type>
1204 , 2
1205 > const
1206 operator [](A &a) const
1207 {
1208 proto::expr<
1209 proto::tag::subscript
1210 , list2<expr const &, typename result_of::as_child<A>::type>
1211 , 2
1212 > that = {*this, proto::as_child(a)};
1213 return that;
1214 }
1215
1216
1217 template<typename A>
1218 BOOST_FORCEINLINE
1219 proto::expr<
1220 proto::tag::subscript
1221 , list2<expr const &, typename result_of::as_child<A const>::type>
1222 , 2
1223 > const
1224 operator [](A const &a) const
1225 {
1226 proto::expr<
1227 proto::tag::subscript
1228 , list2<expr const &, typename result_of::as_child<A const>::type>
1229 , 2
1230 > that = {*this, proto::as_child(a)};
1231 return that;
1232 }
1233
1234
1235 template<typename Sig>
1236 struct result
1237 {
1238 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
1239 };
1240
1241
1242 template<typename ...A>
1243 BOOST_FORCEINLINE
1244 typename result_of::funop<
1245 expr const(A const &...)
1246 , expr
1247 , default_domain
1248 >::type const
1249 operator ()(A const &... a) const
1250 {
1251 return result_of::funop<
1252 expr const(A const &...)
1253 , expr
1254 , default_domain
1255 >::call(*this, a...);
1256 }
1257 };
1258
1259
1260
1261
1262
1263
1264
1265
1266
1267
1268
1269
1270
1271
1272
1273
1274
1275
1276
1277
1278
1279
1280
1281
1282
1283
1284
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 >
1287 {
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;
1301
1302
1303 BOOST_FORCEINLINE
1304 expr const &proto_base() const
1305 {
1306 return *this;
1307 }
1308
1309
1310 BOOST_FORCEINLINE
1311 expr &proto_base()
1312 {
1313 return *this;
1314 }
1315
1316
1317
1318 template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
1319 BOOST_FORCEINLINE
1320 static expr const make(A0 const &a0 , A1 const &a1 , A2 const &a2 , A3 const &a3 , A4 const &a4 , A5 const &a5)
1321 {
1322 expr that = {a0 , a1 , a2 , a3 , a4 , a5};
1323 return that;
1324 }
1325
1326
1327 typedef detail::not_a_valid_type address_of_hack_type_;
1328
1329
1330
1331
1332 BOOST_FORCEINLINE
1333 proto::expr<
1334 proto::tag::assign
1335 , list2<expr &, expr const &>
1336 , 2
1337 > const
1338 operator =(expr const &a)
1339 {
1340 proto::expr<
1341 proto::tag::assign
1342 , list2<expr &, expr const &>
1343 , 2
1344 > that = {*this, a};
1345 return that;
1346 }
1347
1348
1349
1350
1351 template<typename A>
1352 BOOST_FORCEINLINE
1353 proto::expr<
1354 proto::tag::assign
1355 , list2<expr const &, typename result_of::as_child<A>::type>
1356 , 2
1357 > const
1358 operator =(A &a) const
1359 {
1360 proto::expr<
1361 proto::tag::assign
1362 , list2<expr const &, typename result_of::as_child<A>::type>
1363 , 2
1364 > that = {*this, proto::as_child(a)};
1365 return that;
1366 }
1367
1368
1369 template<typename A>
1370 BOOST_FORCEINLINE
1371 proto::expr<
1372 proto::tag::assign
1373 , list2<expr const &, typename result_of::as_child<A const>::type>
1374 , 2
1375 > const
1376 operator =(A const &a) const
1377 {
1378 proto::expr<
1379 proto::tag::assign
1380 , list2<expr const &, typename result_of::as_child<A const>::type>
1381 , 2
1382 > that = {*this, proto::as_child(a)};
1383 return that;
1384 }
1385
1386
1387
1388
1389 template<typename A>
1390 BOOST_FORCEINLINE
1391 proto::expr<
1392 proto::tag::subscript
1393 , list2<expr const &, typename result_of::as_child<A>::type>
1394 , 2
1395 > const
1396 operator [](A &a) const
1397 {
1398 proto::expr<
1399 proto::tag::subscript
1400 , list2<expr const &, typename result_of::as_child<A>::type>
1401 , 2
1402 > that = {*this, proto::as_child(a)};
1403 return that;
1404 }
1405
1406
1407 template<typename A>
1408 BOOST_FORCEINLINE
1409 proto::expr<
1410 proto::tag::subscript
1411 , list2<expr const &, typename result_of::as_child<A const>::type>
1412 , 2
1413 > const
1414 operator [](A const &a) const
1415 {
1416 proto::expr<
1417 proto::tag::subscript
1418 , list2<expr const &, typename result_of::as_child<A const>::type>
1419 , 2
1420 > that = {*this, proto::as_child(a)};
1421 return that;
1422 }
1423
1424
1425 template<typename Sig>
1426 struct result
1427 {
1428 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
1429 };
1430
1431
1432 template<typename ...A>
1433 BOOST_FORCEINLINE
1434 typename result_of::funop<
1435 expr const(A const &...)
1436 , expr
1437 , default_domain
1438 >::type const
1439 operator ()(A const &... a) const
1440 {
1441 return result_of::funop<
1442 expr const(A const &...)
1443 , expr
1444 , default_domain
1445 >::call(*this, a...);
1446 }
1447 };
1448
1449
1450
1451
1452
1453
1454
1455
1456
1457
1458
1459
1460
1461
1462
1463
1464
1465
1466
1467
1468
1469
1470
1471
1472
1473
1474
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 >
1477 {
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;
1491
1492
1493 BOOST_FORCEINLINE
1494 expr const &proto_base() const
1495 {
1496 return *this;
1497 }
1498
1499
1500 BOOST_FORCEINLINE
1501 expr &proto_base()
1502 {
1503 return *this;
1504 }
1505
1506
1507
1508 template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
1509 BOOST_FORCEINLINE
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)
1511 {
1512 expr that = {a0 , a1 , a2 , a3 , a4 , a5 , a6};
1513 return that;
1514 }
1515
1516
1517 typedef detail::not_a_valid_type address_of_hack_type_;
1518
1519
1520
1521
1522 BOOST_FORCEINLINE
1523 proto::expr<
1524 proto::tag::assign
1525 , list2<expr &, expr const &>
1526 , 2
1527 > const
1528 operator =(expr const &a)
1529 {
1530 proto::expr<
1531 proto::tag::assign
1532 , list2<expr &, expr const &>
1533 , 2
1534 > that = {*this, a};
1535 return that;
1536 }
1537
1538
1539
1540
1541 template<typename A>
1542 BOOST_FORCEINLINE
1543 proto::expr<
1544 proto::tag::assign
1545 , list2<expr const &, typename result_of::as_child<A>::type>
1546 , 2
1547 > const
1548 operator =(A &a) const
1549 {
1550 proto::expr<
1551 proto::tag::assign
1552 , list2<expr const &, typename result_of::as_child<A>::type>
1553 , 2
1554 > that = {*this, proto::as_child(a)};
1555 return that;
1556 }
1557
1558
1559 template<typename A>
1560 BOOST_FORCEINLINE
1561 proto::expr<
1562 proto::tag::assign
1563 , list2<expr const &, typename result_of::as_child<A const>::type>
1564 , 2
1565 > const
1566 operator =(A const &a) const
1567 {
1568 proto::expr<
1569 proto::tag::assign
1570 , list2<expr const &, typename result_of::as_child<A const>::type>
1571 , 2
1572 > that = {*this, proto::as_child(a)};
1573 return that;
1574 }
1575
1576
1577
1578
1579 template<typename A>
1580 BOOST_FORCEINLINE
1581 proto::expr<
1582 proto::tag::subscript
1583 , list2<expr const &, typename result_of::as_child<A>::type>
1584 , 2
1585 > const
1586 operator [](A &a) const
1587 {
1588 proto::expr<
1589 proto::tag::subscript
1590 , list2<expr const &, typename result_of::as_child<A>::type>
1591 , 2
1592 > that = {*this, proto::as_child(a)};
1593 return that;
1594 }
1595
1596
1597 template<typename A>
1598 BOOST_FORCEINLINE
1599 proto::expr<
1600 proto::tag::subscript
1601 , list2<expr const &, typename result_of::as_child<A const>::type>
1602 , 2
1603 > const
1604 operator [](A const &a) const
1605 {
1606 proto::expr<
1607 proto::tag::subscript
1608 , list2<expr const &, typename result_of::as_child<A const>::type>
1609 , 2
1610 > that = {*this, proto::as_child(a)};
1611 return that;
1612 }
1613
1614
1615 template<typename Sig>
1616 struct result
1617 {
1618 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
1619 };
1620
1621
1622 template<typename ...A>
1623 BOOST_FORCEINLINE
1624 typename result_of::funop<
1625 expr const(A const &...)
1626 , expr
1627 , default_domain
1628 >::type const
1629 operator ()(A const &... a) const
1630 {
1631 return result_of::funop<
1632 expr const(A const &...)
1633 , expr
1634 , default_domain
1635 >::call(*this, a...);
1636 }
1637 };
1638
1639
1640
1641
1642
1643
1644
1645
1646
1647
1648
1649
1650
1651
1652
1653
1654
1655
1656
1657
1658
1659
1660
1661
1662
1663
1664
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 >
1667 {
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;
1681
1682
1683 BOOST_FORCEINLINE
1684 expr const &proto_base() const
1685 {
1686 return *this;
1687 }
1688
1689
1690 BOOST_FORCEINLINE
1691 expr &proto_base()
1692 {
1693 return *this;
1694 }
1695
1696
1697
1698 template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
1699 BOOST_FORCEINLINE
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)
1701 {
1702 expr that = {a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7};
1703 return that;
1704 }
1705
1706
1707 typedef detail::not_a_valid_type address_of_hack_type_;
1708
1709
1710
1711
1712 BOOST_FORCEINLINE
1713 proto::expr<
1714 proto::tag::assign
1715 , list2<expr &, expr const &>
1716 , 2
1717 > const
1718 operator =(expr const &a)
1719 {
1720 proto::expr<
1721 proto::tag::assign
1722 , list2<expr &, expr const &>
1723 , 2
1724 > that = {*this, a};
1725 return that;
1726 }
1727
1728
1729
1730
1731 template<typename A>
1732 BOOST_FORCEINLINE
1733 proto::expr<
1734 proto::tag::assign
1735 , list2<expr const &, typename result_of::as_child<A>::type>
1736 , 2
1737 > const
1738 operator =(A &a) const
1739 {
1740 proto::expr<
1741 proto::tag::assign
1742 , list2<expr const &, typename result_of::as_child<A>::type>
1743 , 2
1744 > that = {*this, proto::as_child(a)};
1745 return that;
1746 }
1747
1748
1749 template<typename A>
1750 BOOST_FORCEINLINE
1751 proto::expr<
1752 proto::tag::assign
1753 , list2<expr const &, typename result_of::as_child<A const>::type>
1754 , 2
1755 > const
1756 operator =(A const &a) const
1757 {
1758 proto::expr<
1759 proto::tag::assign
1760 , list2<expr const &, typename result_of::as_child<A const>::type>
1761 , 2
1762 > that = {*this, proto::as_child(a)};
1763 return that;
1764 }
1765
1766
1767
1768
1769 template<typename A>
1770 BOOST_FORCEINLINE
1771 proto::expr<
1772 proto::tag::subscript
1773 , list2<expr const &, typename result_of::as_child<A>::type>
1774 , 2
1775 > const
1776 operator [](A &a) const
1777 {
1778 proto::expr<
1779 proto::tag::subscript
1780 , list2<expr const &, typename result_of::as_child<A>::type>
1781 , 2
1782 > that = {*this, proto::as_child(a)};
1783 return that;
1784 }
1785
1786
1787 template<typename A>
1788 BOOST_FORCEINLINE
1789 proto::expr<
1790 proto::tag::subscript
1791 , list2<expr const &, typename result_of::as_child<A const>::type>
1792 , 2
1793 > const
1794 operator [](A const &a) const
1795 {
1796 proto::expr<
1797 proto::tag::subscript
1798 , list2<expr const &, typename result_of::as_child<A const>::type>
1799 , 2
1800 > that = {*this, proto::as_child(a)};
1801 return that;
1802 }
1803
1804
1805 template<typename Sig>
1806 struct result
1807 {
1808 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
1809 };
1810
1811
1812 template<typename ...A>
1813 BOOST_FORCEINLINE
1814 typename result_of::funop<
1815 expr const(A const &...)
1816 , expr
1817 , default_domain
1818 >::type const
1819 operator ()(A const &... a) const
1820 {
1821 return result_of::funop<
1822 expr const(A const &...)
1823 , expr
1824 , default_domain
1825 >::call(*this, a...);
1826 }
1827 };
1828
1829
1830
1831
1832
1833
1834
1835
1836
1837
1838
1839
1840
1841
1842
1843
1844
1845
1846
1847
1848
1849
1850
1851
1852
1853
1854
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 >
1857 {
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;
1871
1872
1873 BOOST_FORCEINLINE
1874 expr const &proto_base() const
1875 {
1876 return *this;
1877 }
1878
1879
1880 BOOST_FORCEINLINE
1881 expr &proto_base()
1882 {
1883 return *this;
1884 }
1885
1886
1887
1888 template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
1889 BOOST_FORCEINLINE
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)
1891 {
1892 expr that = {a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8};
1893 return that;
1894 }
1895
1896
1897 typedef detail::not_a_valid_type address_of_hack_type_;
1898
1899
1900
1901
1902 BOOST_FORCEINLINE
1903 proto::expr<
1904 proto::tag::assign
1905 , list2<expr &, expr const &>
1906 , 2
1907 > const
1908 operator =(expr const &a)
1909 {
1910 proto::expr<
1911 proto::tag::assign
1912 , list2<expr &, expr const &>
1913 , 2
1914 > that = {*this, a};
1915 return that;
1916 }
1917
1918
1919
1920
1921 template<typename A>
1922 BOOST_FORCEINLINE
1923 proto::expr<
1924 proto::tag::assign
1925 , list2<expr const &, typename result_of::as_child<A>::type>
1926 , 2
1927 > const
1928 operator =(A &a) const
1929 {
1930 proto::expr<
1931 proto::tag::assign
1932 , list2<expr const &, typename result_of::as_child<A>::type>
1933 , 2
1934 > that = {*this, proto::as_child(a)};
1935 return that;
1936 }
1937
1938
1939 template<typename A>
1940 BOOST_FORCEINLINE
1941 proto::expr<
1942 proto::tag::assign
1943 , list2<expr const &, typename result_of::as_child<A const>::type>
1944 , 2
1945 > const
1946 operator =(A const &a) const
1947 {
1948 proto::expr<
1949 proto::tag::assign
1950 , list2<expr const &, typename result_of::as_child<A const>::type>
1951 , 2
1952 > that = {*this, proto::as_child(a)};
1953 return that;
1954 }
1955
1956
1957
1958
1959 template<typename A>
1960 BOOST_FORCEINLINE
1961 proto::expr<
1962 proto::tag::subscript
1963 , list2<expr const &, typename result_of::as_child<A>::type>
1964 , 2
1965 > const
1966 operator [](A &a) const
1967 {
1968 proto::expr<
1969 proto::tag::subscript
1970 , list2<expr const &, typename result_of::as_child<A>::type>
1971 , 2
1972 > that = {*this, proto::as_child(a)};
1973 return that;
1974 }
1975
1976
1977 template<typename A>
1978 BOOST_FORCEINLINE
1979 proto::expr<
1980 proto::tag::subscript
1981 , list2<expr const &, typename result_of::as_child<A const>::type>
1982 , 2
1983 > const
1984 operator [](A const &a) const
1985 {
1986 proto::expr<
1987 proto::tag::subscript
1988 , list2<expr const &, typename result_of::as_child<A const>::type>
1989 , 2
1990 > that = {*this, proto::as_child(a)};
1991 return that;
1992 }
1993
1994
1995 template<typename Sig>
1996 struct result
1997 {
1998 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
1999 };
2000
2001
2002 template<typename ...A>
2003 BOOST_FORCEINLINE
2004 typename result_of::funop<
2005 expr const(A const &...)
2006 , expr
2007 , default_domain
2008 >::type const
2009 operator ()(A const &... a) const
2010 {
2011 return result_of::funop<
2012 expr const(A const &...)
2013 , expr
2014 , default_domain
2015 >::call(*this, a...);
2016 }
2017 };
2018
2019
2020
2021
2022
2023
2024
2025
2026
2027
2028
2029
2030
2031
2032
2033
2034
2035
2036
2037
2038
2039
2040
2041
2042
2043
2044
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 >
2047 {
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;
2060
2061
2062
2063 BOOST_FORCEINLINE
2064 expr const &proto_base() const
2065 {
2066 return *this;
2067 }
2068
2069
2070 BOOST_FORCEINLINE
2071 expr &proto_base()
2072 {
2073 return *this;
2074 }
2075
2076
2077
2078 template<typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
2079 BOOST_FORCEINLINE
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)
2081 {
2082 expr that = {a0 , a1 , a2 , a3 , a4 , a5 , a6 , a7 , a8 , a9};
2083 return that;
2084 }
2085
2086
2087 typedef detail::not_a_valid_type address_of_hack_type_;
2088
2089
2090
2091
2092 BOOST_FORCEINLINE
2093 proto::expr<
2094 proto::tag::assign
2095 , list2<expr &, expr const &>
2096 , 2
2097 > const
2098 operator =(expr const &a)
2099 {
2100 proto::expr<
2101 proto::tag::assign
2102 , list2<expr &, expr const &>
2103 , 2
2104 > that = {*this, a};
2105 return that;
2106 }
2107
2108
2109
2110
2111 template<typename A>
2112 BOOST_FORCEINLINE
2113 proto::expr<
2114 proto::tag::assign
2115 , list2<expr const &, typename result_of::as_child<A>::type>
2116 , 2
2117 > const
2118 operator =(A &a) const
2119 {
2120 proto::expr<
2121 proto::tag::assign
2122 , list2<expr const &, typename result_of::as_child<A>::type>
2123 , 2
2124 > that = {*this, proto::as_child(a)};
2125 return that;
2126 }
2127
2128
2129 template<typename A>
2130 BOOST_FORCEINLINE
2131 proto::expr<
2132 proto::tag::assign
2133 , list2<expr const &, typename result_of::as_child<A const>::type>
2134 , 2
2135 > const
2136 operator =(A const &a) const
2137 {
2138 proto::expr<
2139 proto::tag::assign
2140 , list2<expr const &, typename result_of::as_child<A const>::type>
2141 , 2
2142 > that = {*this, proto::as_child(a)};
2143 return that;
2144 }
2145
2146
2147
2148
2149 template<typename A>
2150 BOOST_FORCEINLINE
2151 proto::expr<
2152 proto::tag::subscript
2153 , list2<expr const &, typename result_of::as_child<A>::type>
2154 , 2
2155 > const
2156 operator [](A &a) const
2157 {
2158 proto::expr<
2159 proto::tag::subscript
2160 , list2<expr const &, typename result_of::as_child<A>::type>
2161 , 2
2162 > that = {*this, proto::as_child(a)};
2163 return that;
2164 }
2165
2166
2167 template<typename A>
2168 BOOST_FORCEINLINE
2169 proto::expr<
2170 proto::tag::subscript
2171 , list2<expr const &, typename result_of::as_child<A const>::type>
2172 , 2
2173 > const
2174 operator [](A const &a) const
2175 {
2176 proto::expr<
2177 proto::tag::subscript
2178 , list2<expr const &, typename result_of::as_child<A const>::type>
2179 , 2
2180 > that = {*this, proto::as_child(a)};
2181 return that;
2182 }
2183
2184
2185 template<typename Sig>
2186 struct result
2187 {
2188 typedef typename result_of::funop<Sig, expr, default_domain>::type const type;
2189 };
2190
2191
2192 template<typename ...A>
2193 BOOST_FORCEINLINE
2194 typename result_of::funop<
2195 expr const(A const &...)
2196 , expr
2197 , default_domain
2198 >::type const
2199 operator ()(A const &... a) const
2200 {
2201 return result_of::funop<
2202 expr const(A const &...)
2203 , expr
2204 , default_domain
2205 >::call(*this, a...);
2206 }
2207 };
2208
2209

source code of boost/boost/proto/detail/preprocessed/expr_variadic.hpp