| // 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_FORWARDING_OVERLOADS_HPP |
| #define BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_FORWARDING_OVERLOADS_HPP |
| |
| #include <boost/parameter/config.hpp> |
| |
| #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) |
| |
| #include <boost/preprocessor/cat.hpp> |
| |
| // Expands to a forwarding parameter for a constructor or forwarding function. |
| #define BOOST_PARAMETER_FUNCTION_ARG_TYPE_Z(z, n, type_prefix) \ |
| BOOST_PP_CAT(type_prefix, n)&& |
| /**/ |
| |
| #include <utility> |
| |
| // Expands to an argument passed from a forwarding function to the front-end |
| // implementation function, or from a constructor to its delegate. |
| #define BOOST_PARAMETER_FUNCTION_FORWARD_PARAM_Z(z, n, type_prefix) \ |
| ::std::forward<BOOST_PP_CAT(type_prefix, n)>(BOOST_PP_CAT(a, n)) |
| /**/ |
| |
| #include <boost/parameter/aux_/preprocessor/impl/parenthesized_type.hpp> |
| #include <boost/preprocessor/tuple/elem.hpp> |
| |
| // Expands to the default constructor, whose job is to pass an empty back to |
| // the delegate constructor of the base class. |
| #define BOOST_PARAMETER_CONSTRUCTOR_OVERLOAD_0_Z(z, n, data) \ |
| inline BOOST_PP_TUPLE_ELEM(2, 0, data)() \ |
| : BOOST_PARAMETER_PARENTHESIZED_TYPE(BOOST_PP_TUPLE_ELEM(2, 1, data))( \ |
| BOOST_PP_CAT(constructor_parameters, __LINE__)()() \ |
| ) \ |
| { \ |
| } |
| /**/ |
| |
| #include <boost/parameter/aux_/pp_impl/argument_pack.hpp> |
| #include <boost/parameter/aux_/preprocessor/impl/function_name.hpp> |
| #include <boost/preprocessor/control/expr_if.hpp> |
| |
| // Expands to a 0-arity forwarding function, whose job is to pass an empty |
| // pack to the front-end implementation function. |
| #define BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_0_Z(z, n, data) \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(BOOST_PP_TUPLE_ELEM(4, 1, data)) \ |
| inline BOOST_PARAMETER_FUNCTION_RESULT_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| )< \ |
| ::boost::parameter::aux::argument_pack< \ |
| BOOST_PARAMETER_FUNCTION_SPECIFICATION_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| ) \ |
| >::type \ |
| >::type \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_NAME(BOOST_PP_TUPLE_ELEM(3, 0, data))() \ |
| BOOST_PP_EXPR_IF(BOOST_PP_TUPLE_ELEM(4, 3, data), const) \ |
| { \ |
| return BOOST_PP_EXPR_IF(BOOST_PP_TUPLE_ELEM(4, 2, data), this->) \ |
| BOOST_PARAMETER_FUNCTION_IMPL_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| )( \ |
| BOOST_PARAMETER_FUNCTION_SPECIFICATION_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| )()() \ |
| ); \ |
| } |
| /**/ |
| |
| #include <boost/parameter/aux_/preprocessor/impl/function_forward_match.hpp> |
| #include <boost/preprocessor/repetition/enum.hpp> |
| #include <boost/preprocessor/repetition/enum_params.hpp> |
| #include <boost/preprocessor/repetition/enum_binary_params.hpp> |
| |
| // Expands to a forwarding function, whose job is to consolidate its arguments |
| // into a pack for the front-end implementation function to take in. |
| #define BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_1_Z(z, n, data) \ |
| template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename ParameterArgumentType)> \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(BOOST_PP_TUPLE_ELEM(4, 1, data)) \ |
| inline typename BOOST_PARAMETER_FUNCTION_RESULT_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| )< \ |
| typename ::boost::parameter::aux::argument_pack< \ |
| BOOST_PARAMETER_FUNCTION_SPECIFICATION_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| ) \ |
| , BOOST_PP_CAT(BOOST_PP_ENUM_, z)( \ |
| n \ |
| , BOOST_PARAMETER_FUNCTION_ARG_TYPE_Z \ |
| , ParameterArgumentType \ |
| ) \ |
| >::type \ |
| >::type \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_NAME(BOOST_PP_TUPLE_ELEM(4, 0, data))( \ |
| BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, ParameterArgumentType, && a) \ |
| BOOST_PARAMETER_FUNCTION_FORWARD_MATCH_Z( \ |
| z \ |
| , BOOST_PARAMETER_FUNCTION_SPECIFICATION_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| ) \ |
| , n \ |
| , ParameterArgumentType \ |
| ) \ |
| ) BOOST_PP_EXPR_IF(BOOST_PP_TUPLE_ELEM(4, 3, data), const) \ |
| { \ |
| return BOOST_PP_EXPR_IF(BOOST_PP_TUPLE_ELEM(4, 2, data), this->) \ |
| BOOST_PARAMETER_FUNCTION_IMPL_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| )( \ |
| BOOST_PARAMETER_FUNCTION_SPECIFICATION_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| )()( \ |
| BOOST_PP_CAT(BOOST_PP_ENUM_, z)( \ |
| n \ |
| , BOOST_PARAMETER_FUNCTION_FORWARD_PARAM_Z \ |
| , ParameterArgumentType \ |
| ) \ |
| ) \ |
| ); \ |
| } |
| /**/ |
| |
| #include <boost/preprocessor/comparison/equal.hpp> |
| |
| // Expands to a constructor whose job is to consolidate its arguments into a |
| // pack for the delegate constructor of the base class to take in. |
| #define BOOST_PARAMETER_CONSTRUCTOR_OVERLOAD_1_Z(z, n, data) \ |
| template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename ParameterArgumentType)> \ |
| BOOST_PP_EXPR_IF(BOOST_PP_EQUAL(n, 1), explicit) \ |
| inline BOOST_PP_TUPLE_ELEM(2, 0, data)( \ |
| BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, ParameterArgumentType, && a) \ |
| BOOST_PARAMETER_FUNCTION_FORWARD_MATCH_Z( \ |
| z \ |
| , BOOST_PP_CAT(constructor_parameters, __LINE__) \ |
| , n \ |
| , ParameterArgumentType \ |
| ) \ |
| ) : BOOST_PARAMETER_PARENTHESIZED_TYPE(BOOST_PP_TUPLE_ELEM(2, 1, data))( \ |
| BOOST_PP_CAT(constructor_parameters, __LINE__)()( \ |
| BOOST_PP_CAT(BOOST_PP_ENUM_, z)( \ |
| n \ |
| , BOOST_PARAMETER_FUNCTION_FORWARD_PARAM_Z \ |
| , ParameterArgumentType \ |
| ) \ |
| ) \ |
| ) \ |
| { \ |
| } |
| /**/ |
| |
| #include <boost/preprocessor/control/if.hpp> |
| |
| #define BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_Z(z, n, data) \ |
| BOOST_PP_IF( \ |
| n \ |
| , BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_1_Z \ |
| , BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_0_Z \ |
| )(z, n, data) |
| /**/ |
| |
| #define BOOST_PARAMETER_CONSTRUCTOR_OVERLOAD_Z(z, n, data) \ |
| BOOST_PP_IF( \ |
| n \ |
| , BOOST_PARAMETER_CONSTRUCTOR_OVERLOAD_1_Z \ |
| , BOOST_PARAMETER_CONSTRUCTOR_OVERLOAD_0_Z \ |
| )(z, n, data) |
| /**/ |
| |
| #include <boost/preprocessor/repetition/repeat_from_to.hpp> |
| |
| // Helper macro for BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOADS. |
| #define BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOADS_AUX(nm, impl, r, is_m, c) \ |
| BOOST_PP_REPEAT_FROM_TO( \ |
| BOOST_PP_TUPLE_ELEM(2, 0, r) \ |
| , BOOST_PP_TUPLE_ELEM(2, 1, r) \ |
| , BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_Z \ |
| , ( \ |
| nm \ |
| , impl \ |
| , BOOST_PP_IF( \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(nm) \ |
| , 0 \ |
| , is_m \ |
| ) \ |
| , c \ |
| ) \ |
| ) |
| /**/ |
| |
| // Helper macro for BOOST_PARAMETER_CONSTRUCTOR_OVERLOADS. |
| #define BOOST_PARAMETER_CONSTRUCTOR_OVERLOADS_AUX(class_, base, range) \ |
| BOOST_PP_REPEAT_FROM_TO( \ |
| BOOST_PP_TUPLE_ELEM(2, 0, range) \ |
| , BOOST_PP_TUPLE_ELEM(2, 1, range) \ |
| , BOOST_PARAMETER_CONSTRUCTOR_OVERLOAD_Z \ |
| , (class_, base) \ |
| ) |
| /**/ |
| |
| #include <boost/parameter/aux_/preprocessor/impl/arity_range.hpp> |
| |
| // Expands to the layer of forwarding functions for the function with the |
| // specified name, whose arguments determine the range of arities. |
| #define BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOADS(name, impl, a, is_m, c) \ |
| BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOADS_AUX( \ |
| name, impl, BOOST_PARAMETER_ARITY_RANGE(a), is_m, c \ |
| ) |
| /**/ |
| |
| // Expands to the layer of forwarding functions for the constructor in the |
| // specified class, whose arguments determine the range of arities. |
| #define BOOST_PARAMETER_CONSTRUCTOR_OVERLOADS(class_, base, args) \ |
| BOOST_PARAMETER_CONSTRUCTOR_OVERLOADS_AUX( \ |
| class_, base, BOOST_PARAMETER_ARITY_RANGE(args) \ |
| ) |
| /**/ |
| |
| #else // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) |
| |
| #include <boost/parameter/aux_/preprocessor/impl/parenthesized_type.hpp> |
| #include <boost/preprocessor/seq/seq.hpp> |
| #include <boost/preprocessor/tuple/elem.hpp> |
| #include <boost/preprocessor/cat.hpp> |
| |
| // Expands to the default constructor, whose job is to pass an empty argument |
| // pack back to the delegate constructor of the base class. |
| #define BOOST_PARAMETER_DEFAULT_CONSTRUCTOR(z, n, seq) \ |
| inline \ |
| BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)))() \ |
| : BOOST_PARAMETER_PARENTHESIZED_TYPE( \ |
| BOOST_PP_TUPLE_ELEM( \ |
| 2, 1, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| )(BOOST_PP_CAT(constructor_parameters, __LINE__)()()) \ |
| { \ |
| } |
| /**/ |
| |
| #include <boost/parameter/aux_/pp_impl/argument_pack.hpp> |
| #include <boost/parameter/aux_/preprocessor/impl/function_name.hpp> |
| #include <boost/preprocessor/control/expr_if.hpp> |
| |
| // Expands to a 0-arity forwarding function, whose job is to pass an empty |
| // argument pack to the front-end implementation function. |
| #define BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_0_ARITY(z, n, seq) \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_STATIC( \ |
| BOOST_PP_TUPLE_ELEM( \ |
| 4, 1, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| ) \ |
| inline BOOST_PARAMETER_FUNCTION_RESULT_NAME( \ |
| BOOST_PP_TUPLE_ELEM( \ |
| 4, 1, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| , BOOST_PP_TUPLE_ELEM( \ |
| 4, 3, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| )< \ |
| ::boost::parameter::aux::argument_pack< \ |
| BOOST_PARAMETER_FUNCTION_SPECIFICATION_NAME( \ |
| BOOST_PP_TUPLE_ELEM( \ |
| 4, 1, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| , BOOST_PP_TUPLE_ELEM( \ |
| 4, 3, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| ) \ |
| >::type \ |
| >::type \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_NAME( \ |
| BOOST_PP_TUPLE_ELEM( \ |
| 4, 0, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| )() BOOST_PP_EXPR_IF( \ |
| BOOST_PP_TUPLE_ELEM( \ |
| 4, 3, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| , const \ |
| ) \ |
| { \ |
| return BOOST_PP_EXPR_IF( \ |
| BOOST_PP_TUPLE_ELEM( \ |
| 4, 2, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| , this-> \ |
| ) BOOST_PARAMETER_FUNCTION_IMPL_NAME( \ |
| BOOST_PP_TUPLE_ELEM( \ |
| 4, 1, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| , BOOST_PP_TUPLE_ELEM( \ |
| 4, 3, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| )( \ |
| BOOST_PARAMETER_FUNCTION_SPECIFICATION_NAME( \ |
| BOOST_PP_TUPLE_ELEM( \ |
| 4, 1, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| , BOOST_PP_TUPLE_ELEM( \ |
| 4, 3, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \ |
| ) \ |
| )()() \ |
| ); \ |
| } |
| /**/ |
| |
| #include <boost/parameter/aux_/preprocessor/binary_seq_to_args.hpp> |
| #include <boost/parameter/aux_/preprocessor/impl/function_forward_match.hpp> |
| #include <boost/preprocessor/comparison/equal.hpp> |
| #include <boost/preprocessor/repetition/enum_params.hpp> |
| #include <boost/preprocessor/seq/size.hpp> |
| |
| // Expands to a constructor whose job is to consolidate its arguments into a |
| // pack for the delegate constructor of the base class to take in. Each |
| // element in BOOST_PP_SEQ_TAIL(seq) determines the const-ness of the |
| // corresponding argument. |
| #define BOOST_PARAMETER_CONSTRUCTOR_OVERLOAD_R(r, seq) \ |
| template < \ |
| BOOST_PP_ENUM_PARAMS( \ |
| BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_TAIL(seq)) \ |
| , typename ParameterArgumentType \ |
| ) \ |
| > \ |
| BOOST_PP_EXPR_IF( \ |
| BOOST_PP_EQUAL(BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_TAIL(seq)), 1) \ |
| , explicit \ |
| ) \ |
| inline BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PP_SEQ_HEAD(seq))( \ |
| BOOST_PARAMETER_AUX_PP_BINARY_SEQ_TO_ARGS( \ |
| BOOST_PP_SEQ_TAIL(seq), (ParameterArgumentType)(a) \ |
| ) \ |
| BOOST_PARAMETER_FUNCTION_FORWARD_MATCH( \ |
| BOOST_PP_CAT(constructor_parameters, __LINE__) \ |
| , BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_TAIL(seq)) \ |
| , ParameterArgumentType \ |
| ) \ |
| ) : BOOST_PARAMETER_PARENTHESIZED_TYPE( \ |
| BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PP_SEQ_HEAD(seq)) \ |
| )( \ |
| BOOST_PP_CAT(constructor_parameters, __LINE__)()( \ |
| BOOST_PP_ENUM_PARAMS( \ |
| BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_TAIL(seq)), a \ |
| ) \ |
| ) \ |
| ) \ |
| { \ |
| } |
| /**/ |
| |
| // Expands to a forwarding function, whose job is to consolidate its arguments |
| // into a pack for the front-end implementation function to take in. Each |
| // element in BOOST_PP_SEQ_TAIL(seq) determines the const-ness of the |
| // corresponding argument. |
| #define BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_R(r, seq) \ |
| template < \ |
| BOOST_PP_ENUM_PARAMS( \ |
| BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_TAIL(seq)) \ |
| , typename ParameterArgumentType \ |
| ) \ |
| > \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_STATIC( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, BOOST_PP_SEQ_HEAD(seq)) \ |
| ) \ |
| inline typename BOOST_PARAMETER_FUNCTION_RESULT_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, BOOST_PP_SEQ_HEAD(seq)) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, BOOST_PP_SEQ_HEAD(seq)) \ |
| )< \ |
| typename ::boost::parameter::aux::argument_pack< \ |
| BOOST_PARAMETER_FUNCTION_SPECIFICATION_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, BOOST_PP_SEQ_HEAD(seq)) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, BOOST_PP_SEQ_HEAD(seq)) \ |
| ) \ |
| , BOOST_PARAMETER_AUX_PP_BINARY_SEQ_TO_ARGS( \ |
| BOOST_PP_SEQ_TAIL(seq), (ParameterArgumentType) \ |
| ) \ |
| >::type \ |
| >::type \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 0, BOOST_PP_SEQ_HEAD(seq)) \ |
| )( \ |
| BOOST_PARAMETER_AUX_PP_BINARY_SEQ_TO_ARGS( \ |
| BOOST_PP_SEQ_TAIL(seq), (ParameterArgumentType)(a) \ |
| ) \ |
| BOOST_PARAMETER_FUNCTION_FORWARD_MATCH( \ |
| BOOST_PARAMETER_FUNCTION_SPECIFICATION_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, BOOST_PP_SEQ_HEAD(seq)) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, BOOST_PP_SEQ_HEAD(seq)) \ |
| ) \ |
| , BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_TAIL(seq)) \ |
| , ParameterArgumentType \ |
| ) \ |
| ) BOOST_PP_EXPR_IF( \ |
| BOOST_PP_TUPLE_ELEM(4, 3, BOOST_PP_SEQ_HEAD(seq)), const \ |
| ) \ |
| { \ |
| return BOOST_PP_EXPR_IF( \ |
| BOOST_PP_TUPLE_ELEM(4, 2, BOOST_PP_SEQ_HEAD(seq)) \ |
| , this-> \ |
| ) BOOST_PARAMETER_FUNCTION_IMPL_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, BOOST_PP_SEQ_HEAD(seq)) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, BOOST_PP_SEQ_HEAD(seq)) \ |
| )( \ |
| BOOST_PARAMETER_FUNCTION_SPECIFICATION_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, BOOST_PP_SEQ_HEAD(seq)) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, BOOST_PP_SEQ_HEAD(seq)) \ |
| )()( \ |
| BOOST_PP_ENUM_PARAMS( \ |
| BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_TAIL(seq)), a \ |
| ) \ |
| ) \ |
| ); \ |
| } |
| /**/ |
| |
| #include <boost/parameter/aux_/preprocessor/binary_seq_for_each.hpp> |
| #include <boost/preprocessor/control/if.hpp> |
| |
| // Expands to all constructors that take in n arguments. Enables |
| // BOOST_PARAMETER_CONSTRUCTOR_OVERLOADS_AUX to use |
| // BOOST_PARAMETER_CONSTRUCTOR_OVERLOAD_Z within BOOST_PP_REPEAT_FROM_TO. |
| #define BOOST_PARAMETER_CONSTRUCTOR_OVERLOAD_Z(z, n, data) \ |
| BOOST_PP_IF( \ |
| n \ |
| , BOOST_PARAMETER_AUX_PP_BINARY_SEQ_FOR_EACH_Z \ |
| , BOOST_PARAMETER_DEFAULT_CONSTRUCTOR \ |
| )(z, n, (BOOST_PARAMETER_CONSTRUCTOR_OVERLOAD_R)(data)) |
| /**/ |
| |
| // Expands to all forwarding functions that take in n arguments. Enables |
| // BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOADS_AUX to use |
| // BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_Z within BOOST_PP_REPEAT_FROM_TO. |
| #define BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_Z(z, n, data) \ |
| BOOST_PP_IF( \ |
| n \ |
| , BOOST_PARAMETER_AUX_PP_BINARY_SEQ_FOR_EACH_Z \ |
| , BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_0_ARITY \ |
| )(z, n, (BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_R)(data)) |
| /**/ |
| |
| #include <boost/preprocessor/repetition/repeat_from_to.hpp> |
| |
| // Helper macro for BOOST_PARAMETER_CONSTRUCTOR_OVERLOADS. |
| #define BOOST_PARAMETER_CONSTRUCTOR_OVERLOADS_AUX(class_, base, range) \ |
| BOOST_PP_REPEAT_FROM_TO( \ |
| BOOST_PP_TUPLE_ELEM(2, 0, range) \ |
| , BOOST_PP_TUPLE_ELEM(2, 1, range) \ |
| , BOOST_PARAMETER_CONSTRUCTOR_OVERLOAD_Z \ |
| , (class_, base) \ |
| ) |
| /**/ |
| |
| // Helper macro for BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOADS. |
| #define BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOADS_AUX(nm, impl, r, is_m, c) \ |
| BOOST_PP_REPEAT_FROM_TO( \ |
| BOOST_PP_TUPLE_ELEM(2, 0, r) \ |
| , BOOST_PP_TUPLE_ELEM(2, 1, r) \ |
| , BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOAD_Z \ |
| , ( \ |
| nm \ |
| , impl \ |
| , BOOST_PP_IF( \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_IS_STATIC(impl) \ |
| , 0 \ |
| , is_m \ |
| ) \ |
| , c \ |
| ) \ |
| ) |
| /**/ |
| |
| #include <boost/parameter/aux_/preprocessor/impl/arity_range.hpp> |
| |
| // Expands to the layer of forwarding functions for the constructor in the |
| // specified class, whose arguments determine the range of arities. |
| #define BOOST_PARAMETER_CONSTRUCTOR_OVERLOADS(class_, base, args) \ |
| BOOST_PARAMETER_CONSTRUCTOR_OVERLOADS_AUX( \ |
| class_ \ |
| , base \ |
| , BOOST_PARAMETER_ARITY_RANGE(args) \ |
| ) |
| /**/ |
| |
| // Expands to the layer of forwarding functions for the function with the |
| // specified name, whose arguments determine the range of arities. |
| #define BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOADS(name, impl, a, is_m, c) \ |
| BOOST_PARAMETER_FUNCTION_FORWARD_OVERLOADS_AUX( \ |
| name \ |
| , impl \ |
| , BOOST_PARAMETER_ARITY_RANGE(a) \ |
| , is_m \ |
| , c \ |
| ) |
| /**/ |
| |
| #endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING |
| #endif // include guard |
| |