• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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_FOR_EACH_HPP
7 #define BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FOR_EACH_HPP
8 
9 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_head_aux2(x, y) (x, y), ~
10 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_head_aux3(x, y, z) (x, y, z), ~
11 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_head_aux4(x, y, z, u) (x, y, z, u), ~
12 
13 #define                                                                      \
14 BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux_BOOST_PARAMETER_AUX_PP_FOR_EACH_END_S
15 /**/
16 
17 #include <boost/preprocessor/detail/split.hpp>
18 
19 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_SPLIT_FIRST(x)                  \
20     BOOST_PP_SPLIT(0, x)
21 /**/
22 
23 #include <boost/preprocessor/cat.hpp>
24 
25 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_head(n, x)                           \
26     BOOST_PP_SPLIT(                                                          \
27         0                                                                    \
28       , BOOST_PP_CAT(BOOST_PARAMETER_AUX_PP_FOR_EACH_head_aux, n) x          \
29     )
30 /**/
31 
32 #include <boost/preprocessor/facilities/is_empty.hpp>
33 #include <boost/preprocessor/logical/not.hpp>
34 
35 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux_check(x)                    \
36     BOOST_PP_NOT(BOOST_PP_IS_EMPTY(                                          \
37         BOOST_PP_CAT(BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux_, x)           \
38     )), ~
39 /**/
40 
41 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux2(x, y)                      \
42     BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux_check(x)
43 /**/
44 
45 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux3(x, y, z)                   \
46     BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux_check(x)
47 /**/
48 
49 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux4(x, y, z, u)                \
50     BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux_check(x)
51 /**/
52 
53 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux0(n, x)                      \
54     BOOST_PP_CAT(BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux, n) x
55 /**/
56 
57 #include <boost/preprocessor/tuple/elem.hpp>
58 
59 #if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
60 
61 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_pred(r, state)                       \
62     BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_SPLIT_FIRST(                        \
63         BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux0(                           \
64             BOOST_PP_TUPLE_ELEM(5, 3, state)                                 \
65           , BOOST_PP_TUPLE_ELEM(5, 0, state)                                 \
66         )                                                                    \
67     )
68 /**/
69 
70 #else   // !(BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC())
71 
72 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_pred(r, state)                       \
73     BOOST_PP_SPLIT(                                                          \
74         0                                                                    \
75       , BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux0(                           \
76             BOOST_PP_TUPLE_ELEM(5, 3, state)                                 \
77           , BOOST_PP_TUPLE_ELEM(5, 0, state)                                 \
78         )                                                                    \
79     )
80 /**/
81 
82 #endif  // BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
83 
84 #include <boost/preprocessor/arithmetic/inc.hpp>
85 #include <boost/preprocessor/tuple/eat.hpp>
86 
87 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_op(r, state)                         \
88     (                                                                        \
89         BOOST_PP_TUPLE_EAT(BOOST_PP_TUPLE_ELEM(5, 3, state))                 \
90             BOOST_PP_TUPLE_ELEM(5, 0, state)                                 \
91       , BOOST_PP_TUPLE_ELEM(5, 1, state)                                     \
92       , BOOST_PP_TUPLE_ELEM(5, 2, state)                                     \
93       , BOOST_PP_TUPLE_ELEM(5, 3, state)                                     \
94       , BOOST_PP_INC(BOOST_PP_TUPLE_ELEM(5, 4, state))                       \
95     )
96 /**/
97 
98 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_macro(r, state)                      \
99     BOOST_PP_TUPLE_ELEM(5, 2, state)(                                        \
100         r                                                                    \
101       , BOOST_PP_TUPLE_ELEM(5, 4, state)                                     \
102       , BOOST_PARAMETER_AUX_PP_FOR_EACH_head(                                \
103             BOOST_PP_TUPLE_ELEM(5, 3, state)                                 \
104           , BOOST_PP_TUPLE_ELEM(5, 0, state)                                 \
105         )                                                                    \
106       , BOOST_PP_TUPLE_ELEM(5, 1, state)                                     \
107     )
108 /**/
109 
110 #include <boost/preprocessor/punctuation/comma_if.hpp>
111 
112 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_build_end_sentinel(z, n, text)       \
113     BOOST_PP_COMMA_IF(n) BOOST_PARAMETER_AUX_PP_FOR_EACH_END_S
114 /**/
115 
116 #include <boost/preprocessor/repetition/repeat.hpp>
117 
118 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_build_end_sentinel_tuple(arity)      \
119     (                                                                        \
120         BOOST_PP_REPEAT(                                                     \
121             arity, BOOST_PARAMETER_AUX_PP_FOR_EACH_build_end_sentinel, _     \
122         )                                                                    \
123     )
124 /**/
125 
126 #include <boost/preprocessor/repetition/for.hpp>
127 
128 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_R(r, arity, list, data, macro)       \
129     BOOST_PP_CAT(BOOST_PP_FOR_, r)(                                          \
130         (list                                                                \
131             BOOST_PARAMETER_AUX_PP_FOR_EACH_build_end_sentinel_tuple(arity)  \
132           , data                                                             \
133           , macro                                                            \
134           , arity                                                            \
135           , 0                                                                \
136         )                                                                    \
137       , BOOST_PARAMETER_AUX_PP_FOR_EACH_pred                                 \
138       , BOOST_PARAMETER_AUX_PP_FOR_EACH_op                                   \
139       , BOOST_PARAMETER_AUX_PP_FOR_EACH_macro                                \
140     )
141 /**/
142 
143 #include <boost/preprocessor/repetition/deduce_r.hpp>
144 
145 #define BOOST_PARAMETER_AUX_PP_FOR_EACH(arity, list, data, macro)            \
146     BOOST_PARAMETER_AUX_PP_FOR_EACH_R(                                       \
147         BOOST_PP_DEDUCE_R(), arity, list, data, macro                        \
148     )
149 /**/
150 
151 #endif  // include guard
152 
153