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)
6 #ifndef BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FOR_EACH_HPP
7 #define BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FOR_EACH_HPP
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), ~
14 BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux_BOOST_PARAMETER_AUX_PP_FOR_EACH_END_S
17 #include <boost/preprocessor/detail/split.hpp>
19 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_SPLIT_FIRST(x) \
23 #include <boost/preprocessor/cat.hpp>
25 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_head(n, x) \
28 , BOOST_PP_CAT(BOOST_PARAMETER_AUX_PP_FOR_EACH_head_aux, n) x \
32 #include <boost/preprocessor/facilities/is_empty.hpp>
33 #include <boost/preprocessor/logical/not.hpp>
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) \
41 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux2(x, y) \
42 BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux_check(x)
45 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux3(x, y, z) \
46 BOOST_PARAMETER_AUX_PP_FOR_EACH_pred_aux_check(x)
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)
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
57 #include <boost/preprocessor/tuple/elem.hpp>
59 #if BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
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) \
70 #else // !(BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC())
72 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_pred(r, state) \
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) \
82 #endif // BOOST_PP_CONFIG_FLAGS() & BOOST_PP_CONFIG_MSVC()
84 #include <boost/preprocessor/arithmetic/inc.hpp>
85 #include <boost/preprocessor/tuple/eat.hpp>
87 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_op(r, state) \
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)) \
98 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_macro(r, state) \
99 BOOST_PP_TUPLE_ELEM(5, 2, state)( \
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) \
106 , BOOST_PP_TUPLE_ELEM(5, 1, state) \
110 #include <boost/preprocessor/punctuation/comma_if.hpp>
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
116 #include <boost/preprocessor/repetition/repeat.hpp>
118 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_build_end_sentinel_tuple(arity) \
121 arity, BOOST_PARAMETER_AUX_PP_FOR_EACH_build_end_sentinel, _ \
126 #include <boost/preprocessor/repetition/for.hpp>
128 #define BOOST_PARAMETER_AUX_PP_FOR_EACH_R(r, arity, list, data, macro) \
129 BOOST_PP_CAT(BOOST_PP_FOR_, r)( \
131 BOOST_PARAMETER_AUX_PP_FOR_EACH_build_end_sentinel_tuple(arity) \
137 , BOOST_PARAMETER_AUX_PP_FOR_EACH_pred \
138 , BOOST_PARAMETER_AUX_PP_FOR_EACH_op \
139 , BOOST_PARAMETER_AUX_PP_FOR_EACH_macro \
143 #include <boost/preprocessor/repetition/deduce_r.hpp>
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 \
151 #endif // include guard