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