| // Copyright Cromwell D. Enage 2018. |
| // 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_NO_SPEC_OVERLOADS_HPP |
| #define BOOST_PARAMETER_AUX_PREPROCESSOR_IMPL_NO_SPEC_OVERLOADS_HPP |
| |
| #include <boost/parameter/aux_/preprocessor/impl/function_name.hpp> |
| |
| // Defines the no-spec implementation function header. |
| #define BOOST_PARAMETER_NO_SPEC_FUNCTION_IMPL_HEAD(name, is_const) \ |
| template <typename ResultType, typename Args> \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(name) ResultType \ |
| BOOST_PARAMETER_NO_SPEC_FUNCTION_IMPL_NAME( \ |
| name, is_const \ |
| )(ResultType(*)(), Args const& args) |
| /**/ |
| |
| #include <boost/parameter/config.hpp> |
| |
| #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) |
| |
| #include <boost/parameter/aux_/preprocessor/impl/parenthesized_return_type.hpp> |
| |
| // Expands to the result metafunction for the specified no-spec function. |
| #if defined(BOOST_PARAMETER_CAN_USE_MP11) |
| #define BOOST_PARAMETER_NO_SPEC_FUNCTION_HEAD(result, name, is_const) \ |
| template <typename TaggedArg0, typename ...TaggedArgs> \ |
| using BOOST_PARAMETER_NO_SPEC_FUNCTION_RESULT_NAME(name, is_const) \ |
| = typename BOOST_PARAMETER_PARENTHESIZED_RETURN_TYPE(result); |
| /**/ |
| #else |
| #define BOOST_PARAMETER_NO_SPEC_FUNCTION_HEAD(result, name, is_const) \ |
| template <typename TaggedArg0, typename ...TaggedArgs> \ |
| struct BOOST_PARAMETER_NO_SPEC_FUNCTION_RESULT_NAME(name, is_const) \ |
| : BOOST_PARAMETER_PARENTHESIZED_RETURN_TYPE(result) \ |
| { \ |
| }; |
| /**/ |
| #endif // BOOST_PARAMETER_CAN_USE_MP11 |
| |
| #include <boost/parameter/compose.hpp> |
| #include <boost/parameter/are_tagged_arguments.hpp> |
| #include <boost/parameter/aux_/preprocessor/impl/parenthesized_type.hpp> |
| #include <boost/core/enable_if.hpp> |
| |
| // Exapnds to a variadic constructor that is enabled if and only if all its |
| // arguments are tagged arguments. The enclosing class must inherit from the |
| // specified base class, which in turn must implement a constructor that takes |
| // in the argument pack that this one passes on. |
| #define BOOST_PARAMETER_NO_SPEC_CONSTRUCTOR(class_, base) \ |
| template < \ |
| typename TaggedArg0 \ |
| , typename ...TaggedArgs \ |
| , typename = typename ::boost::enable_if< \ |
| ::boost::parameter \ |
| ::are_tagged_arguments<TaggedArg0,TaggedArgs...> \ |
| >::type \ |
| > inline explicit \ |
| class_(TaggedArg0 const& arg0, TaggedArgs const&... args) \ |
| : BOOST_PARAMETER_PARENTHESIZED_TYPE(base)( \ |
| ::boost::parameter::compose(arg0, args...) \ |
| ) \ |
| { \ |
| } |
| /**/ |
| |
| // Exapnds to a variadic constructor that is enabled if and only if all its |
| // arguments are tagged arguments. The specified function must be able to |
| // take in the argument pack that this constructor passes on. |
| #define BOOST_PARAMETER_NO_SPEC_NO_BASE_CONSTRUCTOR(class_, func) \ |
| template < \ |
| typename TaggedArg0 \ |
| , typename ...TaggedArgs \ |
| , typename = typename ::boost::enable_if< \ |
| ::boost::parameter \ |
| ::are_tagged_arguments<TaggedArg0,TaggedArgs...> \ |
| >::type \ |
| > inline explicit \ |
| class_(TaggedArg0 const& arg0, TaggedArgs const&... args) \ |
| { \ |
| func(::boost::parameter::compose(arg0, args...)); \ |
| } |
| /**/ |
| |
| #include <boost/parameter/aux_/preprocessor/nullptr.hpp> |
| #include <boost/preprocessor/control/expr_if.hpp> |
| |
| // Exapnds to a variadic function that is enabled if and only if |
| // all its arguments are tagged arguments. |
| #define BOOST_PARAMETER_NO_SPEC_FUNCTION_OVERLOAD(name, impl, is_m, c) \ |
| template <typename TaggedArg0, typename ...TaggedArgs> \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(impl) \ |
| inline typename ::boost::lazy_enable_if< \ |
| ::boost::parameter \ |
| ::are_tagged_arguments<TaggedArg0,TaggedArgs...> \ |
| , BOOST_PARAMETER_NO_SPEC_FUNCTION_RESULT_NAME( \ |
| impl, c \ |
| )<TaggedArg0,TaggedArgs...> \ |
| >::type BOOST_PARAMETER_MEMBER_FUNCTION_NAME(name) \ |
| (TaggedArg0 const& arg0, TaggedArgs const&... args) \ |
| BOOST_PP_EXPR_IF(c, const) \ |
| { \ |
| return BOOST_PP_EXPR_IF(is_m, this->) \ |
| BOOST_PARAMETER_NO_SPEC_FUNCTION_IMPL_NAME(impl, c)( \ |
| static_cast< \ |
| typename BOOST_PARAMETER_NO_SPEC_FUNCTION_RESULT_NAME( \ |
| impl, c \ |
| )<TaggedArg0,TaggedArgs...>::type(*)() \ |
| >(BOOST_PARAMETER_AUX_PP_NULLPTR) \ |
| , ::boost::parameter::compose(arg0, args...) \ |
| ); \ |
| } |
| /**/ |
| |
| #else // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING) |
| |
| #include <boost/parameter/aux_/void.hpp> |
| #include <boost/parameter/aux_/preprocessor/impl/parenthesized_return_type.hpp> |
| #include <boost/preprocessor/facilities/intercept.hpp> |
| #include <boost/preprocessor/repetition/enum_binary_params.hpp> |
| |
| // Expands to the result metafunction for the specified no-spec function. |
| #define BOOST_PARAMETER_NO_SPEC_FUNCTION_HEAD(result, name, is_const) \ |
| template < \ |
| BOOST_PP_ENUM_BINARY_PARAMS( \ |
| BOOST_PARAMETER_COMPOSE_MAX_ARITY \ |
| , typename TaggedArg \ |
| , = ::boost::parameter::void_ BOOST_PP_INTERCEPT \ |
| ) \ |
| > \ |
| struct BOOST_PARAMETER_NO_SPEC_FUNCTION_RESULT_NAME(name, is_const) \ |
| : BOOST_PARAMETER_PARENTHESIZED_RETURN_TYPE(result) \ |
| { \ |
| }; |
| /**/ |
| |
| #include <boost/parameter/compose.hpp> |
| #include <boost/parameter/aux_/preprocessor/impl/parenthesized_type.hpp> |
| #include <boost/preprocessor/comparison/equal.hpp> |
| #include <boost/preprocessor/control/expr_if.hpp> |
| #include <boost/preprocessor/repetition/enum_params.hpp> |
| #include <boost/preprocessor/tuple/elem.hpp> |
| |
| #if defined(BOOST_NO_SFINAE) |
| |
| // Exapnds to a tagged-argument constructor overload that passes the argument |
| // pack to the base class delegate constructor. |
| #define BOOST_PARAMETER_NO_SPEC_CONSTRUCTOR_OVERLOAD_Z(z, n, data) \ |
| template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename TaggedArg)> \ |
| 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, TaggedArg, const& arg) \ |
| ) : BOOST_PARAMETER_PARENTHESIZED_TYPE(BOOST_PP_TUPLE_ELEM(2, 1, data))( \ |
| ::boost::parameter::compose(BOOST_PP_ENUM_PARAMS_Z(z, n, arg)) \ |
| ) \ |
| { \ |
| } |
| /**/ |
| |
| // Exapnds to a tagged-argument constructor overload that passes the argument |
| // pack to the delegate function. |
| #define BOOST_PARAMETER_NO_SPEC_NO_BASE_CONSTRUCTOR_OVERLOAD_Z(z, n, data) \ |
| template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename TaggedArg)> \ |
| 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, TaggedArg, const& a) \ |
| ) \ |
| { \ |
| BOOST_PP_TUPLE_ELEM(2, 1, data)( \ |
| ::boost::parameter::compose(BOOST_PP_ENUM_PARAMS_Z(z, n, a)) \ |
| ); \ |
| } |
| /**/ |
| |
| #include <boost/parameter/aux_/preprocessor/nullptr.hpp> |
| |
| // Exapnds to a tagged-argument function overload. |
| #define BOOST_PARAMETER_NO_SPEC_FUNCTION_OVERLOAD_Z(z, n, data) \ |
| template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename TaggedArg)> \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(BOOST_PP_TUPLE_ELEM(4, 1, data)) \ |
| inline typename BOOST_PARAMETER_NO_SPEC_FUNCTION_RESULT_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| )<BOOST_PP_ENUM_PARAMS_Z(z, n, TaggedArg)>::type \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 0, data) \ |
| )(BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, TaggedArg, const& arg)) \ |
| 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_NO_SPEC_FUNCTION_IMPL_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| )( \ |
| static_cast< \ |
| typename BOOST_PARAMETER_NO_SPEC_FUNCTION_RESULT_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| )<BOOST_PP_ENUM_PARAMS_Z(z, n, TaggedArg)>::type(*)() \ |
| >(BOOST_PARAMETER_AUX_PP_NULLPTR) \ |
| , ::boost::parameter::compose(BOOST_PP_ENUM_PARAMS_Z(z, n, arg)) \ |
| ); \ |
| } |
| /**/ |
| |
| #else // !defined(BOOST_NO_SFINAE) |
| |
| #include <boost/parameter/are_tagged_arguments.hpp> |
| #include <boost/parameter/aux_/preprocessor/nullptr.hpp> |
| #include <boost/core/enable_if.hpp> |
| |
| // Exapnds to a tagged-argument constructor overload that passes the argument |
| // pack to the base class delegate constructor. This constructor is enabled |
| // if and only if all its arguments are tagged arguments. |
| #define BOOST_PARAMETER_NO_SPEC_CONSTRUCTOR_OVERLOAD_Z(z, n, data) \ |
| template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename TaggedArg)> \ |
| 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, TaggedArg, const& arg) \ |
| , typename ::boost::enable_if< \ |
| ::boost::parameter::are_tagged_arguments< \ |
| BOOST_PP_ENUM_PARAMS_Z(z, n, TaggedArg) \ |
| > \ |
| >::type* = BOOST_PARAMETER_AUX_PP_NULLPTR \ |
| ) : BOOST_PARAMETER_PARENTHESIZED_TYPE(BOOST_PP_TUPLE_ELEM(2, 1, data))( \ |
| ::boost::parameter::compose(BOOST_PP_ENUM_PARAMS_Z(z, n, arg)) \ |
| ) \ |
| { \ |
| } |
| /**/ |
| |
| // Exapnds to a tagged-argument constructor overload that passes the argument |
| // pack to the delegate function. This constructor is enabled if and only if |
| // all its arguments are tagged arguments. |
| #define BOOST_PARAMETER_NO_SPEC_NO_BASE_CONSTRUCTOR_OVERLOAD_Z(z, n, data) \ |
| template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename TaggedArg)> \ |
| 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, TaggedArg, const& a) \ |
| , typename ::boost::enable_if< \ |
| ::boost::parameter::are_tagged_arguments< \ |
| BOOST_PP_ENUM_PARAMS_Z(z, n, TaggedArg) \ |
| > \ |
| >::type* = BOOST_PARAMETER_AUX_PP_NULLPTR \ |
| ) \ |
| { \ |
| BOOST_PP_TUPLE_ELEM(2, 1, data)( \ |
| ::boost::parameter::compose(BOOST_PP_ENUM_PARAMS_Z(z, n, a)) \ |
| ); \ |
| } |
| /**/ |
| |
| // Exapnds to a function overload that is enabled if and only if |
| // all its arguments are tagged arguments. |
| #define BOOST_PARAMETER_NO_SPEC_FUNCTION_OVERLOAD_Z(z, n, data) \ |
| template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename TaggedArg)> \ |
| BOOST_PARAMETER_MEMBER_FUNCTION_STATIC(BOOST_PP_TUPLE_ELEM(4, 1, data)) \ |
| inline typename ::boost::lazy_enable_if< \ |
| ::boost::parameter \ |
| ::are_tagged_arguments<BOOST_PP_ENUM_PARAMS_Z(z, n, TaggedArg)> \ |
| , BOOST_PARAMETER_NO_SPEC_FUNCTION_RESULT_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| )<BOOST_PP_ENUM_PARAMS_Z(z, n, TaggedArg)> \ |
| >::type BOOST_PARAMETER_MEMBER_FUNCTION_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 0, data) \ |
| )(BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, TaggedArg, const& arg)) \ |
| 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_NO_SPEC_FUNCTION_IMPL_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| )( \ |
| static_cast< \ |
| typename BOOST_PARAMETER_NO_SPEC_FUNCTION_RESULT_NAME( \ |
| BOOST_PP_TUPLE_ELEM(4, 1, data) \ |
| , BOOST_PP_TUPLE_ELEM(4, 3, data) \ |
| )<BOOST_PP_ENUM_PARAMS_Z(z, n, TaggedArg)>::type(*)() \ |
| >(BOOST_PARAMETER_AUX_PP_NULLPTR) \ |
| , ::boost::parameter::compose(BOOST_PP_ENUM_PARAMS_Z(z, n, arg)) \ |
| ); \ |
| } |
| /**/ |
| |
| #endif // BOOST_NO_SFINAE |
| |
| #include <boost/preprocessor/arithmetic/inc.hpp> |
| #include <boost/preprocessor/repetition/repeat_from_to.hpp> |
| |
| // Emulates a variadic constructor that is enabled if and only if all its |
| // arguments are tagged arguments. The enclosing class must inherit from the |
| // specified base class, which in turn must implement a constructor that takes |
| // in the argument pack that this one passes on. |
| #define BOOST_PARAMETER_NO_SPEC_CONSTRUCTOR(class_, base) \ |
| BOOST_PP_REPEAT_FROM_TO( \ |
| 1 \ |
| , BOOST_PP_INC(BOOST_PARAMETER_COMPOSE_MAX_ARITY) \ |
| , BOOST_PARAMETER_NO_SPEC_CONSTRUCTOR_OVERLOAD_Z \ |
| , (class_, base) \ |
| ) |
| /**/ |
| |
| // Emulates a variadic constructor that is enabled if and only if all its |
| // arguments are tagged arguments. The specified function must be able to |
| // take in the argument pack that this constructor passes on. |
| #define BOOST_PARAMETER_NO_SPEC_NO_BASE_CONSTRUCTOR(class_, func) \ |
| BOOST_PP_REPEAT_FROM_TO( \ |
| 1 \ |
| , BOOST_PP_INC(BOOST_PARAMETER_COMPOSE_MAX_ARITY) \ |
| , BOOST_PARAMETER_NO_SPEC_NO_BASE_CONSTRUCTOR_OVERLOAD_Z \ |
| , (class_, func) \ |
| ) |
| /**/ |
| |
| // Emulates a variadic function that is enabled if and only if |
| // all its arguments are tagged arguments. |
| #define BOOST_PARAMETER_NO_SPEC_FUNCTION_OVERLOAD(name, impl, is_m, c) \ |
| BOOST_PP_REPEAT_FROM_TO( \ |
| 1 \ |
| , BOOST_PP_INC(BOOST_PARAMETER_COMPOSE_MAX_ARITY) \ |
| , BOOST_PARAMETER_NO_SPEC_FUNCTION_OVERLOAD_Z \ |
| , (name, impl, is_m, c) \ |
| ) |
| /**/ |
| |
| #endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING |
| #endif // include guard |
| |