123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474 |
- // 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
|