1 2 #if !defined(BOOST_PP_IS_ITERATING) 3 4 ///// header body 5 6 #ifndef BOOST_MPL_APPLY_HPP_INCLUDED 7 #define BOOST_MPL_APPLY_HPP_INCLUDED 8 9 // Copyright Aleksey Gurtovoy 2000-2004 10 // 11 // Distributed under the Boost Software License, Version 1.0. 12 // (See accompanying file LICENSE_1_0.txt or copy at 13 // http://www.boost.org/LICENSE_1_0.txt) 14 // 15 // See http://www.boost.org/libs/mpl for documentation. 16 17 // $Id: apply.hpp 49267 2008-10-11 06:19:02Z agurtovoy $ 18 // $Date: 2008-10-10 23:19:02 -0700 (Fri, 10 Oct 2008) $ 19 // $Revision: 49267 $ 20 21 #if !defined(BOOST_MPL_PREPROCESSING_MODE) 22 # include <boost/mpl/apply_fwd.hpp> 23 # include <boost/mpl/apply_wrap.hpp> 24 # include <boost/mpl/placeholders.hpp> 25 # include <boost/mpl/lambda.hpp> 26 # include <boost/mpl/aux_/na.hpp> 27 # include <boost/mpl/aux_/lambda_support.hpp> 28 #endif 29 30 #include <boost/mpl/aux_/config/use_preprocessed.hpp> 31 32 #if !defined(BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS) \ 33 && !defined(BOOST_MPL_PREPROCESSING_MODE) 34 35 # define BOOST_MPL_PREPROCESSED_HEADER apply.hpp 36 # include <boost/mpl/aux_/include_preprocessed.hpp> 37 38 #else 39 40 # include <boost/mpl/limits/arity.hpp> 41 # include <boost/mpl/aux_/preprocessor/params.hpp> 42 # include <boost/mpl/aux_/preprocessor/default_params.hpp> 43 # include <boost/mpl/aux_/preprocessor/partial_spec_params.hpp> 44 # include <boost/mpl/aux_/preprocessor/enum.hpp> 45 # include <boost/mpl/aux_/config/lambda.hpp> 46 # include <boost/mpl/aux_/config/dtp.hpp> 47 # include <boost/mpl/aux_/nttp_decl.hpp> 48 # include <boost/mpl/aux_/config/eti.hpp> 49 # include <boost/mpl/aux_/config/msvc.hpp> 50 # include <boost/mpl/aux_/config/workaround.hpp> 51 52 # include <boost/preprocessor/comma_if.hpp> 53 # include <boost/preprocessor/inc.hpp> 54 # include <boost/preprocessor/iterate.hpp> 55 # include <boost/preprocessor/cat.hpp> 56 57 namespace boost { namespace mpl { 58 59 // local macros, #undef-ined at the end of the header 60 # define AUX778076_APPLY_PARAMS(param) \ 61 BOOST_MPL_PP_PARAMS( \ 62 BOOST_MPL_LIMIT_METAFUNCTION_ARITY \ 63 , param \ 64 ) \ 65 /**/ 66 67 # define AUX778076_APPLY_DEF_PARAMS(param, value) \ 68 BOOST_MPL_PP_DEFAULT_PARAMS( \ 69 BOOST_MPL_LIMIT_METAFUNCTION_ARITY \ 70 , param \ 71 , value \ 72 ) \ 73 /**/ 74 75 # define AUX778076_APPLY_N_PARAMS(n, param) \ 76 BOOST_MPL_PP_PARAMS(n, param) \ 77 /**/ 78 79 # define AUX778076_APPLY_N_COMMA_PARAMS(n, param) \ 80 BOOST_PP_COMMA_IF(n) \ 81 BOOST_MPL_PP_PARAMS(n, param) \ 82 /**/ 83 84 # define AUX778076_APPLY_N_PARTIAL_SPEC_PARAMS(n, param, def) \ 85 BOOST_PP_COMMA_IF(n) \ 86 BOOST_MPL_PP_PARTIAL_SPEC_PARAMS(n, param, def) \ 87 /**/ 88 89 # define AUX778076_APPLY_N_SPEC_PARAMS(n, param) \ 90 BOOST_MPL_PP_ENUM(BOOST_PP_INC(n), param) \ 91 /**/ 92 93 94 #define BOOST_PP_ITERATION_PARAMS_1 \ 95 (3,(0, BOOST_MPL_LIMIT_METAFUNCTION_ARITY, <boost/mpl/apply.hpp>)) 96 #include BOOST_PP_ITERATE() 97 98 # if !defined(BOOST_MPL_CFG_NO_APPLY_TEMPLATE) 99 // real C++ version is already taken care of 100 # if defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) 101 102 namespace aux { 103 // apply_count_args 104 #define AUX778076_COUNT_ARGS_PREFIX apply 105 #define AUX778076_COUNT_ARGS_DEFAULT na 106 #define AUX778076_COUNT_ARGS_ARITY BOOST_MPL_LIMIT_METAFUNCTION_ARITY 107 #include <boost/mpl/aux_/count_args.hpp> 108 } 109 110 111 template< 112 typename F, AUX778076_APPLY_DEF_PARAMS(typename T, na) 113 > 114 struct apply 115 : aux::apply_chooser< 116 aux::apply_count_args< AUX778076_APPLY_PARAMS(T) >::value 117 >::template result_< F, AUX778076_APPLY_PARAMS(T) >::type 118 { 119 }; 120 121 # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION 122 # endif // BOOST_MPL_CFG_NO_APPLY_TEMPLATE 123 124 # undef AUX778076_APPLY_N_SPEC_PARAMS 125 # undef AUX778076_APPLY_N_PARTIAL_SPEC_PARAMS 126 # undef AUX778076_APPLY_N_COMMA_PARAMS 127 # undef AUX778076_APPLY_N_PARAMS 128 # undef AUX778076_APPLY_DEF_PARAMS 129 # undef AUX778076_APPLY_PARAMS 130 131 }} 132 133 #endif // BOOST_MPL_CFG_NO_PREPROCESSED_HEADERS 134 #endif // BOOST_MPL_APPLY_HPP_INCLUDED 135 136 ///// iteration, depth == 1 137 138 // For gcc 4.4 compatability, we must include the 139 // BOOST_PP_ITERATION_DEPTH test inside an #else clause. 140 #else // BOOST_PP_IS_ITERATING 141 #if BOOST_PP_ITERATION_DEPTH() == 1 142 143 # define i_ BOOST_PP_FRAME_ITERATION(1) 144 145 template< 146 typename F AUX778076_APPLY_N_COMMA_PARAMS(i_, typename T) 147 > 148 struct BOOST_PP_CAT(apply,i_) 149 #if !BOOST_WORKAROUND(BOOST_MSVC, < 1300) 150 : BOOST_PP_CAT(apply_wrap,i_)< 151 typename lambda<F>::type 152 AUX778076_APPLY_N_COMMA_PARAMS(i_, T) 153 > 154 { 155 #else 156 { 157 typedef typename BOOST_PP_CAT(apply_wrap,i_)< 158 typename lambda<F>::type 159 AUX778076_APPLY_N_COMMA_PARAMS(i_, T) 160 >::type type; 161 #endif 162 BOOST_MPL_AUX_LAMBDA_SUPPORT( 163 BOOST_PP_INC(i_) 164 , BOOST_PP_CAT(apply,i_) 165 , (F AUX778076_APPLY_N_COMMA_PARAMS(i_,T)) 166 ) 167 }; 168 169 170 #if defined(BOOST_MPL_CFG_MSVC_ETI_BUG) 171 /// workaround for ETI bug 172 template<> 173 struct BOOST_PP_CAT(apply,i_)<AUX778076_APPLY_N_SPEC_PARAMS(i_, int)> 174 { 175 typedef int type; 176 }; 177 #endif 178 179 # if !defined(BOOST_MPL_CFG_NO_APPLY_TEMPLATE) 180 # if !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) 181 182 #if i_ == BOOST_MPL_LIMIT_METAFUNCTION_ARITY 183 /// primary template (not a specialization!) 184 template< 185 typename F AUX778076_APPLY_N_COMMA_PARAMS(i_, typename T) 186 > 187 struct apply 188 : BOOST_PP_CAT(apply,i_)< F AUX778076_APPLY_N_COMMA_PARAMS(i_, T) > 189 { 190 }; 191 #else 192 template< 193 typename F AUX778076_APPLY_N_COMMA_PARAMS(i_, typename T) 194 > 195 struct apply< F AUX778076_APPLY_N_PARTIAL_SPEC_PARAMS(i_, T, na) > 196 : BOOST_PP_CAT(apply,i_)< F AUX778076_APPLY_N_COMMA_PARAMS(i_, T) > 197 { 198 }; 199 #endif 200 201 # else // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION 202 203 #if !defined(BOOST_MPL_CFG_NO_APPLY_TEMPLATE) 204 namespace aux { 205 206 template<> 207 struct apply_chooser<i_> 208 { 209 template< 210 typename F, AUX778076_APPLY_PARAMS(typename T) 211 > 212 struct result_ 213 { 214 typedef BOOST_PP_CAT(apply,i_)< 215 F AUX778076_APPLY_N_COMMA_PARAMS(i_, T) 216 > type; 217 }; 218 }; 219 220 } // namespace aux 221 #endif 222 223 # endif // BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION 224 # endif // BOOST_MPL_CFG_NO_APPLY_TEMPLATE 225 226 # undef i_ 227 228 #endif // BOOST_PP_ITERATION_DEPTH() 229 #endif // BOOST_PP_IS_ITERATING 230