| // Copyright Daniel Wallin 2006. |
| // Copyright Cromwell D. Enage 2017. |
| // Distributed under the Boost Software License, Version 1.0. |
| // (See accompanying file LICENSE_1_0.txt or copy at |
| // http://www.boost.org/LICENSE_1_0.txt) |
| |
| #ifndef BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FUNCTION_DISPATCH_LAYER_HPP |
| #define BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FUNCTION_DISPATCH_LAYER_HPP |
| |
| #include <boost/preprocessor/cat.hpp> |
| |
| // Expands to keyword_tag_type for some keyword_tag. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_TYPE(keyword_tag) \ |
| BOOST_PP_CAT(keyword_tag, _type) |
| /**/ |
| |
| // Expands to a template parameter for each dispatch function. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_TEMPLATE_ARG(r, macro, arg) \ |
| , typename BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_TYPE(macro(arg)) |
| /**/ |
| |
| #include <boost/parameter/config.hpp> |
| |
| #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) |
| |
| // Expands to a forwarding parameter for a dispatch function. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_DEFN(r, macro, arg) \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_TYPE(macro(arg))&& macro(arg) |
| /**/ |
| |
| #include <utility> |
| |
| // Expands to an argument passed from one dispatch function to the next. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_FWD(r, macro, arg) \ |
| , ::std::forward< \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_TYPE(macro(arg)) \ |
| >(macro(arg)) |
| /**/ |
| |
| #else // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) |
| |
| // Expands to a forwarding parameter for a dispatch function. The parameter |
| // type stores its const-ness. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_DEFN(r, macro, arg) \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_TYPE(macro(arg))& macro(arg) |
| /**/ |
| |
| #include <boost/parameter/aux_/as_lvalue.hpp> |
| |
| // Expands to an argument passed from one dispatch function to the next. |
| // Explicit forwarding takes the form of forcing the argument to be an lvalue. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_FWD(r, macro, arg) \ |
| , ::boost::parameter::aux::as_lvalue(macro(arg)) |
| /**/ |
| |
| #endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING |
| |
| #include <boost/parameter/aux_/preprocessor/impl/argument_specs.hpp> |
| #include <boost/parameter/aux_/preprocessor/impl/split_args.hpp> |
| #include <boost/preprocessor/seq/for_each.hpp> |
| #include <boost/preprocessor/seq/first_n.hpp> |
| |
| // Iterates through all required arguments and the first n optional arguments, |
| // passing each argument to the specified macro. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_REPEAT(macro, n, split_args) \ |
| BOOST_PP_SEQ_FOR_EACH( \ |
| macro \ |
| , BOOST_PARAMETER_FN_ARG_NAME \ |
| , BOOST_PARAMETER_SPLIT_ARG_REQ_SEQ(split_args) \ |
| ) \ |
| BOOST_PP_SEQ_FOR_EACH( \ |
| macro \ |
| , BOOST_PARAMETER_FN_ARG_NAME \ |
| , BOOST_PP_SEQ_FIRST_N( \ |
| n, BOOST_PARAMETER_SPLIT_ARG_OPT_SEQ(split_args) \ |
| ) \ |
| ) |
| /**/ |
| |
| #include <boost/parameter/aux_/preprocessor/impl/function_dispatch_tuple.hpp> |
| #include <boost/parameter/aux_/preprocessor/impl/function_name.hpp> |
| #include <boost/preprocessor/control/if.hpp> |
| |
| // Produces a name for the dispatch functions. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_NAME(x, n) \ |
| BOOST_PP_CAT( \ |
| BOOST_PP_CAT( \ |
| BOOST_PP_IF( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_IS_CONST(x) \ |
| , boost_param_dispatch_const_ \ |
| , boost_param_dispatch_ \ |
| ) \ |
| , BOOST_PP_CAT(BOOST_PP_CAT(n, boost_), __LINE__) \ |
| ) \ |
| , BOOST_PARAMETER_MEMBER_FUNCTION_NAME( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_BASE_NAME(x) \ |
| ) \ |
| ) |
| /**/ |
| |
| // Expands to the template parameter list of the dispatch function with all |
| // required and first n optional parameters; also extracts the static keyword |
| // if present. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_TPL(n, x) \ |
| template < \ |
| typename ResultType, typename Args \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_REPEAT( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_TEMPLATE_ARG \ |
| , n \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| > BOOST_PARAMETER_MEMBER_FUNCTION_STATIC( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_BASE_NAME(x) \ |
| ) |
| /**/ |
| |
| #include <boost/parameter/aux_/use_default_tag.hpp> |
| #include <boost/preprocessor/control/expr_if.hpp> |
| #include <boost/preprocessor/punctuation/comma_if.hpp> |
| |
| // Expands to the result type, name, parenthesized list of all required and |
| // n optional parameters, and const-ness of the dispatch function; the bit |
| // value b determines whether or not this dispatch function takes in |
| // boost::parameter::aux::use_default_tag as its last parameter. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_PRN(n, x, b1, b2) \ |
| ResultType BOOST_PARAMETER_FUNCTION_DISPATCH_NAME(x, b1)( \ |
| ResultType(*)(), Args const& args, long \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_REPEAT( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_DEFN \ |
| , n \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| BOOST_PP_COMMA_IF(b2) \ |
| BOOST_PP_EXPR_IF(b2, ::boost::parameter::aux::use_default_tag) \ |
| ) BOOST_PP_EXPR_IF(BOOST_PARAMETER_FUNCTION_DISPATCH_IS_CONST(x), const) |
| /**/ |
| |
| // Expands to a forward declaration of the dispatch function that takes in |
| // all required and the first n optional parameters, but not |
| // boost::parameter::aux::use_default_tag. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_FWD_DECL_0_Z(z, n, x) \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_TPL(n, x) \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_PRN(n, x, 0, 0); |
| /**/ |
| |
| // Expands to a forward declaration of the dispatch function that takes in |
| // all required parameters, the first n optional parameters, and |
| // boost::parameter::aux::use_default_tag. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_FWD_DECL_1_Z(z, n, x) \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_TPL(n, x) \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_PRN(n, x, 0, 1); |
| /**/ |
| |
| #include <boost/preprocessor/seq/elem.hpp> |
| |
| // Expands to the default value of the (n + 1)th optional parameter. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_DEFAULT_AUX(n, s_args) \ |
| BOOST_PARAMETER_FN_ARG_DEFAULT( \ |
| BOOST_PP_SEQ_ELEM(n, BOOST_PARAMETER_SPLIT_ARG_OPT_SEQ(s_args)) \ |
| ) |
| /**/ |
| |
| #include <boost/parameter/keyword.hpp> |
| |
| // Expands to the assignment portion which binds the default value to the |
| // (n + 1)th optional parameter before composing it with the argument-pack |
| // parameter passed in to the n-th dispatch function. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_DEFAULT(n, s_args, tag_ns) \ |
| ::boost::parameter::keyword< \ |
| tag_ns::BOOST_PARAMETER_FN_ARG_NAME( \ |
| BOOST_PP_SEQ_ELEM(n, BOOST_PARAMETER_SPLIT_ARG_OPT_SEQ(s_args)) \ |
| ) \ |
| >::instance = BOOST_PARAMETER_FUNCTION_DISPATCH_DEFAULT_AUX(n, s_args) |
| /**/ |
| |
| #include <boost/parameter/aux_/preprocessor/impl/function_cast.hpp> |
| |
| // Takes in the arg tuple (name, pred) and the tag namespace. |
| // Extracts the corresponding required argument from the pack. |
| // This form enables BOOST_PARAMETER_FUNCTION_DISPATCH_LAYER to use it |
| // from within BOOST_PP_SEQ_FOR_EACH. |
| #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) |
| // The boost::parameter::aux::forward wrapper is necessary to transmit the |
| // target type to the next dispatch function. Otherwise, the argument will |
| // retain its original type. -- Cromwell D. Enage |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_CAST_R(r, tag_ns, arg) \ |
| , ::boost::parameter::aux::forward< \ |
| BOOST_PARAMETER_FUNCTION_CAST_T( \ |
| tag_ns::BOOST_PARAMETER_FN_ARG_NAME(arg) \ |
| , BOOST_PARAMETER_FN_ARG_PRED(arg) \ |
| , Args \ |
| ) \ |
| , BOOST_PARAMETER_FUNCTION_CAST_B( \ |
| tag_ns::BOOST_PARAMETER_FN_ARG_NAME(arg) \ |
| , BOOST_PARAMETER_FN_ARG_PRED(arg) \ |
| , Args \ |
| ) \ |
| >( \ |
| args[ \ |
| ::boost::parameter::keyword< \ |
| tag_ns::BOOST_PARAMETER_FN_ARG_NAME(arg) \ |
| >::instance \ |
| ] \ |
| ) |
| /**/ |
| #else // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) |
| // The explicit type cast is necessary to transmit the target type to the next |
| // dispatch function. Otherwise, the argument will retain its original type. |
| // -- Cromwell D. Enage |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_CAST_R(r, tag_ns, arg) \ |
| , BOOST_PARAMETER_FUNCTION_CAST_T( \ |
| tag_ns::BOOST_PARAMETER_FN_ARG_NAME(arg) \ |
| , BOOST_PARAMETER_FN_ARG_PRED(arg) \ |
| , Args \ |
| )( \ |
| args[ \ |
| ::boost::parameter::keyword< \ |
| tag_ns::BOOST_PARAMETER_FN_ARG_NAME(arg) \ |
| >::instance \ |
| ] \ |
| ) |
| /**/ |
| #endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING |
| |
| // Takes in the arg tuple (name, pred, default) and the tag namespace. |
| // Extracts the corresponding optional argument from the pack if specified, |
| // otherwise temporarily passes use_default_tag() to the dispatch functions. |
| #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) |
| // The boost::parameter::aux::forward wrapper is necessary to transmit the |
| // target type to the next dispatch function. Otherwise, the argument will |
| // retain its original type. -- Cromwell D. Enage |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_OPT_ARG_CAST(arg, tag_ns) \ |
| ::boost::parameter::aux::forward< \ |
| BOOST_PARAMETER_FUNCTION_CAST_T( \ |
| tag_ns::BOOST_PARAMETER_FN_ARG_NAME(arg) \ |
| , BOOST_PARAMETER_FN_ARG_PRED(arg) \ |
| , Args \ |
| ) \ |
| , BOOST_PARAMETER_FUNCTION_CAST_B( \ |
| tag_ns::BOOST_PARAMETER_FN_ARG_NAME(arg) \ |
| , BOOST_PARAMETER_FN_ARG_PRED(arg) \ |
| , Args \ |
| ) \ |
| >( \ |
| args[ \ |
| ::boost::parameter::keyword< \ |
| tag_ns::BOOST_PARAMETER_FN_ARG_NAME(arg) \ |
| >::instance || ::boost::parameter::aux::use_default_tag() \ |
| ] \ |
| ) |
| /**/ |
| #else // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_OPT_ARG_CAST(arg, tag_ns) \ |
| BOOST_PARAMETER_FUNCTION_CAST_B( \ |
| args[ \ |
| ::boost::parameter::keyword< \ |
| tag_ns::BOOST_PARAMETER_FN_ARG_NAME(arg) \ |
| >::instance || ::boost::parameter::aux::use_default_tag() \ |
| ] \ |
| , BOOST_PARAMETER_FN_ARG_PRED(arg) \ |
| , Args \ |
| ) |
| /**/ |
| #endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING |
| |
| #include <boost/parameter/aux_/preprocessor/nullptr.hpp> |
| |
| // Expands to three dispatch functions that take in all required parameters |
| // and the first n optional parameters. The third dispatch function bears |
| // the same name as the first but takes in use_default_tag as the last |
| // parameter. The second dispatch function bears a different name from the |
| // other two. |
| // |
| // x is a tuple: |
| // |
| // (name, split_args, is_const, tag_namespace) |
| // |
| // Where name is the base name of the functions, and split_args is a tuple: |
| // |
| // (required_count, required_args, optional_count, required_args) |
| // |
| // The first dispatch function queries args if it has bound the (n + 1)th |
| // optional parameter to a user-defined argument. If so, then it forwards |
| // its own arguments followed by the user-defined argument to the dispatch |
| // function that takes in all required parameters and the first (n + 1) |
| // optional parameters, but not use_default_tag. Otherwise, it forwards |
| // its own arguments to the third dispatch function. |
| // |
| // The third dispatch function appends the default value of the (n + 1)th |
| // optional parameter to its copy of args. Then it forwards this copy, all |
| // required parameters, and the first n (not n + 1) optional parameters to |
| // the second dispatch function. |
| // |
| // The second dispatch function forwards its arguments, then the (n + 1)th |
| // optional parameter that it extracts from args, to the other-named dispatch |
| // function that takes in all required parameters and the first (n + 1) |
| // optional parameters, but not use_default_tag. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_OVERLOAD_Z(z, n, x) \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_TPL(n, x) \ |
| inline BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_PRN(n, x, 0, 0) \ |
| { \ |
| return BOOST_PP_EXPR_IF( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_IS_MEMBER(x) \ |
| , this-> \ |
| ) BOOST_PARAMETER_FUNCTION_DISPATCH_NAME(x, 0)( \ |
| static_cast<ResultType(*)()>(BOOST_PARAMETER_AUX_PP_NULLPTR) \ |
| , args \ |
| , 0L \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_REPEAT( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_FWD \ |
| , n \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_OPT_ARG_CAST( \ |
| BOOST_PP_SEQ_ELEM( \ |
| n \ |
| , BOOST_PARAMETER_SPLIT_ARG_OPT_SEQ( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| ) \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_TAG_NAMESPACE(x) \ |
| ) \ |
| ); \ |
| } \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_TPL(n, x) \ |
| inline BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_PRN(n, x, 1, 0) \ |
| { \ |
| return BOOST_PP_EXPR_IF( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_IS_MEMBER(x) \ |
| , this-> \ |
| ) BOOST_PARAMETER_FUNCTION_DISPATCH_NAME(x, 0)( \ |
| static_cast<ResultType(*)()>(BOOST_PARAMETER_AUX_PP_NULLPTR) \ |
| , args \ |
| , 0L \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_REPEAT( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_FWD \ |
| , n \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| , args[ \ |
| ::boost::parameter::keyword< \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_TAG_NAMESPACE(x):: \ |
| BOOST_PARAMETER_FN_ARG_NAME( \ |
| BOOST_PP_SEQ_ELEM( \ |
| n \ |
| , BOOST_PARAMETER_SPLIT_ARG_OPT_SEQ( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| ) \ |
| ) \ |
| >::instance \ |
| ] \ |
| ); \ |
| } \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_TPL(n, x) \ |
| inline BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_PRN(n, x, 0, 1) \ |
| { \ |
| return BOOST_PP_EXPR_IF( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_IS_MEMBER(x) \ |
| , this-> \ |
| ) BOOST_PARAMETER_FUNCTION_DISPATCH_NAME(x, 1)( \ |
| static_cast<ResultType(*)()>(BOOST_PARAMETER_AUX_PP_NULLPTR) \ |
| , (args \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_DEFAULT( \ |
| n \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_TAG_NAMESPACE(x) \ |
| ) \ |
| ) \ |
| , 0L \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_REPEAT( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_FWD \ |
| , n \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| ); \ |
| } |
| /**/ |
| |
| #include <boost/preprocessor/arithmetic/inc.hpp> |
| #include <boost/preprocessor/control/if.hpp> |
| #include <boost/preprocessor/repetition/repeat_from_to.hpp> |
| #include <boost/preprocessor/tuple/eat.hpp> |
| |
| // x is a tuple: |
| // |
| // (base_name, split_args, is_member, is_const, tag_namespace) |
| // |
| // Generates all dispatch functions for the function named base_name. Each |
| // dispatch function that takes in n optional parameters passes the default |
| // value of the (n + 1)th optional parameter to the next dispatch function. |
| // The last dispatch function is the back-end implementation, so only the |
| // header is generated: the user is expected to supply the body. |
| // |
| // Also generates the front-end implementation function, which uses |
| // BOOST_PARAMETER_FUNCTION_CAST to extract each argument from the argument |
| // pack. |
| #define BOOST_PARAMETER_FUNCTION_DISPATCH_LAYER(fwd_decl, x) \ |
| BOOST_PP_IF(fwd_decl, BOOST_PP_REPEAT_FROM_TO, BOOST_PP_TUPLE_EAT(4))( \ |
| 0 \ |
| , BOOST_PP_INC( \ |
| BOOST_PARAMETER_SPLIT_ARG_OPT_COUNT( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| ) \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_FWD_DECL_0_Z \ |
| , x \ |
| ) \ |
| BOOST_PP_IF(fwd_decl, BOOST_PP_REPEAT_FROM_TO, BOOST_PP_TUPLE_EAT(4))( \ |
| 0 \ |
| , BOOST_PARAMETER_SPLIT_ARG_OPT_COUNT( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_FWD_DECL_1_Z \ |
| , x \ |
| ) \ |
| template <typename Args> BOOST_PARAMETER_MEMBER_FUNCTION_STATIC( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_BASE_NAME(x) \ |
| ) inline typename BOOST_PARAMETER_FUNCTION_RESULT_NAME( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_BASE_NAME(x) \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_IS_CONST(x) \ |
| )<Args>::type BOOST_PARAMETER_FUNCTION_IMPL_NAME( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_BASE_NAME(x) \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_IS_CONST(x) \ |
| )(Args const& args) \ |
| BOOST_PP_EXPR_IF(BOOST_PARAMETER_FUNCTION_DISPATCH_IS_CONST(x), const) \ |
| { \ |
| return BOOST_PP_EXPR_IF( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_IS_MEMBER(x) \ |
| , this-> \ |
| ) BOOST_PARAMETER_FUNCTION_DISPATCH_NAME(x, 0)( \ |
| static_cast< \ |
| typename BOOST_PARAMETER_FUNCTION_RESULT_NAME( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_BASE_NAME(x) \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_IS_CONST(x) \ |
| )<Args>::type(*)() \ |
| >(BOOST_PARAMETER_AUX_PP_NULLPTR) \ |
| , args \ |
| , 0L \ |
| BOOST_PP_SEQ_FOR_EACH( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_ARG_CAST_R \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_TAG_NAMESPACE(x) \ |
| , BOOST_PARAMETER_SPLIT_ARG_REQ_SEQ( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| ) \ |
| ); \ |
| } \ |
| BOOST_PP_REPEAT_FROM_TO( \ |
| 0 \ |
| , BOOST_PARAMETER_SPLIT_ARG_OPT_COUNT( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| , BOOST_PARAMETER_FUNCTION_DISPATCH_OVERLOAD_Z \ |
| , x \ |
| ) \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_TPL( \ |
| BOOST_PARAMETER_SPLIT_ARG_OPT_COUNT( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| , x \ |
| ) \ |
| inline BOOST_PARAMETER_FUNCTION_DISPATCH_HEAD_PRN( \ |
| BOOST_PARAMETER_SPLIT_ARG_OPT_COUNT( \ |
| BOOST_PARAMETER_FUNCTION_DISPATCH_SPLIT_ARGS(x) \ |
| ) \ |
| , x \ |
| , 0 \ |
| , 0 \ |
| ) |
| /**/ |
| |
| #endif // include guard |
| |