1     ///////////////////////////////////////////////////////////////////////////////
2     /// \file make_gcc_workaround.hpp
3     /// Special workaround code to make the make\<\> transform work on certain
4     /// versions of gcc.
5     //
6     //  Copyright 2008 Eric Niebler. Distributed under the Boost
7     //  Software License, Version 1.0. (See accompanying file
8     //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 
10     template<typename Tag, typename Args, long Arity >
11     struct make<proto::expr<Tag, Args, Arity>()>
12       : transform<make<proto::expr<Tag, Args, Arity>()> >
13     {
14         template<typename Expr, typename State, typename Data>
15         struct impl : transform_impl<Expr, State, Data>
16         {
17             typedef proto::expr<Tag, Args, Arity> result_type;
18             BOOST_FORCEINLINE
19             result_type operator ()(
20                 typename impl::expr_param e
21               , typename impl::state_param s
22               , typename impl::data_param d
23             ) const
24             {
25                 return proto::expr<Tag, Args, Arity>::make(
26 
27                 );
28             }
29         };
30     };
31     template<typename Tag, typename Args, long Arity >
32     struct make<proto::basic_expr<Tag, Args, Arity>()>
33       : transform<make<proto::basic_expr<Tag, Args, Arity>()> >
34     {
35         template<typename Expr, typename State, typename Data>
36         struct impl : transform_impl<Expr, State, Data>
37         {
38             typedef proto::basic_expr<Tag, Args, Arity> result_type;
39             BOOST_FORCEINLINE
40             result_type operator ()(
41                 typename impl::expr_param e
42               , typename impl::state_param s
43               , typename impl::data_param d
44             ) const
45             {
46                 return proto::basic_expr<Tag, Args, Arity>::make(
47 
48                 );
49             }
50         };
51     };
52 
53     template<typename Tag, typename Args, long Arity , typename A0>
54     struct make<proto::expr<Tag, Args, Arity>(A0)>
55       : transform<make<proto::expr<Tag, Args, Arity>(A0)> >
56     {
57         template<typename Expr, typename State, typename Data>
58         struct impl : transform_impl<Expr, State, Data>
59         {
60             typedef proto::expr<Tag, Args, Arity> result_type;
61             BOOST_FORCEINLINE
62             result_type operator ()(
63                 typename impl::expr_param e
64               , typename impl::state_param s
65               , typename impl::data_param d
66             ) const
67             {
68                 return proto::expr<Tag, Args, Arity>::make(
69                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) )
70                 );
71             }
72         };
73     };
74     template<typename Tag, typename Args, long Arity , typename A0>
75     struct make<proto::basic_expr<Tag, Args, Arity>(A0)>
76       : transform<make<proto::basic_expr<Tag, Args, Arity>(A0)> >
77     {
78         template<typename Expr, typename State, typename Data>
79         struct impl : transform_impl<Expr, State, Data>
80         {
81             typedef proto::basic_expr<Tag, Args, Arity> result_type;
82             BOOST_FORCEINLINE
83             result_type operator ()(
84                 typename impl::expr_param e
85               , typename impl::state_param s
86               , typename impl::data_param d
87             ) const
88             {
89                 return proto::basic_expr<Tag, Args, Arity>::make(
90                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) )
91                 );
92             }
93         };
94     };
95 
96     template<typename Tag, typename Args, long Arity , typename A0 , typename A1>
97     struct make<proto::expr<Tag, Args, Arity>(A0 , A1)>
98       : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1)> >
99     {
100         template<typename Expr, typename State, typename Data>
101         struct impl : transform_impl<Expr, State, Data>
102         {
103             typedef proto::expr<Tag, Args, Arity> result_type;
104             BOOST_FORCEINLINE
105             result_type operator ()(
106                 typename impl::expr_param e
107               , typename impl::state_param s
108               , typename impl::data_param d
109             ) const
110             {
111                 return proto::expr<Tag, Args, Arity>::make(
112                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) )
113                 );
114             }
115         };
116     };
117     template<typename Tag, typename Args, long Arity , typename A0 , typename A1>
118     struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1)>
119       : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1)> >
120     {
121         template<typename Expr, typename State, typename Data>
122         struct impl : transform_impl<Expr, State, Data>
123         {
124             typedef proto::basic_expr<Tag, Args, Arity> result_type;
125             BOOST_FORCEINLINE
126             result_type operator ()(
127                 typename impl::expr_param e
128               , typename impl::state_param s
129               , typename impl::data_param d
130             ) const
131             {
132                 return proto::basic_expr<Tag, Args, Arity>::make(
133                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) )
134                 );
135             }
136         };
137     };
138 
139     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2>
140     struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2)>
141       : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2)> >
142     {
143         template<typename Expr, typename State, typename Data>
144         struct impl : transform_impl<Expr, State, Data>
145         {
146             typedef proto::expr<Tag, Args, Arity> result_type;
147             BOOST_FORCEINLINE
148             result_type operator ()(
149                 typename impl::expr_param e
150               , typename impl::state_param s
151               , typename impl::data_param d
152             ) const
153             {
154                 return proto::expr<Tag, Args, Arity>::make(
155                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) )
156                 );
157             }
158         };
159     };
160     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2>
161     struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2)>
162       : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2)> >
163     {
164         template<typename Expr, typename State, typename Data>
165         struct impl : transform_impl<Expr, State, Data>
166         {
167             typedef proto::basic_expr<Tag, Args, Arity> result_type;
168             BOOST_FORCEINLINE
169             result_type operator ()(
170                 typename impl::expr_param e
171               , typename impl::state_param s
172               , typename impl::data_param d
173             ) const
174             {
175                 return proto::basic_expr<Tag, Args, Arity>::make(
176                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) )
177                 );
178             }
179         };
180     };
181 
182     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3>
183     struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3)>
184       : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3)> >
185     {
186         template<typename Expr, typename State, typename Data>
187         struct impl : transform_impl<Expr, State, Data>
188         {
189             typedef proto::expr<Tag, Args, Arity> result_type;
190             BOOST_FORCEINLINE
191             result_type operator ()(
192                 typename impl::expr_param e
193               , typename impl::state_param s
194               , typename impl::data_param d
195             ) const
196             {
197                 return proto::expr<Tag, Args, Arity>::make(
198                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) )
199                 );
200             }
201         };
202     };
203     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3>
204     struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3)>
205       : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3)> >
206     {
207         template<typename Expr, typename State, typename Data>
208         struct impl : transform_impl<Expr, State, Data>
209         {
210             typedef proto::basic_expr<Tag, Args, Arity> result_type;
211             BOOST_FORCEINLINE
212             result_type operator ()(
213                 typename impl::expr_param e
214               , typename impl::state_param s
215               , typename impl::data_param d
216             ) const
217             {
218                 return proto::basic_expr<Tag, Args, Arity>::make(
219                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) )
220                 );
221             }
222         };
223     };
224 
225     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
226     struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4)>
227       : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4)> >
228     {
229         template<typename Expr, typename State, typename Data>
230         struct impl : transform_impl<Expr, State, Data>
231         {
232             typedef proto::expr<Tag, Args, Arity> result_type;
233             BOOST_FORCEINLINE
234             result_type operator ()(
235                 typename impl::expr_param e
236               , typename impl::state_param s
237               , typename impl::data_param d
238             ) const
239             {
240                 return proto::expr<Tag, Args, Arity>::make(
241                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) )
242                 );
243             }
244         };
245     };
246     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
247     struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4)>
248       : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4)> >
249     {
250         template<typename Expr, typename State, typename Data>
251         struct impl : transform_impl<Expr, State, Data>
252         {
253             typedef proto::basic_expr<Tag, Args, Arity> result_type;
254             BOOST_FORCEINLINE
255             result_type operator ()(
256                 typename impl::expr_param e
257               , typename impl::state_param s
258               , typename impl::data_param d
259             ) const
260             {
261                 return proto::basic_expr<Tag, Args, Arity>::make(
262                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) )
263                 );
264             }
265         };
266     };
267 
268     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
269     struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5)>
270       : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5)> >
271     {
272         template<typename Expr, typename State, typename Data>
273         struct impl : transform_impl<Expr, State, Data>
274         {
275             typedef proto::expr<Tag, Args, Arity> result_type;
276             BOOST_FORCEINLINE
277             result_type operator ()(
278                 typename impl::expr_param e
279               , typename impl::state_param s
280               , typename impl::data_param d
281             ) const
282             {
283                 return proto::expr<Tag, Args, Arity>::make(
284                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) )
285                 );
286             }
287         };
288     };
289     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
290     struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5)>
291       : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5)> >
292     {
293         template<typename Expr, typename State, typename Data>
294         struct impl : transform_impl<Expr, State, Data>
295         {
296             typedef proto::basic_expr<Tag, Args, Arity> result_type;
297             BOOST_FORCEINLINE
298             result_type operator ()(
299                 typename impl::expr_param e
300               , typename impl::state_param s
301               , typename impl::data_param d
302             ) const
303             {
304                 return proto::basic_expr<Tag, Args, Arity>::make(
305                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) )
306                 );
307             }
308         };
309     };
310 
311     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
312     struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6)>
313       : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6)> >
314     {
315         template<typename Expr, typename State, typename Data>
316         struct impl : transform_impl<Expr, State, Data>
317         {
318             typedef proto::expr<Tag, Args, Arity> result_type;
319             BOOST_FORCEINLINE
320             result_type operator ()(
321                 typename impl::expr_param e
322               , typename impl::state_param s
323               , typename impl::data_param d
324             ) const
325             {
326                 return proto::expr<Tag, Args, Arity>::make(
327                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) )
328                 );
329             }
330         };
331     };
332     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
333     struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6)>
334       : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6)> >
335     {
336         template<typename Expr, typename State, typename Data>
337         struct impl : transform_impl<Expr, State, Data>
338         {
339             typedef proto::basic_expr<Tag, Args, Arity> result_type;
340             BOOST_FORCEINLINE
341             result_type operator ()(
342                 typename impl::expr_param e
343               , typename impl::state_param s
344               , typename impl::data_param d
345             ) const
346             {
347                 return proto::basic_expr<Tag, Args, Arity>::make(
348                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) )
349                 );
350             }
351         };
352     };
353 
354     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
355     struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)>
356       : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> >
357     {
358         template<typename Expr, typename State, typename Data>
359         struct impl : transform_impl<Expr, State, Data>
360         {
361             typedef proto::expr<Tag, Args, Arity> result_type;
362             BOOST_FORCEINLINE
363             result_type operator ()(
364                 typename impl::expr_param e
365               , typename impl::state_param s
366               , typename impl::data_param d
367             ) const
368             {
369                 return proto::expr<Tag, Args, Arity>::make(
370                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) )
371                 );
372             }
373         };
374     };
375     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
376     struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)>
377       : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> >
378     {
379         template<typename Expr, typename State, typename Data>
380         struct impl : transform_impl<Expr, State, Data>
381         {
382             typedef proto::basic_expr<Tag, Args, Arity> result_type;
383             BOOST_FORCEINLINE
384             result_type operator ()(
385                 typename impl::expr_param e
386               , typename impl::state_param s
387               , typename impl::data_param d
388             ) const
389             {
390                 return proto::basic_expr<Tag, Args, Arity>::make(
391                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) )
392                 );
393             }
394         };
395     };
396 
397     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
398     struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)>
399       : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> >
400     {
401         template<typename Expr, typename State, typename Data>
402         struct impl : transform_impl<Expr, State, Data>
403         {
404             typedef proto::expr<Tag, Args, Arity> result_type;
405             BOOST_FORCEINLINE
406             result_type operator ()(
407                 typename impl::expr_param e
408               , typename impl::state_param s
409               , typename impl::data_param d
410             ) const
411             {
412                 return proto::expr<Tag, Args, Arity>::make(
413                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl<Expr, State, Data>()(e, s, d) )
414                 );
415             }
416         };
417     };
418     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
419     struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)>
420       : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> >
421     {
422         template<typename Expr, typename State, typename Data>
423         struct impl : transform_impl<Expr, State, Data>
424         {
425             typedef proto::basic_expr<Tag, Args, Arity> result_type;
426             BOOST_FORCEINLINE
427             result_type operator ()(
428                 typename impl::expr_param e
429               , typename impl::state_param s
430               , typename impl::data_param d
431             ) const
432             {
433                 return proto::basic_expr<Tag, Args, Arity>::make(
434                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl<Expr, State, Data>()(e, s, d) )
435                 );
436             }
437         };
438     };
439 
440     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
441     struct make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)>
442       : transform<make<proto::expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> >
443     {
444         template<typename Expr, typename State, typename Data>
445         struct impl : transform_impl<Expr, State, Data>
446         {
447             typedef proto::expr<Tag, Args, Arity> result_type;
448             BOOST_FORCEINLINE
449             result_type operator ()(
450                 typename impl::expr_param e
451               , typename impl::state_param s
452               , typename impl::data_param d
453             ) const
454             {
455                 return proto::expr<Tag, Args, Arity>::make(
456                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A9>::template impl<Expr, State, Data>()(e, s, d) )
457                 );
458             }
459         };
460     };
461     template<typename Tag, typename Args, long Arity , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9>
462     struct make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)>
463       : transform<make<proto::basic_expr<Tag, Args, Arity>(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> >
464     {
465         template<typename Expr, typename State, typename Data>
466         struct impl : transform_impl<Expr, State, Data>
467         {
468             typedef proto::basic_expr<Tag, Args, Arity> result_type;
469             BOOST_FORCEINLINE
470             result_type operator ()(
471                 typename impl::expr_param e
472               , typename impl::state_param s
473               , typename impl::data_param d
474             ) const
475             {
476                 return proto::basic_expr<Tag, Args, Arity>::make(
477                     detail::as_lvalue( typename when<_, A0>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl<Expr, State, Data>()(e, s, d) ) , detail::as_lvalue( typename when<_, A9>::template impl<Expr, State, Data>()(e, s, d) )
478                 );
479             }
480         };
481     };
482