1 | // Copyright Daniel Wallin 2005. |
2 | // Distributed under the Boost Software License, Version 1.0. |
3 | // (See accompanying file LICENSE_1_0.txt or copy at |
4 | // http://www.boost.org/LICENSE_1_0.txt) |
5 | |
6 | #ifndef BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FLATTEN_HPP |
7 | #define BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FLATTEN_HPP |
8 | |
9 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT_required required, |
10 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT_optional optional, |
11 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT_deduced deduced, |
12 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_IDENTITY(x) x |
13 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC0_DUMMY_ELEM(z, n, data) ~ |
14 | |
15 | #include <boost/preprocessor/cat.hpp> |
16 | |
17 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT(sub) \ |
18 | BOOST_PP_CAT(BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT_, sub) |
19 | /**/ |
20 | |
21 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_AS_DEDUCED(x) \ |
22 | BOOST_PP_CAT(deduced_, x) |
23 | /**/ |
24 | |
25 | #include <boost/preprocessor/detail/split.hpp> |
26 | |
27 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_QUALIFIER(sub) \ |
28 | BOOST_PP_SPLIT(0, BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT(sub)) |
29 | /**/ |
30 | |
31 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_ARGS(sub) \ |
32 | BOOST_PP_SPLIT(1, BOOST_PARAMETER_AUX_PP_FLATTEN_SPLIT(sub)) |
33 | /**/ |
34 | |
35 | #include <boost/preprocessor/tuple/elem.hpp> |
36 | |
37 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_ARITY_optional(arities) \ |
38 | BOOST_PP_TUPLE_ELEM(3, 0, arities) |
39 | /**/ |
40 | |
41 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_ARITY_required(arities) \ |
42 | BOOST_PP_TUPLE_ELEM(3, 1, arities) |
43 | /**/ |
44 | |
45 | #include <boost/preprocessor/arithmetic/sub.hpp> |
46 | #include <boost/preprocessor/repetition/enum_trailing.hpp> |
47 | #include <boost/preprocessor/tuple/rem.hpp> |
48 | |
49 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC0(r, n, elem, data) \ |
50 | (( \ |
51 | BOOST_PP_TUPLE_ELEM(3, 2, data) \ |
52 | , BOOST_PP_TUPLE_REM(BOOST_PP_TUPLE_ELEM(3, 0, data)) elem \ |
53 | BOOST_PP_ENUM_TRAILING( \ |
54 | BOOST_PP_SUB( \ |
55 | BOOST_PP_TUPLE_ELEM(3, 1, data) \ |
56 | , BOOST_PP_TUPLE_ELEM(3, 0, data) \ |
57 | ) \ |
58 | , BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC0_DUMMY_ELEM \ |
59 | , ~ \ |
60 | ) \ |
61 | )) |
62 | /**/ |
63 | |
64 | #include <boost/parameter/aux_/preprocessor/impl/for_each.hpp> |
65 | |
66 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_AUX( \ |
67 | r, arity, max_arity, spec, xform \ |
68 | ) \ |
69 | BOOST_PARAMETER_AUX_PP_FOR_EACH_R( \ |
70 | r \ |
71 | , arity \ |
72 | , BOOST_PARAMETER_AUX_PP_FLATTEN_ARGS(spec) \ |
73 | , ( \ |
74 | arity \ |
75 | , max_arity \ |
76 | , xform(BOOST_PARAMETER_AUX_PP_FLATTEN_QUALIFIER(spec)) \ |
77 | ) \ |
78 | , BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC0 \ |
79 | ) |
80 | /**/ |
81 | |
82 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_optional(r, arities, spec) \ |
83 | BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_AUX( \ |
84 | r \ |
85 | , BOOST_PP_CAT( \ |
86 | BOOST_PARAMETER_AUX_PP_FLATTEN_ARITY_ \ |
87 | , BOOST_PARAMETER_AUX_PP_FLATTEN_QUALIFIER(spec) \ |
88 | )(arities) \ |
89 | , BOOST_PP_TUPLE_ELEM(3, 2, arities) \ |
90 | , spec \ |
91 | , BOOST_PARAMETER_AUX_PP_FLATTEN_IDENTITY \ |
92 | ) |
93 | /**/ |
94 | |
95 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_required(r, arities, spec) \ |
96 | BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_optional(r, arities, spec) |
97 | /**/ |
98 | |
99 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_deduced_M(r, arities, n, spec) \ |
100 | BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_AUX( \ |
101 | r \ |
102 | , BOOST_PP_CAT( \ |
103 | BOOST_PARAMETER_AUX_PP_FLATTEN_ARITY_ \ |
104 | , BOOST_PARAMETER_AUX_PP_FLATTEN_QUALIFIER(spec) \ |
105 | )(arities) \ |
106 | , BOOST_PP_TUPLE_ELEM(3, 2, arities) \ |
107 | , spec \ |
108 | , BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_AS_DEDUCED \ |
109 | ) |
110 | /**/ |
111 | |
112 | #include <boost/preprocessor/seq/for_each_i.hpp> |
113 | |
114 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_deduced(r, arities, spec) \ |
115 | BOOST_PP_SEQ_FOR_EACH_I_R( \ |
116 | r \ |
117 | , BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_deduced_M \ |
118 | , arities \ |
119 | , BOOST_PARAMETER_AUX_PP_FLATTEN_ARGS(spec) \ |
120 | ) |
121 | /**/ |
122 | |
123 | #define BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC(r, arities, spec) \ |
124 | BOOST_PP_CAT( \ |
125 | BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC_ \ |
126 | , BOOST_PARAMETER_AUX_PP_FLATTEN_QUALIFIER(spec) \ |
127 | )(r, arities, spec) |
128 | /**/ |
129 | |
130 | #include <boost/preprocessor/seq/for_each.hpp> |
131 | |
132 | #define BOOST_PARAMETER_AUX_PP_FLATTEN( \ |
133 | opt_arity, req_arity, wanted_arity, specs \ |
134 | ) \ |
135 | BOOST_PP_SEQ_FOR_EACH( \ |
136 | BOOST_PARAMETER_AUX_PP_FLATTEN_SPEC \ |
137 | , (opt_arity, req_arity, wanted_arity) \ |
138 | , specs \ |
139 | ) |
140 | /**/ |
141 | |
142 | #endif // include guard |
143 | |
144 | |