123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232 |
- // Copyright David Abrahams, Daniel Wallin 2003.
- // 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_MACROS_050412_HPP
- #define BOOST_PARAMETER_MACROS_050412_HPP
- #include <boost/parameter/config.hpp>
- #include <boost/preprocessor/repetition/enum_params.hpp>
- #if !defined(BOOST_NO_SFINAE) && \
- !BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592))
- #define BOOST_PARAMETER_MATCH_TYPE(n, param) \
- , typename param::match<BOOST_PP_ENUM_PARAMS(n, T)>::type kw = param()
- /**/
- #define BOOST_PARAMETER_MATCH_TYPE_Z(z, n, param) \
- , typename param::match<BOOST_PP_ENUM_PARAMS_Z(z, n, T)>::type kw = param()
- /**/
- #else // SFINAE disbled, or Borland workarounds needed.
- #define BOOST_PARAMETER_MATCH_TYPE(n, param) , param kw = param()
- /**/
- #define BOOST_PARAMETER_MATCH_TYPE_Z(z, n, param) , param kw = param()
- /**/
- #endif // SFINAE enabled, not Borland.
- #include <boost/preprocessor/control/if.hpp>
- #include <boost/preprocessor/repetition/enum_binary_params.hpp>
- #include <boost/preprocessor/tuple/elem.hpp>
- #include <boost/preprocessor/cat.hpp>
- #if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
- #define BOOST_PARAMETER_FUN_0(z, n, params) \
- BOOST_PP_TUPLE_ELEM(3, 0, params) BOOST_PP_TUPLE_ELEM(3, 1, params)() \
- { \
- return BOOST_PP_CAT( \
- BOOST_PP_TUPLE_ELEM(3, 1, params) \
- , _with_named_params \
- )(BOOST_PP_TUPLE_ELEM(3, 2, params)()()); \
- }
- /**/
- #include <utility>
- #define BOOST_PARAMETER_FUN_DECL_PARAM(z, n, p) \
- ::std::forward<BOOST_PP_CAT(T, n)>(BOOST_PP_CAT(p, n))
- /**/
- #include <boost/preprocessor/repetition/enum.hpp>
- #define BOOST_PARAMETER_FUN_DEFN_1(z, n, params) \
- template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename T)> \
- BOOST_PP_TUPLE_ELEM(3, 0, params) \
- BOOST_PP_TUPLE_ELEM(3, 1, params)( \
- BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, T, && p) \
- BOOST_PARAMETER_MATCH_TYPE_Z( \
- z, n, BOOST_PP_TUPLE_ELEM(3, 2, params) \
- ) \
- ) \
- { \
- return BOOST_PP_CAT( \
- BOOST_PP_TUPLE_ELEM(3, 1, params) \
- , _with_named_params \
- )( \
- kw( \
- BOOST_PP_CAT(BOOST_PP_ENUM_, z)( \
- n, BOOST_PARAMETER_FUN_DECL_PARAM, p \
- ) \
- ) \
- ); \
- }
- /**/
- #define BOOST_PARAMETER_FUN_DECL(z, n, params) \
- BOOST_PP_IF( \
- n \
- , BOOST_PARAMETER_FUN_DEFN_1 \
- , BOOST_PARAMETER_FUN_0 \
- )(z, n, params)
- /**/
- #else // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)
- #define BOOST_PARAMETER_FUN_DEFN_0(z, n, params) \
- template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename T)> \
- BOOST_PP_TUPLE_ELEM(3, 0, params) \
- BOOST_PP_TUPLE_ELEM(3, 1, params)( \
- BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, T, const& p) \
- BOOST_PARAMETER_MATCH_TYPE_Z( \
- z, n, BOOST_PP_TUPLE_ELEM(3, 2, params) \
- ) \
- ) \
- { \
- return BOOST_PP_CAT( \
- BOOST_PP_TUPLE_ELEM(3, 1, params) \
- , _with_named_params \
- )(kw(BOOST_PP_ENUM_PARAMS_Z(z, n, p))); \
- }
- /**/
- #include <boost/preprocessor/seq/seq.hpp>
- #define BOOST_PARAMETER_FUN_0(z, n, seq) \
- BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq))) \
- BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)))() \
- { \
- return BOOST_PP_CAT( \
- BOOST_PP_TUPLE_ELEM( \
- 3, 1, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq)) \
- ) \
- , _with_named_params \
- )( \
- BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_HEAD(BOOST_PP_SEQ_TAIL(seq))) \
- ()() \
- ); \
- }
- /**/
- #include <boost/parameter/aux_/preprocessor/binary_seq_to_args.hpp>
- #include <boost/preprocessor/seq/size.hpp>
- #define BOOST_PARAMETER_FUN_DEFN_R(r, seq) \
- template < \
- BOOST_PP_ENUM_PARAMS( \
- BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_TAIL(seq)) \
- , typename T \
- ) \
- > BOOST_PP_TUPLE_ELEM(3, 0, BOOST_PP_SEQ_HEAD(seq)) \
- BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_SEQ_HEAD(seq))( \
- BOOST_PARAMETER_AUX_PP_BINARY_SEQ_TO_ARGS( \
- BOOST_PP_SEQ_TAIL(seq), (T)(p) \
- ) \
- BOOST_PARAMETER_MATCH_TYPE( \
- BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_TAIL(seq)) \
- , BOOST_PP_TUPLE_ELEM(3, 2, BOOST_PP_SEQ_HEAD(seq)) \
- ) \
- ) \
- { \
- return BOOST_PP_CAT( \
- BOOST_PP_TUPLE_ELEM(3, 1, BOOST_PP_SEQ_HEAD(seq)) \
- , _with_named_params \
- )( \
- kw( \
- BOOST_PP_ENUM_PARAMS( \
- BOOST_PP_SEQ_SIZE(BOOST_PP_SEQ_TAIL(seq)), p \
- ) \
- ) \
- ); \
- }
- /**/
- #include <boost/parameter/aux_/preprocessor/binary_seq_for_each.hpp>
- #include <boost/preprocessor/tuple/eat.hpp>
- #define BOOST_PARAMETER_FUN_DEFN_1(z, n, params) \
- BOOST_PP_IF( \
- n \
- , BOOST_PARAMETER_AUX_PP_BINARY_SEQ_FOR_EACH_Z \
- , BOOST_PARAMETER_FUN_0 \
- )(z, n, (BOOST_PARAMETER_FUN_DEFN_R)(params))
- /**/
- #include <boost/preprocessor/comparison/less.hpp>
- #define BOOST_PARAMETER_FUN_DECL(z, n, params) \
- BOOST_PP_CAT( \
- BOOST_PARAMETER_FUN_DEFN_ \
- , BOOST_PP_LESS( \
- n \
- , BOOST_PARAMETER_EXPONENTIAL_OVERLOAD_THRESHOLD_ARITY \
- ) \
- )(z, n, params)
- /**/
- #endif // BOOST_PARAMETER_HAS_PERFECT_FORWARDING
- #include <boost/preprocessor/arithmetic/inc.hpp>
- #include <boost/preprocessor/repetition/repeat_from_to.hpp>
- // Generates:
- //
- // template <typename Params>
- // ret name ## _with_named_params(Params const&);
- //
- // template <typename T0>
- // ret name(
- // T0 && p0
- // , typename parameters::match<T0>::type kw = parameters()
- // )
- // {
- // return name ## _with_named_params(kw(p0));
- // }
- //
- // template <typename T0, ..., typename T ## N>
- // ret name(
- // T0 && p0, ..., TN && p ## N
- // , typename parameters::match<T0, ..., T ## N>::type kw = parameters()
- // )
- // {
- // return name ## _with_named_params(kw(p0, ..., p ## N));
- // }
- //
- // template <typename Params>
- // ret name ## _with_named_params(Params const&)
- //
- // lo and hi determine the min and max arities of the generated functions.
- #define BOOST_PARAMETER_MEMFUN(ret, name, lo, hi, parameters) \
- BOOST_PP_REPEAT_FROM_TO( \
- lo, BOOST_PP_INC(hi), BOOST_PARAMETER_FUN_DECL \
- , (ret, name, parameters) \
- ) \
- template <typename Params> \
- ret BOOST_PP_CAT(name, _with_named_params)(Params const& p)
- /**/
- #define BOOST_PARAMETER_FUN(ret, name, lo, hi, parameters) \
- template <typename Params> \
- ret BOOST_PP_CAT(name, _with_named_params)(Params const& p); \
- BOOST_PARAMETER_MEMFUN(ret, name, lo, hi, parameters)
- /**/
- #endif // include guard
|