1 2 // Copyright (C) 2009-2012 Lorenzo Caminiti 3 // Distributed under the Boost Software License, Version 1.0 4 // (see accompanying file LICENSE_1_0.txt or a copy at 5 // http://www.boost.org/LICENSE_1_0.txt) 6 // Home at http://www.boost.org/libs/local_function 7 8 #ifndef BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS_HPP_ 9 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS_HPP_ 10 11 #include <boost/local_function/aux_/preprocessor/traits/decl_/index.hpp> 12 #include <boost/local_function/aux_/preprocessor/traits/param.hpp> 13 #include <boost/local_function/detail/preprocessor/keyword/default.hpp> 14 #include <boost/preprocessor/tuple/elem.hpp> 15 #include <boost/preprocessor/tuple/eat.hpp> 16 #include <boost/preprocessor/tuple/rem.hpp> 17 #include <boost/preprocessor/arithmetic/inc.hpp> 18 #include <boost/preprocessor/control/iif.hpp> 19 #include <boost/preprocessor/logical/compl.hpp> 20 #include <boost/preprocessor/facilities/is_empty.hpp> 21 #include <boost/preprocessor/list/adt.hpp> 22 #include <boost/preprocessor/list/fold_left.hpp> 23 24 // PRIVATE // 25 26 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS_DEFAULT_OP_(s, \ 27 default_count, param_traits) \ 28 BOOST_PP_IIF(BOOST_PP_IS_EMPTY( \ 29 BOOST_LOCAL_FUNCTION_AUX_PP_PARAM_TRAITS_DEFAULT(param_traits)), \ 30 BOOST_PP_TUPLE_REM(1) \ 31 , \ 32 BOOST_PP_INC \ 33 )(default_count) 34 35 // Precondition: params is a pp-list which is not nil. 36 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS_DEFAULT_COUNT_(params) \ 37 BOOST_PP_LIST_FOLD_LEFT( \ 38 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS_DEFAULT_OP_, \ 39 0 /* start with defaults_count to 0 */, params) 40 41 // PUBLIC // 42 43 // Expand: pp-list of param-traits (no bound variables). 44 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits) \ 45 BOOST_PP_TUPLE_ELEM(BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_INDEX_MAX, \ 46 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_INDEX_PARAMS, decl_traits) 47 48 // Expand: number of parameters with default values (0 if no default). 49 #define BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS_DEFAULT_COUNT( \ 50 decl_traits) \ 51 BOOST_PP_IIF(BOOST_PP_LIST_IS_CONS( \ 52 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits)), \ 53 BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS_DEFAULT_COUNT_ \ 54 , \ 55 0 BOOST_PP_TUPLE_EAT(1) \ 56 )(BOOST_LOCAL_FUNCTION_AUX_PP_DECL_TRAITS_PARAMS(decl_traits)) 57 58 #endif // #include guard 59 60