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