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