1 ///////////////////////////////////////////////////////////////////////////////
2 /// \file pack_impl.hpp
3 /// Contains helpers for pseudo-pack expansion.
5 // Copyright 2012 Eric Niebler. Distributed under the Boost
6 // Software License, Version 1.0. (See accompanying file
7 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
8 template<typename Fun, typename Cont>
9 struct expand_pattern<1, Fun, Cont>
10 : Cont::template cat<typename expand_pattern_helper<proto::_child_c< 0>, Fun>::type>
13 (expand_pattern_helper<proto::_child_c<0>, Fun>::applied::value)
14 , NO_PACK_EXPRESSION_FOUND_IN_UNPACKING_PATTERN
18 template<typename Ret >
19 struct expand_pattern_rest_0
21 template<typename C0 = void , typename C1 = void , typename C2 = void , typename C3 = void , typename C4 = void , typename C5 = void , typename C6 = void , typename C7 = void , typename C8 = void , typename C9 = void , typename C10 = void>
26 typedef msvc_fun_workaround<Ret( C0)> type;
28 template<typename C0 , typename C1>
31 typedef msvc_fun_workaround<Ret( C0 , C1)> type;
33 template<typename C0 , typename C1 , typename C2>
34 struct cat<C0 , C1 , C2>
36 typedef msvc_fun_workaround<Ret( C0 , C1 , C2)> type;
38 template<typename C0 , typename C1 , typename C2 , typename C3>
39 struct cat<C0 , C1 , C2 , C3>
41 typedef msvc_fun_workaround<Ret( C0 , C1 , C2 , C3)> type;
43 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4>
44 struct cat<C0 , C1 , C2 , C3 , C4>
46 typedef msvc_fun_workaround<Ret( C0 , C1 , C2 , C3 , C4)> type;
48 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5>
49 struct cat<C0 , C1 , C2 , C3 , C4 , C5>
51 typedef msvc_fun_workaround<Ret( C0 , C1 , C2 , C3 , C4 , C5)> type;
53 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6>
54 struct cat<C0 , C1 , C2 , C3 , C4 , C5 , C6>
56 typedef msvc_fun_workaround<Ret( C0 , C1 , C2 , C3 , C4 , C5 , C6)> type;
58 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6 , typename C7>
59 struct cat<C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7>
61 typedef msvc_fun_workaround<Ret( C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7)> type;
63 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6 , typename C7 , typename C8>
64 struct cat<C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7 , C8>
66 typedef msvc_fun_workaround<Ret( C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7 , C8)> type;
68 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6 , typename C7 , typename C8 , typename C9>
69 struct cat<C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7 , C8 , C9>
71 typedef msvc_fun_workaround<Ret( C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7 , C8 , C9)> type;
74 template<typename Fun, typename Cont>
75 struct expand_pattern<2, Fun, Cont>
76 : Cont::template cat<typename expand_pattern_helper<proto::_child_c< 0>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 1>, Fun>::type>
79 (expand_pattern_helper<proto::_child_c<0>, Fun>::applied::value)
80 , NO_PACK_EXPRESSION_FOUND_IN_UNPACKING_PATTERN
84 template<typename Ret , typename A0>
85 struct expand_pattern_rest_1
87 template<typename C0 = void , typename C1 = void , typename C2 = void , typename C3 = void , typename C4 = void , typename C5 = void , typename C6 = void , typename C7 = void , typename C8 = void , typename C9 = void>
92 typedef msvc_fun_workaround<Ret(A0 , C0)> type;
94 template<typename C0 , typename C1>
97 typedef msvc_fun_workaround<Ret(A0 , C0 , C1)> type;
99 template<typename C0 , typename C1 , typename C2>
100 struct cat<C0 , C1 , C2>
102 typedef msvc_fun_workaround<Ret(A0 , C0 , C1 , C2)> type;
104 template<typename C0 , typename C1 , typename C2 , typename C3>
105 struct cat<C0 , C1 , C2 , C3>
107 typedef msvc_fun_workaround<Ret(A0 , C0 , C1 , C2 , C3)> type;
109 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4>
110 struct cat<C0 , C1 , C2 , C3 , C4>
112 typedef msvc_fun_workaround<Ret(A0 , C0 , C1 , C2 , C3 , C4)> type;
114 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5>
115 struct cat<C0 , C1 , C2 , C3 , C4 , C5>
117 typedef msvc_fun_workaround<Ret(A0 , C0 , C1 , C2 , C3 , C4 , C5)> type;
119 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6>
120 struct cat<C0 , C1 , C2 , C3 , C4 , C5 , C6>
122 typedef msvc_fun_workaround<Ret(A0 , C0 , C1 , C2 , C3 , C4 , C5 , C6)> type;
124 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6 , typename C7>
125 struct cat<C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7>
127 typedef msvc_fun_workaround<Ret(A0 , C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7)> type;
129 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6 , typename C7 , typename C8>
130 struct cat<C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7 , C8>
132 typedef msvc_fun_workaround<Ret(A0 , C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7 , C8)> type;
135 template<typename Fun, typename Cont>
136 struct expand_pattern<3, Fun, Cont>
137 : Cont::template cat<typename expand_pattern_helper<proto::_child_c< 0>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 1>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 2>, Fun>::type>
139 BOOST_MPL_ASSERT_MSG(
140 (expand_pattern_helper<proto::_child_c<0>, Fun>::applied::value)
141 , NO_PACK_EXPRESSION_FOUND_IN_UNPACKING_PATTERN
145 template<typename Ret , typename A0 , typename A1>
146 struct expand_pattern_rest_2
148 template<typename C0 = void , typename C1 = void , typename C2 = void , typename C3 = void , typename C4 = void , typename C5 = void , typename C6 = void , typename C7 = void , typename C8 = void>
150 template<typename C0>
153 typedef msvc_fun_workaround<Ret(A0 , A1 , C0)> type;
155 template<typename C0 , typename C1>
158 typedef msvc_fun_workaround<Ret(A0 , A1 , C0 , C1)> type;
160 template<typename C0 , typename C1 , typename C2>
161 struct cat<C0 , C1 , C2>
163 typedef msvc_fun_workaround<Ret(A0 , A1 , C0 , C1 , C2)> type;
165 template<typename C0 , typename C1 , typename C2 , typename C3>
166 struct cat<C0 , C1 , C2 , C3>
168 typedef msvc_fun_workaround<Ret(A0 , A1 , C0 , C1 , C2 , C3)> type;
170 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4>
171 struct cat<C0 , C1 , C2 , C3 , C4>
173 typedef msvc_fun_workaround<Ret(A0 , A1 , C0 , C1 , C2 , C3 , C4)> type;
175 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5>
176 struct cat<C0 , C1 , C2 , C3 , C4 , C5>
178 typedef msvc_fun_workaround<Ret(A0 , A1 , C0 , C1 , C2 , C3 , C4 , C5)> type;
180 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6>
181 struct cat<C0 , C1 , C2 , C3 , C4 , C5 , C6>
183 typedef msvc_fun_workaround<Ret(A0 , A1 , C0 , C1 , C2 , C3 , C4 , C5 , C6)> type;
185 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6 , typename C7>
186 struct cat<C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7>
188 typedef msvc_fun_workaround<Ret(A0 , A1 , C0 , C1 , C2 , C3 , C4 , C5 , C6 , C7)> type;
191 template<typename Fun, typename Cont>
192 struct expand_pattern<4, Fun, Cont>
193 : Cont::template cat<typename expand_pattern_helper<proto::_child_c< 0>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 1>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 2>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 3>, Fun>::type>
195 BOOST_MPL_ASSERT_MSG(
196 (expand_pattern_helper<proto::_child_c<0>, Fun>::applied::value)
197 , NO_PACK_EXPRESSION_FOUND_IN_UNPACKING_PATTERN
201 template<typename Ret , typename A0 , typename A1 , typename A2>
202 struct expand_pattern_rest_3
204 template<typename C0 = void , typename C1 = void , typename C2 = void , typename C3 = void , typename C4 = void , typename C5 = void , typename C6 = void , typename C7 = void>
206 template<typename C0>
209 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , C0)> type;
211 template<typename C0 , typename C1>
214 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , C0 , C1)> type;
216 template<typename C0 , typename C1 , typename C2>
217 struct cat<C0 , C1 , C2>
219 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , C0 , C1 , C2)> type;
221 template<typename C0 , typename C1 , typename C2 , typename C3>
222 struct cat<C0 , C1 , C2 , C3>
224 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , C0 , C1 , C2 , C3)> type;
226 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4>
227 struct cat<C0 , C1 , C2 , C3 , C4>
229 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , C0 , C1 , C2 , C3 , C4)> type;
231 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5>
232 struct cat<C0 , C1 , C2 , C3 , C4 , C5>
234 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , C0 , C1 , C2 , C3 , C4 , C5)> type;
236 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5 , typename C6>
237 struct cat<C0 , C1 , C2 , C3 , C4 , C5 , C6>
239 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , C0 , C1 , C2 , C3 , C4 , C5 , C6)> type;
242 template<typename Fun, typename Cont>
243 struct expand_pattern<5, Fun, Cont>
244 : Cont::template cat<typename expand_pattern_helper<proto::_child_c< 0>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 1>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 2>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 3>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 4>, Fun>::type>
246 BOOST_MPL_ASSERT_MSG(
247 (expand_pattern_helper<proto::_child_c<0>, Fun>::applied::value)
248 , NO_PACK_EXPRESSION_FOUND_IN_UNPACKING_PATTERN
252 template<typename Ret , typename A0 , typename A1 , typename A2 , typename A3>
253 struct expand_pattern_rest_4
255 template<typename C0 = void , typename C1 = void , typename C2 = void , typename C3 = void , typename C4 = void , typename C5 = void , typename C6 = void>
257 template<typename C0>
260 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , C0)> type;
262 template<typename C0 , typename C1>
265 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , C0 , C1)> type;
267 template<typename C0 , typename C1 , typename C2>
268 struct cat<C0 , C1 , C2>
270 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , C0 , C1 , C2)> type;
272 template<typename C0 , typename C1 , typename C2 , typename C3>
273 struct cat<C0 , C1 , C2 , C3>
275 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , C0 , C1 , C2 , C3)> type;
277 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4>
278 struct cat<C0 , C1 , C2 , C3 , C4>
280 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , C0 , C1 , C2 , C3 , C4)> type;
282 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4 , typename C5>
283 struct cat<C0 , C1 , C2 , C3 , C4 , C5>
285 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , C0 , C1 , C2 , C3 , C4 , C5)> type;
288 template<typename Fun, typename Cont>
289 struct expand_pattern<6, Fun, Cont>
290 : Cont::template cat<typename expand_pattern_helper<proto::_child_c< 0>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 1>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 2>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 3>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 4>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 5>, Fun>::type>
292 BOOST_MPL_ASSERT_MSG(
293 (expand_pattern_helper<proto::_child_c<0>, Fun>::applied::value)
294 , NO_PACK_EXPRESSION_FOUND_IN_UNPACKING_PATTERN
298 template<typename Ret , typename A0 , typename A1 , typename A2 , typename A3 , typename A4>
299 struct expand_pattern_rest_5
301 template<typename C0 = void , typename C1 = void , typename C2 = void , typename C3 = void , typename C4 = void , typename C5 = void>
303 template<typename C0>
306 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , C0)> type;
308 template<typename C0 , typename C1>
311 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , C0 , C1)> type;
313 template<typename C0 , typename C1 , typename C2>
314 struct cat<C0 , C1 , C2>
316 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , C0 , C1 , C2)> type;
318 template<typename C0 , typename C1 , typename C2 , typename C3>
319 struct cat<C0 , C1 , C2 , C3>
321 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , C0 , C1 , C2 , C3)> type;
323 template<typename C0 , typename C1 , typename C2 , typename C3 , typename C4>
324 struct cat<C0 , C1 , C2 , C3 , C4>
326 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , C0 , C1 , C2 , C3 , C4)> type;
329 template<typename Fun, typename Cont>
330 struct expand_pattern<7, Fun, Cont>
331 : Cont::template cat<typename expand_pattern_helper<proto::_child_c< 0>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 1>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 2>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 3>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 4>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 5>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 6>, Fun>::type>
333 BOOST_MPL_ASSERT_MSG(
334 (expand_pattern_helper<proto::_child_c<0>, Fun>::applied::value)
335 , NO_PACK_EXPRESSION_FOUND_IN_UNPACKING_PATTERN
339 template<typename Ret , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5>
340 struct expand_pattern_rest_6
342 template<typename C0 = void , typename C1 = void , typename C2 = void , typename C3 = void , typename C4 = void>
344 template<typename C0>
347 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , A5 , C0)> type;
349 template<typename C0 , typename C1>
352 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , A5 , C0 , C1)> type;
354 template<typename C0 , typename C1 , typename C2>
355 struct cat<C0 , C1 , C2>
357 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , A5 , C0 , C1 , C2)> type;
359 template<typename C0 , typename C1 , typename C2 , typename C3>
360 struct cat<C0 , C1 , C2 , C3>
362 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , A5 , C0 , C1 , C2 , C3)> type;
365 template<typename Fun, typename Cont>
366 struct expand_pattern<8, Fun, Cont>
367 : Cont::template cat<typename expand_pattern_helper<proto::_child_c< 0>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 1>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 2>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 3>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 4>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 5>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 6>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 7>, Fun>::type>
369 BOOST_MPL_ASSERT_MSG(
370 (expand_pattern_helper<proto::_child_c<0>, Fun>::applied::value)
371 , NO_PACK_EXPRESSION_FOUND_IN_UNPACKING_PATTERN
375 template<typename Ret , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6>
376 struct expand_pattern_rest_7
378 template<typename C0 = void , typename C1 = void , typename C2 = void , typename C3 = void>
380 template<typename C0>
383 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , A5 , A6 , C0)> type;
385 template<typename C0 , typename C1>
388 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , A5 , A6 , C0 , C1)> type;
390 template<typename C0 , typename C1 , typename C2>
391 struct cat<C0 , C1 , C2>
393 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , A5 , A6 , C0 , C1 , C2)> type;
396 template<typename Fun, typename Cont>
397 struct expand_pattern<9, Fun, Cont>
398 : Cont::template cat<typename expand_pattern_helper<proto::_child_c< 0>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 1>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 2>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 3>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 4>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 5>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 6>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 7>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 8>, Fun>::type>
400 BOOST_MPL_ASSERT_MSG(
401 (expand_pattern_helper<proto::_child_c<0>, Fun>::applied::value)
402 , NO_PACK_EXPRESSION_FOUND_IN_UNPACKING_PATTERN
406 template<typename Ret , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7>
407 struct expand_pattern_rest_8
409 template<typename C0 = void , typename C1 = void , typename C2 = void>
411 template<typename C0>
414 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , C0)> type;
416 template<typename C0 , typename C1>
419 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , C0 , C1)> type;
422 template<typename Fun, typename Cont>
423 struct expand_pattern<10, Fun, Cont>
424 : Cont::template cat<typename expand_pattern_helper<proto::_child_c< 0>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 1>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 2>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 3>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 4>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 5>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 6>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 7>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 8>, Fun>::type , typename expand_pattern_helper<proto::_child_c< 9>, Fun>::type>
426 BOOST_MPL_ASSERT_MSG(
427 (expand_pattern_helper<proto::_child_c<0>, Fun>::applied::value)
428 , NO_PACK_EXPRESSION_FOUND_IN_UNPACKING_PATTERN
432 template<typename Ret , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8>
433 struct expand_pattern_rest_9
435 template<typename C0 = void , typename C1 = void>
437 template<typename C0>
440 typedef msvc_fun_workaround<Ret(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , C0)> type;