• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1     ///////////////////////////////////////////////////////////////////////////////
2     /// \file make_expr_.hpp
3     /// Contains definition of make_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     template<
9         typename Tag
10       , typename Domain
11         , typename A0 = void , typename A1 = void , typename A2 = void , typename A3 = void , typename A4 = void , typename A5 = void , typename A6 = void , typename A7 = void , typename A8 = void , typename A9 = void
12       , typename _ = void
13     >
14     struct make_expr_
15     {};
16     template<typename Domain, typename A>
17     struct make_expr_<tag::terminal, Domain, A
18         , void , void , void , void , void , void , void , void , void , void>
19     {
20         typedef typename proto::detail::protoify<A, Domain>::result_type result_type;
21         BOOST_FORCEINLINE
operator ()make_expr_22         result_type operator()(typename add_reference<A>::type a) const
23         {
24             return proto::detail::protoify<A, Domain>()(a);
25         }
26     };
27     template<typename A>
28     struct make_expr_<tag::terminal, deduce_domain, A
29         , void , void , void , void , void , void , void , void , void , void>
30       : make_expr_<tag::terminal, default_domain, A>
31     {};
32     template<typename Tag, typename Domain , typename A0>
33     struct make_expr_<Tag, Domain , A0
34         , void , void , void , void , void , void , void , void , void, void>
35     {
36         typedef
37             list1<
38                 typename boost::proto::detail::protoify< A0 , Domain >::result_type
39             >
40         proto_args;
41         typedef typename base_expr<Domain, Tag, proto_args>::type expr_type;
42         typedef typename Domain::proto_generator proto_generator;
43         typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
44         BOOST_FORCEINLINE
operator ()make_expr_45         result_type operator()(typename add_reference<A0 >::type a0) const
46         {
47             expr_type const that = {
48                 boost::proto::detail::protoify< A0 , Domain >()(a0)
49             };
50             return proto_generator()(that);
51         }
52     };
53     template<typename Tag , typename A0>
54     struct make_expr_<Tag, deduce_domain , A0
55         , void , void , void , void , void , void , void , void , void, void>
56       : make_expr_<
57             Tag
58           , typename deduce_domain1<A0>::type
59             , A0
60         >
61     {};
62     template<typename Tag, typename Domain , typename A0 , typename A1>
63     struct make_expr_<Tag, Domain , A0 , A1
64         , void , void , void , void , void , void , void , void, void>
65     {
66         typedef
67             list2<
68                 typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type
69             >
70         proto_args;
71         typedef typename base_expr<Domain, Tag, proto_args>::type expr_type;
72         typedef typename Domain::proto_generator proto_generator;
73         typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
74         BOOST_FORCEINLINE
operator ()make_expr_75         result_type operator()(typename add_reference<A0 >::type a0 , typename add_reference<A1 >::type a1) const
76         {
77             expr_type const that = {
78                 boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1)
79             };
80             return proto_generator()(that);
81         }
82     };
83     template<typename Tag , typename A0 , typename A1>
84     struct make_expr_<Tag, deduce_domain , A0 , A1
85         , void , void , void , void , void , void , void , void, void>
86       : make_expr_<
87             Tag
88           , typename deduce_domain2<A0 , A1>::type
89             , A0 , A1
90         >
91     {};
92     template<typename Tag, typename Domain , typename A0 , typename A1 , typename A2>
93     struct make_expr_<Tag, Domain , A0 , A1 , A2
94         , void , void , void , void , void , void , void, void>
95     {
96         typedef
97             list3<
98                 typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type
99             >
100         proto_args;
101         typedef typename base_expr<Domain, Tag, proto_args>::type expr_type;
102         typedef typename Domain::proto_generator proto_generator;
103         typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
104         BOOST_FORCEINLINE
operator ()make_expr_105         result_type operator()(typename add_reference<A0 >::type a0 , typename add_reference<A1 >::type a1 , typename add_reference<A2 >::type a2) const
106         {
107             expr_type const that = {
108                 boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2)
109             };
110             return proto_generator()(that);
111         }
112     };
113     template<typename Tag , typename A0 , typename A1 , typename A2>
114     struct make_expr_<Tag, deduce_domain , A0 , A1 , A2
115         , void , void , void , void , void , void , void, void>
116       : make_expr_<
117             Tag
118           , typename deduce_domain3<A0 , A1 , A2>::type
119             , A0 , A1 , A2
120         >
121     {};
122     template<typename Tag, typename Domain , typename A0 , typename A1 , typename A2 , typename A3>
123     struct make_expr_<Tag, Domain , A0 , A1 , A2 , A3
124         , void , void , void , void , void , void, void>
125     {
126         typedef
127             list4<
128                 typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type
129             >
130         proto_args;
131         typedef typename base_expr<Domain, Tag, proto_args>::type expr_type;
132         typedef typename Domain::proto_generator proto_generator;
133         typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
134         BOOST_FORCEINLINE
operator ()make_expr_135         result_type operator()(typename add_reference<A0 >::type a0 , typename add_reference<A1 >::type a1 , typename add_reference<A2 >::type a2 , typename add_reference<A3 >::type a3) const
136         {
137             expr_type const that = {
138                 boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3)
139             };
140             return proto_generator()(that);
141         }
142     };
143     template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3>
144     struct make_expr_<Tag, deduce_domain , A0 , A1 , A2 , A3
145         , void , void , void , void , void , void, void>
146       : make_expr_<
147             Tag
148           , typename deduce_domain4<A0 , A1 , A2 , A3>::type
149             , A0 , A1 , A2 , A3
150         >
151     {};
152     template<typename Tag, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
153     struct make_expr_<Tag, Domain , A0 , A1 , A2 , A3 , A4
154         , void , void , void , void , void, void>
155     {
156         typedef
157             list5<
158                 typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type , typename boost::proto::detail::protoify< A4 , Domain >::result_type
159             >
160         proto_args;
161         typedef typename base_expr<Domain, Tag, proto_args>::type expr_type;
162         typedef typename Domain::proto_generator proto_generator;
163         typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
164         BOOST_FORCEINLINE
operator ()make_expr_165         result_type operator()(typename add_reference<A0 >::type a0 , typename add_reference<A1 >::type a1 , typename add_reference<A2 >::type a2 , typename add_reference<A3 >::type a3 , typename add_reference<A4 >::type a4) const
166         {
167             expr_type const that = {
168                 boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) , boost::proto::detail::protoify< A4 , Domain >()(a4)
169             };
170             return proto_generator()(that);
171         }
172     };
173     template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
174     struct make_expr_<Tag, deduce_domain , A0 , A1 , A2 , A3 , A4
175         , void , void , void , void , void, void>
176       : make_expr_<
177             Tag
178           , typename deduce_domain5<A0 , A1 , A2 , A3 , A4>::type
179             , A0 , A1 , A2 , A3 , A4
180         >
181     {};
182     template<typename Tag, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
183     struct make_expr_<Tag, Domain , A0 , A1 , A2 , A3 , A4 , A5
184         , void , void , void , void, void>
185     {
186         typedef
187             list6<
188                 typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type , typename boost::proto::detail::protoify< A4 , Domain >::result_type , typename boost::proto::detail::protoify< A5 , Domain >::result_type
189             >
190         proto_args;
191         typedef typename base_expr<Domain, Tag, proto_args>::type expr_type;
192         typedef typename Domain::proto_generator proto_generator;
193         typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
194         BOOST_FORCEINLINE
operator ()make_expr_195         result_type operator()(typename add_reference<A0 >::type a0 , typename add_reference<A1 >::type a1 , typename add_reference<A2 >::type a2 , typename add_reference<A3 >::type a3 , typename add_reference<A4 >::type a4 , typename add_reference<A5 >::type a5) const
196         {
197             expr_type const that = {
198                 boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) , boost::proto::detail::protoify< A4 , Domain >()(a4) , boost::proto::detail::protoify< A5 , Domain >()(a5)
199             };
200             return proto_generator()(that);
201         }
202     };
203     template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
204     struct make_expr_<Tag, deduce_domain , A0 , A1 , A2 , A3 , A4 , A5
205         , void , void , void , void, void>
206       : make_expr_<
207             Tag
208           , typename deduce_domain6<A0 , A1 , A2 , A3 , A4 , A5>::type
209             , A0 , A1 , A2 , A3 , A4 , A5
210         >
211     {};
212     template<typename Tag, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
213     struct make_expr_<Tag, Domain , A0 , A1 , A2 , A3 , A4 , A5 , A6
214         , void , void , void, void>
215     {
216         typedef
217             list7<
218                 typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type , typename boost::proto::detail::protoify< A4 , Domain >::result_type , typename boost::proto::detail::protoify< A5 , Domain >::result_type , typename boost::proto::detail::protoify< A6 , Domain >::result_type
219             >
220         proto_args;
221         typedef typename base_expr<Domain, Tag, proto_args>::type expr_type;
222         typedef typename Domain::proto_generator proto_generator;
223         typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
224         BOOST_FORCEINLINE
operator ()make_expr_225         result_type operator()(typename add_reference<A0 >::type a0 , typename add_reference<A1 >::type a1 , typename add_reference<A2 >::type a2 , typename add_reference<A3 >::type a3 , typename add_reference<A4 >::type a4 , typename add_reference<A5 >::type a5 , typename add_reference<A6 >::type a6) const
226         {
227             expr_type const that = {
228                 boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) , boost::proto::detail::protoify< A4 , Domain >()(a4) , boost::proto::detail::protoify< A5 , Domain >()(a5) , boost::proto::detail::protoify< A6 , Domain >()(a6)
229             };
230             return proto_generator()(that);
231         }
232     };
233     template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
234     struct make_expr_<Tag, deduce_domain , A0 , A1 , A2 , A3 , A4 , A5 , A6
235         , void , void , void, void>
236       : make_expr_<
237             Tag
238           , typename deduce_domain7<A0 , A1 , A2 , A3 , A4 , A5 , A6>::type
239             , A0 , A1 , A2 , A3 , A4 , A5 , A6
240         >
241     {};
242     template<typename Tag, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
243     struct make_expr_<Tag, Domain , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7
244         , void , void, void>
245     {
246         typedef
247             list8<
248                 typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type , typename boost::proto::detail::protoify< A4 , Domain >::result_type , typename boost::proto::detail::protoify< A5 , Domain >::result_type , typename boost::proto::detail::protoify< A6 , Domain >::result_type , typename boost::proto::detail::protoify< A7 , Domain >::result_type
249             >
250         proto_args;
251         typedef typename base_expr<Domain, Tag, proto_args>::type expr_type;
252         typedef typename Domain::proto_generator proto_generator;
253         typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
254         BOOST_FORCEINLINE
operator ()make_expr_255         result_type operator()(typename add_reference<A0 >::type a0 , typename add_reference<A1 >::type a1 , typename add_reference<A2 >::type a2 , typename add_reference<A3 >::type a3 , typename add_reference<A4 >::type a4 , typename add_reference<A5 >::type a5 , typename add_reference<A6 >::type a6 , typename add_reference<A7 >::type a7) const
256         {
257             expr_type const that = {
258                 boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) , boost::proto::detail::protoify< A4 , Domain >()(a4) , boost::proto::detail::protoify< A5 , Domain >()(a5) , boost::proto::detail::protoify< A6 , Domain >()(a6) , boost::proto::detail::protoify< A7 , Domain >()(a7)
259             };
260             return proto_generator()(that);
261         }
262     };
263     template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
264     struct make_expr_<Tag, deduce_domain , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7
265         , void , void, void>
266       : make_expr_<
267             Tag
268           , typename deduce_domain8<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7>::type
269             , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7
270         >
271     {};
272     template<typename Tag, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
273     struct make_expr_<Tag, Domain , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8
274         , void, void>
275     {
276         typedef
277             list9<
278                 typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type , typename boost::proto::detail::protoify< A4 , Domain >::result_type , typename boost::proto::detail::protoify< A5 , Domain >::result_type , typename boost::proto::detail::protoify< A6 , Domain >::result_type , typename boost::proto::detail::protoify< A7 , Domain >::result_type , typename boost::proto::detail::protoify< A8 , Domain >::result_type
279             >
280         proto_args;
281         typedef typename base_expr<Domain, Tag, proto_args>::type expr_type;
282         typedef typename Domain::proto_generator proto_generator;
283         typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
284         BOOST_FORCEINLINE
operator ()make_expr_285         result_type operator()(typename add_reference<A0 >::type a0 , typename add_reference<A1 >::type a1 , typename add_reference<A2 >::type a2 , typename add_reference<A3 >::type a3 , typename add_reference<A4 >::type a4 , typename add_reference<A5 >::type a5 , typename add_reference<A6 >::type a6 , typename add_reference<A7 >::type a7 , typename add_reference<A8 >::type a8) const
286         {
287             expr_type const that = {
288                 boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) , boost::proto::detail::protoify< A4 , Domain >()(a4) , boost::proto::detail::protoify< A5 , Domain >()(a5) , boost::proto::detail::protoify< A6 , Domain >()(a6) , boost::proto::detail::protoify< A7 , Domain >()(a7) , boost::proto::detail::protoify< A8 , Domain >()(a8)
289             };
290             return proto_generator()(that);
291         }
292     };
293     template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
294     struct make_expr_<Tag, deduce_domain , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8
295         , void, void>
296       : make_expr_<
297             Tag
298           , typename deduce_domain9<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8>::type
299             , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8
300         >
301     {};
302     template<typename Tag, typename Domain , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
303     struct make_expr_<Tag, Domain , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9
304         , void>
305     {
306         typedef
307             list10<
308                 typename boost::proto::detail::protoify< A0 , Domain >::result_type , typename boost::proto::detail::protoify< A1 , Domain >::result_type , typename boost::proto::detail::protoify< A2 , Domain >::result_type , typename boost::proto::detail::protoify< A3 , Domain >::result_type , typename boost::proto::detail::protoify< A4 , Domain >::result_type , typename boost::proto::detail::protoify< A5 , Domain >::result_type , typename boost::proto::detail::protoify< A6 , Domain >::result_type , typename boost::proto::detail::protoify< A7 , Domain >::result_type , typename boost::proto::detail::protoify< A8 , Domain >::result_type , typename boost::proto::detail::protoify< A9 , Domain >::result_type
309             >
310         proto_args;
311         typedef typename base_expr<Domain, Tag, proto_args>::type expr_type;
312         typedef typename Domain::proto_generator proto_generator;
313         typedef typename proto_generator::template result<proto_generator(expr_type)>::type result_type;
314         BOOST_FORCEINLINE
operator ()make_expr_315         result_type operator()(typename add_reference<A0 >::type a0 , typename add_reference<A1 >::type a1 , typename add_reference<A2 >::type a2 , typename add_reference<A3 >::type a3 , typename add_reference<A4 >::type a4 , typename add_reference<A5 >::type a5 , typename add_reference<A6 >::type a6 , typename add_reference<A7 >::type a7 , typename add_reference<A8 >::type a8 , typename add_reference<A9 >::type a9) const
316         {
317             expr_type const that = {
318                 boost::proto::detail::protoify< A0 , Domain >()(a0) , boost::proto::detail::protoify< A1 , Domain >()(a1) , boost::proto::detail::protoify< A2 , Domain >()(a2) , boost::proto::detail::protoify< A3 , Domain >()(a3) , boost::proto::detail::protoify< A4 , Domain >()(a4) , boost::proto::detail::protoify< A5 , Domain >()(a5) , boost::proto::detail::protoify< A6 , Domain >()(a6) , boost::proto::detail::protoify< A7 , Domain >()(a7) , boost::proto::detail::protoify< A8 , Domain >()(a8) , boost::proto::detail::protoify< A9 , Domain >()(a9)
319             };
320             return proto_generator()(that);
321         }
322     };
323     template<typename Tag , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
324     struct make_expr_<Tag, deduce_domain , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9
325         , void>
326       : make_expr_<
327             Tag
328           , typename deduce_domain10<A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9>::type
329             , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9
330         >
331     {};
332