]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/parameter/include/boost/parameter/preprocessor.hpp
bump version to 12.2.2-pve1
[ceph.git] / ceph / src / boost / libs / parameter / include / boost / parameter / preprocessor.hpp
CommitLineData
7c673cae
FG
1// Copyright Daniel Wallin 2006. Use, modification and distribution is
2// subject to the Boost Software License, Version 1.0. (See accompanying
3// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
4
5#ifndef BOOST_PARAMETER_PREPROCESSOR_060206_HPP
6# define BOOST_PARAMETER_PREPROCESSOR_060206_HPP
7
8# include <boost/parameter/parameters.hpp>
9# include <boost/parameter/binding.hpp>
10# include <boost/parameter/match.hpp>
11
12# include <boost/parameter/aux_/parenthesized_type.hpp>
13# include <boost/parameter/aux_/cast.hpp>
14# include <boost/parameter/aux_/preprocessor/flatten.hpp>
15
16# include <boost/preprocessor/repetition/repeat_from_to.hpp>
17# include <boost/preprocessor/comparison/equal.hpp>
18# include <boost/preprocessor/control/if.hpp>
19# include <boost/preprocessor/control/iif.hpp>
20# include <boost/preprocessor/control/expr_if.hpp>
21# include <boost/preprocessor/repetition/enum_params.hpp>
22# include <boost/preprocessor/repetition/enum_binary_params.hpp>
23# include <boost/preprocessor/repetition/enum_trailing.hpp>
24# include <boost/preprocessor/seq/first_n.hpp>
25# include <boost/preprocessor/seq/for_each_product.hpp>
26# include <boost/preprocessor/seq/for_each_i.hpp>
27# include <boost/preprocessor/tuple/elem.hpp>
28# include <boost/preprocessor/tuple/eat.hpp>
29# include <boost/preprocessor/seq/fold_left.hpp>
30# include <boost/preprocessor/seq/push_back.hpp>
31# include <boost/preprocessor/seq/size.hpp>
32# include <boost/preprocessor/seq/enum.hpp>
33# include <boost/preprocessor/seq/push_back.hpp>
34
35# include <boost/preprocessor/detail/is_nullary.hpp>
36
37# include <boost/mpl/always.hpp>
38# include <boost/mpl/apply_wrap.hpp>
39
40namespace boost { namespace parameter { namespace aux {
41
42# if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
43
44// Given Match, which is "void x" where x is an argument matching
45// criterion, extract a corresponding MPL predicate.
46template <class Match>
47struct unwrap_predicate;
48
49// Match anything
50template <>
51struct unwrap_predicate<void*>
52{
53 typedef mpl::always<mpl::true_> type;
54};
55
56#if BOOST_WORKAROUND(__SUNPRO_CC, BOOST_TESTED_AT(0x580))
57
58typedef void* voidstar;
59
60// A matching predicate is explicitly specified
61template <class Predicate>
62struct unwrap_predicate<voidstar (Predicate)>
63{
64 typedef Predicate type;
65};
66
67#else
68
69// A matching predicate is explicitly specified
70template <class Predicate>
71struct unwrap_predicate<void *(Predicate)>
72{
73 typedef Predicate type;
74};
75
76#endif
77
78
79// A type to which the argument is supposed to be convertible is
80// specified
81template <class Target>
82struct unwrap_predicate<void (Target)>
83{
84 typedef is_convertible<mpl::_, Target> type;
85};
86
87// Recast the ParameterSpec's nested match metafunction as a free metafunction
88template <
89 class Parameters
90 , BOOST_PP_ENUM_BINARY_PARAMS(
91 BOOST_PARAMETER_MAX_ARITY, class A, = boost::parameter::void_ BOOST_PP_INTERCEPT
92 )
93>
94struct match
95 : Parameters::template match<
96 BOOST_PP_ENUM_PARAMS(BOOST_PARAMETER_MAX_ARITY, A)
97 >
98{};
99# endif
100
101# undef false_
102
103template <
104 class Parameters
105 , BOOST_PP_ENUM_BINARY_PARAMS(
106 BOOST_PARAMETER_MAX_ARITY, class A, = boost::parameter::void_ BOOST_PP_INTERCEPT
107 )
108>
109struct argument_pack
110{
111 typedef typename make_arg_list<
112 typename BOOST_PARAMETER_build_arg_list(
113 BOOST_PARAMETER_MAX_ARITY, make_items, typename Parameters::parameter_spec, A
114 )::type
115 , typename Parameters::deduced_list
116 , tag_keyword_arg
117 , mpl::false_
118 >::type result;
119 typedef typename mpl::first<result>::type type;
120};
121
122// Works around VC6 problem where it won't accept rvalues.
123template <class T>
124T& as_lvalue(T& value, long)
125{
126 return value;
127}
128
129template <class T>
130T const& as_lvalue(T const& value, int)
131{
132 return value;
133}
134
135
136# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
137
138template <class Predicate, class T, class Args>
139struct apply_predicate
140{
141 BOOST_MPL_ASSERT((
142 mpl::and_<mpl::false_,T>
143 ));
144
145 typedef typename mpl::if_<
146 typename mpl::apply2<Predicate,T,Args>::type
147 , char
148 , int
149 >::type type;
150};
151
152template <class P>
153struct funptr_predicate
154{
155 static P p;
156
157 template <class T, class Args, class P0>
158 static typename apply_predicate<P0,T,Args>::type
159 check_predicate(type<T>, Args*, void**(*)(P0));
160
161 template <class T, class Args, class P0>
162 static typename mpl::if_<
163 is_convertible<T,P0>
164 , char
165 , int
166 >::type check_predicate(type<T>, Args*, void*(*)(P0));
167
168 template <class T, class Args>
169 struct apply
170 {
171 BOOST_STATIC_CONSTANT(bool, result =
172 sizeof(check_predicate(boost::type<T>(), (Args*)0, &p)) == 1
173 );
174
175 typedef mpl::bool_<apply<T,Args>::result> type;
176 };
177};
178
179template <>
180struct funptr_predicate<void**>
181 : mpl::always<mpl::true_>
182{};
183
184# endif
185
186}}} // namespace boost::parameter::aux
187
188# if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
189// From Paul Mensonides
190# define BOOST_PARAMETER_IS_NULLARY(x) \
191 BOOST_PP_SPLIT(1, BOOST_PARAMETER_IS_NULLARY_C x BOOST_PP_COMMA() 0) \
192 /**/
193# define BOOST_PARAMETER_IS_NULLARY_C() \
194 ~, 1 BOOST_PP_RPAREN() \
195 BOOST_PP_TUPLE_EAT(2) BOOST_PP_LPAREN() ~ \
196 /**/
197# else
198# define BOOST_PARAMETER_IS_NULLARY(x) BOOST_PP_IS_NULLARY(x)
199# endif
200
201# define BOOST_PARAMETER_MEMBER_FUNCTION_CHECK_STATIC_static ()
202# define BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \
203 BOOST_PARAMETER_IS_NULLARY( \
204 BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_CHECK_STATIC_,name) \
205 )
206
207# if !defined(BOOST_MSVC)
208# define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_static
209# define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC(name) \
210 BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_, name)
211# else
212// Workaround for MSVC preprocessor.
213//
214// When stripping static from "static f", msvc will produce
215// " f". The leading whitespace doesn't go away when pasting
216// the token with something else, so this thing is a hack to
217// strip the whitespace.
218# define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_static (
219# define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_AUX(name) \
220 BOOST_PP_CAT(BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_, name))
221# define BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC(name) \
222 BOOST_PP_SEQ_HEAD( \
223 BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC_AUX(name) \
224 )
225# endif
226
227# define BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \
228 BOOST_PP_EXPR_IF( \
229 BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \
230 , static \
231 )
232
233# define BOOST_PARAMETER_MEMBER_FUNCTION_NAME(name) \
234 BOOST_PP_IF( \
235 BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(name) \
236 , BOOST_PARAMETER_MEMBER_FUNCTION_STRIP_STATIC \
237 , name BOOST_PP_TUPLE_EAT(1) \
238 )(name)
239
240// Calculates [begin, end) arity range.
241
242# define BOOST_PARAMETER_ARITY_RANGE_M_optional(state) state
243# define BOOST_PARAMETER_ARITY_RANGE_M_deduced_optional(state) state
244# define BOOST_PARAMETER_ARITY_RANGE_M_required(state) BOOST_PP_INC(state)
245# define BOOST_PARAMETER_ARITY_RANGE_M_deduced_required(state) BOOST_PP_INC(state)
246
247# define BOOST_PARAMETER_ARITY_RANGE_M(s, state, x) \
248 BOOST_PP_CAT( \
249 BOOST_PARAMETER_ARITY_RANGE_M_ \
250 , BOOST_PARAMETER_FN_ARG_QUALIFIER(x) \
251 )(state)
252/**/
253
254# define BOOST_PARAMETER_ARITY_RANGE(args) \
255 ( \
256 BOOST_PP_SEQ_FOLD_LEFT(BOOST_PARAMETER_ARITY_RANGE_M, 0, args) \
257 , BOOST_PP_INC(BOOST_PP_SEQ_SIZE(args)) \
258 )
259/**/
260
261// Accessor macros for the argument specs tuple.
262# define BOOST_PARAMETER_FN_ARG_QUALIFIER(x) \
263 BOOST_PP_TUPLE_ELEM(4,0,x)
264/**/
265
266# define BOOST_PARAMETER_FN_ARG_NAME(x) \
267 BOOST_PP_TUPLE_ELEM(4,1,x)
268/**/
269
270# define BOOST_PARAMETER_FN_ARG_PRED(x) \
271 BOOST_PP_TUPLE_ELEM(4,2,x)
272/**/
273
274# define BOOST_PARAMETER_FN_ARG_DEFAULT(x) \
275 BOOST_PP_TUPLE_ELEM(4,3,x)
276/**/
277
278# define BOOST_PARAMETETER_FUNCTION_EAT_KEYWORD_QUALIFIER_out(x)
279# define BOOST_PARAMETETER_FUNCTION_EAT_KEYWORD_QUALIFIER_in_out(x)
280
281// Returns 1 if x is either "out(k)" or "in_out(k)".
282# define BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER(x) \
283 BOOST_PP_IS_EMPTY( \
284 BOOST_PP_CAT(BOOST_PARAMETETER_FUNCTION_EAT_KEYWORD_QUALIFIER_, x) \
285 ) \
286/**/
287
288# define BOOST_PARAMETETER_FUNCTION_GET_KEYWORD_QUALIFIER_out(x) x
289# define BOOST_PARAMETETER_FUNCTION_GET_KEYWORD_QUALIFIER_in_out(x) x
290# define BOOST_PARAMETER_FUNCTION_KEYWORD_GET(x) \
291 BOOST_PP_CAT(BOOST_PARAMETETER_FUNCTION_GET_KEYWORD_QUALIFIER_, x)
292/**/
293
294// Returns the keyword of x, where x is either a keyword qualifier
295// or a keyword.
296//
297// k => k
298// out(k) => k
299// in_out(k) => k
300//
301# define BOOST_PARAMETER_FUNCTION_KEYWORD(x) \
302 BOOST_PP_IF( \
303 BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER(x) \
304 , BOOST_PARAMETER_FUNCTION_KEYWORD_GET \
305 , x BOOST_PP_TUPLE_EAT(1) \
306 )(x)
307/**/
308
309# define BOOST_PARAMETER_FN_ARG_KEYWORD(x) \
310 BOOST_PARAMETER_FUNCTION_KEYWORD( \
311 BOOST_PARAMETER_FN_ARG_NAME(x) \
312 )
313
314// Builds forwarding functions.
315
316# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_TEMPLATE_Z(z, n) \
317 template<BOOST_PP_ENUM_PARAMS_Z(z, n, class ParameterArgumentType)>
318/**/
319
320# if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
321# define BOOST_PARAMETER_FUNCTION_FWD_MATCH_Z(z, name, parameters, n) \
322 , typename boost::parameter::aux::match< \
323 parameters, BOOST_PP_ENUM_PARAMS(n, ParameterArgumentType) \
324 >::type = parameters()
325# else
326# define BOOST_PARAMETER_FUNCTION_FWD_MATCH_Z(z, name, parameters, n)
327# endif
328/**/
329
330# define BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(base) \
331 BOOST_PP_CAT( \
332 boost_param_parameters_ \
333 , BOOST_PP_CAT(__LINE__, BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base)) \
334 )
335
336// Produce a name for a result type metafunction for the function
337// named base
338# define BOOST_PARAMETER_FUNCTION_RESULT_NAME(base) \
339 BOOST_PP_CAT( \
340 boost_param_result_ \
341 , BOOST_PP_CAT(__LINE__,BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base)) \
342 )
343
344// Can't do boost_param_impl_ ## basee because base might start with an underscore
345// daniel: what? how is that relevant? the reason for using CAT() is to make sure
346// base is expanded. i'm not sure we need to here, but it's more stable to do it.
347# define BOOST_PARAMETER_IMPL(base) \
348 BOOST_PP_CAT(boost_param_impl,BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base))
349
350# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION00(z, n, r, data, elem) \
351 BOOST_PP_IF( \
352 n \
353 , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_TEMPLATE_Z, BOOST_PP_TUPLE_EAT(2) \
354 )(z,n) \
355 BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(BOOST_PP_TUPLE_ELEM(7,3,data)) \
356 inline \
357 BOOST_PP_EXPR_IF(n, typename) \
358 BOOST_PARAMETER_FUNCTION_RESULT_NAME(BOOST_PP_TUPLE_ELEM(7,3,data))< \
359 BOOST_PP_EXPR_IF(n, typename) \
360 boost::parameter::aux::argument_pack< \
361 BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(BOOST_PP_TUPLE_ELEM(7,3,data)) \
362 BOOST_PP_COMMA_IF(n) \
363 BOOST_PP_IF( \
364 n, BOOST_PP_SEQ_ENUM, BOOST_PP_TUPLE_EAT(1) \
365 )(elem) \
366 >::type \
367 >::type \
368 BOOST_PARAMETER_MEMBER_FUNCTION_NAME(BOOST_PP_TUPLE_ELEM(7,3,data))( \
369 BOOST_PP_IF( \
370 n \
371 , BOOST_PP_SEQ_FOR_EACH_I_R \
372 , BOOST_PP_TUPLE_EAT(4) \
373 )( \
374 r \
375 , BOOST_PARAMETER_FUNCTION_ARGUMENT \
376 , ~ \
377 , elem \
378 ) \
379 BOOST_PP_IF(n, BOOST_PARAMETER_FUNCTION_FWD_MATCH_Z, BOOST_PP_TUPLE_EAT(4))( \
380 z \
381 , BOOST_PP_TUPLE_ELEM(7,3,data) \
382 , BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(BOOST_PP_TUPLE_ELEM(7,3,data)) \
383 , n \
384 ) \
385 ) BOOST_PP_EXPR_IF(BOOST_PP_TUPLE_ELEM(7,4,data), const) \
386 { \
387 return BOOST_PARAMETER_IMPL(BOOST_PP_TUPLE_ELEM(7,3,data))( \
388 BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(BOOST_PP_TUPLE_ELEM(7,3,data))()( \
389 BOOST_PP_ENUM_PARAMS_Z(z, n, a) \
390 ) \
391 ); \
392 }
393/**/
394
395# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION0(r, data, elem) \
396 BOOST_PARAMETER_FUNCTION_FWD_FUNCTION00( \
397 BOOST_PP_TUPLE_ELEM(7,0,data) \
398 , BOOST_PP_TUPLE_ELEM(7,1,data) \
399 , r \
400 , data \
401 , elem \
402 )
403/**/
404
405# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_ARITY_0(z, n, data) \
406 BOOST_PARAMETER_FUNCTION_FWD_FUNCTION00( \
407 z, n, BOOST_PP_DEDUCE_R() \
408 , (z, n, BOOST_PP_TUPLE_REM(5) data) \
409 , ~ \
410 )
411/**/
412
413# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_ARITY_N(z, n, data) \
414 BOOST_PP_SEQ_FOR_EACH( \
415 BOOST_PARAMETER_FUNCTION_FWD_FUNCTION0 \
416 , (z, n, BOOST_PP_TUPLE_REM(5) data) \
417 , BOOST_PP_SEQ_FOR_EACH_PRODUCT( \
418 BOOST_PARAMETER_FUNCTION_FWD_PRODUCT \
419 , BOOST_PP_SEQ_FIRST_N( \
420 n, BOOST_PP_TUPLE_ELEM(5,3,data) \
421 ) \
422 ) \
423 )
424/**/
425
426# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTION(z, n, data) \
427 BOOST_PP_IF( \
428 n \
429 , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_ARITY_N \
430 , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_ARITY_0 \
431 )(z,n,data) \
432/**/
433
434# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS0( \
435 result,name,args,const_,combinations,range \
436) \
437 BOOST_PP_REPEAT_FROM_TO( \
438 BOOST_PP_TUPLE_ELEM(2,0,range), BOOST_PP_TUPLE_ELEM(2,1,range) \
439 , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION \
440 , (result,name,const_,combinations,BOOST_PP_TUPLE_ELEM(2,1,range)) \
441 )
442/**/
443
444# define BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS(result,name,args, const_, combinations) \
445 BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS0( \
446 result, name, args, const_, combinations, BOOST_PARAMETER_ARITY_RANGE(args) \
447 )
448/**/
449
450// Builds boost::parameter::parameters<> specialization
451# define BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_optional(tag) \
452 optional<tag
453
454# define BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_required(tag) \
455 required<tag
456
457# define BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_deduced_optional(tag) \
458 optional<boost::parameter::deduced<tag>
459
460# define BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_deduced_required(tag) \
461 required<boost::parameter::deduced<tag>
462
463# if !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
464
465# define BOOST_PARAMETER_FUNCTION_PARAMETERS_M(r,tag_namespace,i,elem) \
466 BOOST_PP_COMMA_IF(i) \
467 boost::parameter::BOOST_PP_CAT( \
468 BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_ \
469 , BOOST_PARAMETER_FN_ARG_QUALIFIER(elem) \
470 )( \
471 tag_namespace::BOOST_PARAMETER_FUNCTION_KEYWORD( \
472 BOOST_PARAMETER_FN_ARG_KEYWORD(elem) \
473 ) \
474 ) \
475 , typename boost::parameter::aux::unwrap_predicate< \
476 void BOOST_PARAMETER_FN_ARG_PRED(elem) \
477 >::type \
478 >
479# elif BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564))
480# define BOOST_PARAMETER_FUNCTION_PARAMETERS_M(r,tag_namespace,i,elem) \
481 BOOST_PP_COMMA_IF(i) \
482 boost::parameter::BOOST_PP_CAT( \
483 BOOST_PARAMETER_FUNCTION_PARAMETERS_QUALIFIER_ \
484 , BOOST_PARAMETER_FN_ARG_QUALIFIER(elem) \
485 )( \
486 tag_namespace::BOOST_PARAMETER_FUNCTION_KEYWORD( \
487 BOOST_PARAMETER_FN_ARG_KEYWORD(elem) \
488 ) \
489 ) \
490 , boost::mpl::always<boost::mpl::true_> \
491 >
492# endif
493
494# define BOOST_PARAMETER_FUNCTION_PARAMETERS(tag_namespace, base, args) \
495 template <class BoostParameterDummy> \
496 struct BOOST_PP_CAT( \
497 BOOST_PP_CAT(boost_param_params_, __LINE__) \
498 , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \
499 ) : boost::parameter::parameters< \
500 BOOST_PP_SEQ_FOR_EACH_I( \
501 BOOST_PARAMETER_FUNCTION_PARAMETERS_M, tag_namespace, args \
502 ) \
503 > \
504 {}; \
505 \
506 typedef BOOST_PP_CAT( \
507 BOOST_PP_CAT(boost_param_params_, __LINE__) \
508 , BOOST_PARAMETER_MEMBER_FUNCTION_NAME(base) \
509 )<int>
510
511// Defines result type metafunction
512# define BOOST_PARAMETER_FUNCTION_RESULT_ARG(z, _, i, x) \
513 BOOST_PP_COMMA_IF(i) class BOOST_PP_TUPLE_ELEM(3,1,x)
514/**/
515
516# define BOOST_PARAMETER_FUNCTION_RESULT_(result, name, args) \
517 template <class Args> \
518 struct BOOST_PARAMETER_FUNCTION_RESULT_NAME(name) \
519 { \
520 typedef typename BOOST_PARAMETER_PARENTHESIZED_TYPE(result) type; \
521 };
522
523// Defines implementation function
524# define BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name) \
525 template <class Args> \
526 typename BOOST_PARAMETER_FUNCTION_RESULT_NAME(name)< \
527 Args \
528 >::type BOOST_PARAMETER_IMPL(name)(Args const& args)
529
530# define BOOST_PARAMETER_FUNCTION_IMPL_FWD(name) \
531 BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name);
532/**/
533
534# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG_required(state, arg) \
535 ( \
536 BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 0, state)) \
537 , BOOST_PP_SEQ_PUSH_BACK(BOOST_PP_TUPLE_ELEM(4, 1, state), arg) \
538 , BOOST_PP_TUPLE_ELEM(4, 2, state) \
539 , BOOST_PP_TUPLE_ELEM(4, 3, state) \
540 )
541
542# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG_deduced_required(state, arg) \
543 BOOST_PARAMETER_FUNCTION_SPLIT_ARG_required(state, arg)
544
545# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG_optional(state, arg) \
546 ( \
547 BOOST_PP_TUPLE_ELEM(4, 0, state) \
548 , BOOST_PP_TUPLE_ELEM(4, 1, state) \
549 , BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 2, state)) \
550 , BOOST_PP_SEQ_PUSH_BACK(BOOST_PP_TUPLE_ELEM(4, 3, state), arg) \
551 )
552
553# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG_deduced_optional(state, arg) \
554 BOOST_PARAMETER_FUNCTION_SPLIT_ARG_optional(state, arg)
555
556# define BOOST_PARAMETER_FUNCTION_SPLIT_ARG(s, state, arg) \
557 BOOST_PP_CAT( \
558 BOOST_PARAMETER_FUNCTION_SPLIT_ARG_ \
559 , BOOST_PARAMETER_FN_ARG_QUALIFIER(arg) \
560 )(state, arg)
561
562// Returns (required_count, required, optional_count, optionals) tuple
563# define BOOST_PARAMETER_FUNCTION_SPLIT_ARGS(args) \
564 BOOST_PP_SEQ_FOLD_LEFT( \
565 BOOST_PARAMETER_FUNCTION_SPLIT_ARG \
566 , (0,BOOST_PP_SEQ_NIL, 0,BOOST_PP_SEQ_NIL) \
567 , args \
568 )
569
570# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG_NAME(keyword) \
571 BOOST_PP_CAT(BOOST_PP_CAT(keyword,_),type)
572
573// Helpers used as parameters to BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS.
574# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_TEMPLATE_ARG(r, _, arg) \
575 , class BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG_NAME( \
576 BOOST_PARAMETER_FN_ARG_KEYWORD(arg) \
577 )
578
579# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG(r, _, arg) \
580 , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG_NAME( \
581 BOOST_PARAMETER_FN_ARG_KEYWORD(arg) \
582 )& BOOST_PARAMETER_FN_ARG_KEYWORD(arg)
583
584# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_PARAMETER(r, _, arg) \
585 , BOOST_PARAMETER_FN_ARG_KEYWORD(arg)
586
587// Produces a name for the dispatch functions.
588# define BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name) \
589 BOOST_PP_CAT( \
590 boost_param_default_ \
591 , BOOST_PP_CAT(__LINE__, BOOST_PARAMETER_MEMBER_FUNCTION_NAME(name)) \
592 )
593
594// Helper macro used below to produce lists based on the keyword argument
595// names. macro is applied to every element. n is the number of
596// optional arguments that should be included.
597# define BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS(macro, n, split_args) \
598 BOOST_PP_SEQ_FOR_EACH( \
599 macro \
600 , ~ \
601 , BOOST_PP_TUPLE_ELEM(4,1,split_args) \
602 ) \
603 BOOST_PP_SEQ_FOR_EACH( \
604 macro \
605 , ~ \
606 , BOOST_PP_SEQ_FIRST_N( \
607 BOOST_PP_SUB(BOOST_PP_TUPLE_ELEM(4,2,split_args), n) \
608 , BOOST_PP_TUPLE_ELEM(4,3,split_args) \
609 ) \
610 )
611
612// Generates a keyword | default expression.
613# define BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT(arg, tag_namespace) \
614 boost::parameter::keyword< \
615 tag_namespace::BOOST_PARAMETER_FN_ARG_KEYWORD(arg) \
616 >::instance | boost::parameter::aux::use_default_tag()
617
618# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_GET_ARG(arg, tag_ns) \
619 BOOST_PARAMETER_FUNCTION_CAST( \
620 args[ \
621 BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT( \
622 arg, tag_ns \
623 ) \
624 ] \
625 , BOOST_PARAMETER_FN_ARG_PRED(arg) \
626 , Args \
627 )
628
629# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_BODY(name, n, split_args, tag_namespace) \
630 { \
631 return BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \
632 (ResultType(*)())0 \
633 , args \
634 , 0L \
635 BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
636 BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_PARAMETER \
637 , n \
638 , split_args \
639 ) \
640 , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_GET_ARG( \
641 BOOST_PP_SEQ_ELEM( \
642 BOOST_PP_SUB(BOOST_PP_TUPLE_ELEM(4,2,split_args), n) \
643 , BOOST_PP_TUPLE_ELEM(4,3,split_args) \
644 ) \
645 , tag_namespace \
646 ) \
647 ); \
648 }
649
650# define BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_ACTUAL_DEFAULT(arg) \
651 BOOST_PARAMETER_FUNCTION_CAST( \
652 boost::parameter::aux::as_lvalue(BOOST_PARAMETER_FN_ARG_DEFAULT(arg), 0L) \
653 , BOOST_PARAMETER_FN_ARG_PRED(arg) \
654 , Args \
655 )
656
657# define BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT_BODY(name, n, split_args, tag_ns, const_) \
658 template < \
659 class ResultType \
660 , class Args \
661 BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
662 BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_TEMPLATE_ARG \
663 , BOOST_PP_INC(n) \
664 , split_args \
665 ) \
666 > \
667 BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \
668 ResultType BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \
669 ResultType(*)() \
670 , Args const& args \
671 , long \
672 BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
673 BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG \
674 , BOOST_PP_INC(n) \
675 , split_args \
676 ) \
677 , boost::parameter::aux::use_default_tag \
678 ) BOOST_PP_EXPR_IF(const_, const) \
679 { \
680 return BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \
681 (ResultType(*)())0 \
682 , args \
683 , 0L \
684 BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
685 BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_PARAMETER \
686 , BOOST_PP_INC(n) \
687 , split_args \
688 ) \
689 , BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_ACTUAL_DEFAULT( \
690 BOOST_PP_SEQ_ELEM( \
691 BOOST_PP_SUB(BOOST_PP_TUPLE_ELEM(4,2,split_args), BOOST_PP_INC(n)) \
692 , BOOST_PP_TUPLE_ELEM(4,3,split_args) \
693 ) \
694 ) \
695 ); \
696 }
697
698// Produces a forwarding layer in the default evaluation machine.
699//
700// data is a tuple:
701//
702// (name, split_args)
703//
704// Where name is the base name of the function, and split_args is a tuple:
705//
706// (required_count, required_args, optional_count, required_args)
707//
708
709
710// defines the actual function body for BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION below.
711# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION0(z, n, data) \
712 template < \
713 class ResultType \
714 , class Args \
715 BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
716 BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_TEMPLATE_ARG \
717 , n \
718 , BOOST_PP_TUPLE_ELEM(5,1,data) \
719 ) \
720 > \
721 BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(BOOST_PP_TUPLE_ELEM(5,0,data)) \
722 ResultType BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(BOOST_PP_TUPLE_ELEM(5,0,data))( \
723 ResultType(*)() \
724 , Args const& args \
725 , int \
726 BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
727 BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG \
728 , n \
729 , BOOST_PP_TUPLE_ELEM(5,1,data) \
730 ) \
731 ) BOOST_PP_EXPR_IF(BOOST_PP_TUPLE_ELEM(5,2,data), const) \
732 BOOST_PP_IF( \
733 n \
734 , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_BODY \
735 , ; BOOST_PP_TUPLE_EAT(4) \
736 )( \
737 BOOST_PP_TUPLE_ELEM(5,0,data) \
738 , n \
739 , BOOST_PP_TUPLE_ELEM(5,1,data) \
740 , BOOST_PP_TUPLE_ELEM(5,3,data) \
741 )
742
743# define BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION(z, n, data) \
744 BOOST_PP_IF( \
745 BOOST_PP_AND( \
746 BOOST_PP_NOT(n) \
747 , BOOST_PP_TUPLE_ELEM(5,4,data) \
748 ) \
749 , BOOST_PP_TUPLE_EAT(3) \
750 , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION0 \
751 )(z, n, data) \
752 BOOST_PP_IF( \
753 BOOST_PP_EQUAL(n, BOOST_PP_TUPLE_ELEM(4,2,BOOST_PP_TUPLE_ELEM(5,1,data))) \
754 , BOOST_PP_TUPLE_EAT(5) \
755 , BOOST_PARAMETER_FUNCTION_DEFAULT_EVAL_DEFAULT_BODY \
756 )( \
757 BOOST_PP_TUPLE_ELEM(5,0,data) \
758 , n \
759 , BOOST_PP_TUPLE_ELEM(5,1,data) \
760 , BOOST_PP_TUPLE_ELEM(5,3,data) \
761 , BOOST_PP_TUPLE_ELEM(5,2,data) \
762 )
763
764# define BOOST_PARAMETER_FUNCTION_DEFAULT_GET_ARG(r, tag_ns, arg) \
765 , BOOST_PARAMETER_FUNCTION_CAST( \
766 args[ \
767 boost::parameter::keyword<tag_ns::BOOST_PARAMETER_FN_ARG_KEYWORD(arg)>::instance \
768 ] \
769 , BOOST_PARAMETER_FN_ARG_PRED(arg) \
770 , Args \
771 )
772
773// Generates the function template that recives a ArgumentPack, and then
774// goes on to call the layers of overloads generated by
775// BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER.
776# define BOOST_PARAMETER_FUNCTION_INITIAL_DISPATCH_FUNCTION(name, split_args, const_, tag_ns) \
777 template <class Args> \
778 typename BOOST_PARAMETER_FUNCTION_RESULT_NAME(name)<Args>::type \
779 BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \
780 BOOST_PARAMETER_IMPL(name)(Args const& args) BOOST_PP_EXPR_IF(const_, const) \
781 { \
782 return BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \
783 (typename BOOST_PARAMETER_FUNCTION_RESULT_NAME(name)<Args>::type(*)())0 \
784 , args \
785 , 0L \
786 \
787 BOOST_PP_SEQ_FOR_EACH( \
788 BOOST_PARAMETER_FUNCTION_DEFAULT_GET_ARG \
789 , tag_ns \
790 , BOOST_PP_TUPLE_ELEM(4,1,split_args) \
791 ) \
792 \
793 ); \
794 }
795
796// Helper for BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER below.
797# define BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER_AUX( \
798 name, split_args, skip_fwd_decl, const_, tag_namespace \
799 ) \
800 BOOST_PP_REPEAT_FROM_TO( \
801 0 \
802 , BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(4, 2, split_args)) \
803 , BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION \
804 , (name, split_args, const_, tag_namespace, skip_fwd_decl) \
805 ) \
806 \
807 BOOST_PARAMETER_FUNCTION_INITIAL_DISPATCH_FUNCTION(name, split_args, const_, tag_namespace) \
808\
809 template < \
810 class ResultType \
811 , class Args \
812 BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
813 BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_TEMPLATE_ARG \
814 , 0 \
815 , split_args \
816 ) \
817 > \
818 BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) \
819 ResultType BOOST_PARAMETER_FUNCTION_DEFAULT_NAME(name)( \
820 ResultType(*)() \
821 , Args const& \
822 , int \
823 BOOST_PARAMETER_FUNCTION_DEFAULT_ARGUMENTS( \
824 BOOST_PARAMETER_FUNCTION_DEFAULT_FUNCTION_ARG \
825 , 0 \
826 , split_args \
827 ) \
828 ) BOOST_PP_EXPR_IF(const_, const)
829
830// Generates a bunch of forwarding functions that each extract
831// one more argument.
832# define BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER(name, args, skip_fwd_decl, const_, tag_ns) \
833 BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER_AUX( \
834 name, BOOST_PARAMETER_FUNCTION_SPLIT_ARGS(args), skip_fwd_decl, const_, tag_ns \
835 )
836/**/
837
838// Defines the result metafunction and the parameters specialization.
839# define BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args) \
840 BOOST_PARAMETER_FUNCTION_RESULT_(result, name, args) \
841 \
842 BOOST_PARAMETER_FUNCTION_PARAMETERS(tag_namespace, name, args) \
843 BOOST_PARAMETER_FUNCTION_PARAMETERS_NAME(name); \
844
845// Helper for BOOST_PARAMETER_FUNCTION below.
846# define BOOST_PARAMETER_FUNCTION_AUX(result, name, tag_namespace, args) \
847 BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args) \
848 BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name); \
849\
850 BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS( \
851 result, name, args, 0 \
852 , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args) \
853 ) \
854 \
855 BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER(name, args, 0, 0, tag_namespace)
856
857// Defines a Boost.Parameter enabled function with the new syntax.
858# define BOOST_PARAMETER_FUNCTION(result, name, tag_namespace, args) \
859 BOOST_PARAMETER_FUNCTION_AUX( \
860 result, name, tag_namespace \
861 , BOOST_PARAMETER_FLATTEN(3, 2, 3, args) \
862 ) \
863/**/
864
865// Defines a Boost.Parameter enabled function.
866# define BOOST_PARAMETER_BASIC_FUNCTION_AUX(result, name, tag_namespace, args) \
867 BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args) \
868 \
869 BOOST_PARAMETER_FUNCTION_IMPL_FWD(name) \
870 \
871 BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS( \
872 result, name, args, 0 \
873 , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args) \
874 ) \
875 \
876 BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name)
877
878# define BOOST_PARAMETER_BASIC_FUNCTION(result, name, tag_namespace, args) \
879 BOOST_PARAMETER_BASIC_FUNCTION_AUX( \
880 result, name, tag_namespace \
881 , BOOST_PARAMETER_FLATTEN(2, 2, 3, args) \
882 ) \
883/**/
884
885// Defines a Boost.Parameter enabled member function.
886# define BOOST_PARAMETER_BASIC_MEMBER_FUNCTION_AUX(result, name, tag_namespace, args, const_) \
887 BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args) \
888 \
889 BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS( \
890 result, name, args, const_ \
891 , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args) \
892 ) \
893 \
894 BOOST_PARAMETER_FUNCTION_IMPL_HEAD(name) BOOST_PP_EXPR_IF(const_, const) \
895/**/
896
897# define BOOST_PARAMETER_BASIC_MEMBER_FUNCTION(result, name, tag_namespace, args) \
898 BOOST_PARAMETER_BASIC_MEMBER_FUNCTION_AUX( \
899 result, name, tag_namespace \
900 , BOOST_PARAMETER_FLATTEN(2, 2, 3, args) \
901 , 0 \
902 )
903/**/
904
905# define BOOST_PARAMETER_BASIC_CONST_MEMBER_FUNCTION(result, name, tag_namespace, args) \
906 BOOST_PARAMETER_BASIC_MEMBER_FUNCTION_AUX( \
907 result, name, tag_namespace \
908 , BOOST_PARAMETER_FLATTEN(2, 2, 3, args) \
909 , 1 \
910 )
911/**/
912
913
914
915# define BOOST_PARAMETER_MEMBER_FUNCTION_AUX(result, name, tag_namespace, const_, args) \
916 BOOST_PARAMETER_FUNCTION_HEAD(result, name, tag_namespace, args) \
917\
918 BOOST_PARAMETER_FUNCTION_FWD_FUNCTIONS( \
919 result, name, args, const_ \
920 , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args) \
921 ) \
922 \
923 BOOST_PARAMETER_FUNCTION_DEFAULT_LAYER(name, args, 1, const_, tag_namespace)
924
925// Defines a Boost.Parameter enabled function with the new syntax.
926# define BOOST_PARAMETER_MEMBER_FUNCTION(result, name, tag_namespace, args) \
927 BOOST_PARAMETER_MEMBER_FUNCTION_AUX( \
928 result, name, tag_namespace, 0 \
929 , BOOST_PARAMETER_FLATTEN(3, 2, 3, args) \
930 ) \
931/**/
932
933# define BOOST_PARAMETER_CONST_MEMBER_FUNCTION(result, name, tag_namespace, args) \
934 BOOST_PARAMETER_MEMBER_FUNCTION_AUX( \
935 result, name, tag_namespace, 1 \
936 , BOOST_PARAMETER_FLATTEN(3, 2, 3, args) \
937 ) \
938/**/
939
940// Defines a Boost.Parameter enabled constructor.
941
942# define BOOST_PARAMETER_FUNCTION_ARGUMENT(r, _, i, elem) \
943 BOOST_PP_COMMA_IF(i) elem& BOOST_PP_CAT(a, i)
944/**/
945
946# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR00(z, n, r, data, elem) \
947 BOOST_PP_IF( \
948 n \
949 , BOOST_PARAMETER_FUNCTION_FWD_FUNCTION_TEMPLATE_Z, BOOST_PP_TUPLE_EAT(2) \
950 )(z, n) \
951 BOOST_PP_EXPR_IF(BOOST_PP_EQUAL(n,1), explicit) \
952 BOOST_PP_TUPLE_ELEM(6,2,data)( \
953 BOOST_PP_IF( \
954 n \
955 , BOOST_PP_SEQ_FOR_EACH_I_R \
956 , BOOST_PP_TUPLE_EAT(4) \
957 )( \
958 r \
959 , BOOST_PARAMETER_FUNCTION_ARGUMENT \
960 , ~ \
961 , elem \
962 ) \
963 BOOST_PP_IF(n, BOOST_PARAMETER_FUNCTION_FWD_MATCH_Z, BOOST_PP_TUPLE_EAT(4))( \
964 z \
965 , BOOST_PP_TUPLE_ELEM(6,3,data) \
966 , BOOST_PP_CAT(constructor_parameters, __LINE__) \
967 , n \
968 ) \
969 ) \
970 : BOOST_PARAMETER_PARENTHESIZED_TYPE(BOOST_PP_TUPLE_ELEM(6,3,data)) ( \
971 BOOST_PP_CAT(constructor_parameters, __LINE__)()( \
972 BOOST_PP_ENUM_PARAMS_Z(z, n, a) \
973 ) \
974 ) \
975 {}
976/**/
977
978# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR0(r, data, elem) \
979 BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR00( \
980 BOOST_PP_TUPLE_ELEM(6,0,data) \
981 , BOOST_PP_TUPLE_ELEM(6,1,data) \
982 , r \
983 , data \
984 , elem \
985 )
986/**/
987
988# define BOOST_PARAMETER_FUNCTION_FWD_PRODUCT(r, product) \
989 (product)
990/**/
991
992# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR_ARITY_0(z, n, data) \
993 BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR00( \
994 z, n, BOOST_PP_DEDUCE_R() \
995 , (z, n, BOOST_PP_TUPLE_REM(4) data) \
996 , ~ \
997 )
998/**/
999
1000# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR_ARITY_N(z, n, data) \
1001 BOOST_PP_SEQ_FOR_EACH( \
1002 BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR0 \
1003 , (z, n, BOOST_PP_TUPLE_REM(4) data) \
1004 , BOOST_PP_SEQ_FOR_EACH_PRODUCT( \
1005 BOOST_PARAMETER_FUNCTION_FWD_PRODUCT \
1006 , BOOST_PP_SEQ_FIRST_N( \
1007 n, BOOST_PP_TUPLE_ELEM(4,2,data) \
1008 ) \
1009 ) \
1010 )
1011/**/
1012
1013# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR(z, n, data) \
1014 BOOST_PP_IF( \
1015 n \
1016 , BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR_ARITY_N \
1017 , BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR_ARITY_0 \
1018 )(z,n,data) \
1019/**/
1020
1021# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTORS0(class_,base,args,combinations,range) \
1022 BOOST_PP_REPEAT_FROM_TO( \
1023 BOOST_PP_TUPLE_ELEM(2,0,range), BOOST_PP_TUPLE_ELEM(2,1,range) \
1024 , BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTOR \
1025 , (class_,base,combinations,BOOST_PP_TUPLE_ELEM(2,1,range)) \
1026 )
1027/**/
1028
1029# define BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTORS(class_,base,args,combinations) \
1030 BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTORS0( \
1031 class_, base, args, combinations, BOOST_PARAMETER_ARITY_RANGE(args) \
1032 )
1033/**/
1034
1035# define BOOST_PARAMETER_CONSTRUCTOR_AUX(class_, base, tag_namespace, args) \
1036 BOOST_PARAMETER_FUNCTION_PARAMETERS(tag_namespace, ctor, args) \
1037 BOOST_PP_CAT(constructor_parameters, __LINE__); \
1038\
1039 BOOST_PARAMETER_FUNCTION_FWD_CONSTRUCTORS( \
1040 class_, base, args \
1041 , BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args) \
1042 ) \
1043/**/
1044
1045# define BOOST_PARAMETER_CONSTRUCTOR(class_, base, tag_namespace, args) \
1046 BOOST_PARAMETER_CONSTRUCTOR_AUX( \
1047 class_, base, tag_namespace \
1048 , BOOST_PARAMETER_FLATTEN(2, 2, 3, args) \
1049 )
1050/**/
1051
1052# ifndef BOOST_NO_FUNCTION_TEMPLATE_ORDERING
1053# define BOOST_PARAMETER_FUNCTION_FWD_COMBINATION(r, _, i, elem) \
1054 (BOOST_PP_IF( \
1055 BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER( \
1056 BOOST_PARAMETER_FN_ARG_NAME(elem) \
1057 ) \
1058 , (const ParameterArgumentType ## i)(ParameterArgumentType ## i) \
1059 , (const ParameterArgumentType ## i) \
1060 ))
1061// No partial ordering. This feature doesn't work.
1062# else
1063# define BOOST_PARAMETER_FUNCTION_FWD_COMBINATION(r, _, i, elem) \
1064 (BOOST_PP_IF( \
1065 BOOST_PARAMETER_FUNCTION_IS_KEYWORD_QUALIFIER( \
1066 BOOST_PARAMETER_FN_ARG_NAME(elem) \
1067 ) \
1068 , (ParameterArgumentType ## i) \
1069 , (const ParameterArgumentType ## i) \
1070 ))
1071# endif
1072
1073# define BOOST_PARAMETER_FUNCTION_FWD_COMBINATIONS(args) \
1074 BOOST_PP_SEQ_FOR_EACH_I(BOOST_PARAMETER_FUNCTION_FWD_COMBINATION, ~, args)
1075
1076#endif // BOOST_PARAMETER_PREPROCESSOR_060206_HPP
1077