diff options
Diffstat (limited to 'boost/parameter/macros.hpp')
-rw-r--r-- | boost/parameter/macros.hpp | 277 |
1 files changed, 205 insertions, 72 deletions
diff --git a/boost/parameter/macros.hpp b/boost/parameter/macros.hpp index 83fbfb5a60..5ff20fc232 100644 --- a/boost/parameter/macros.hpp +++ b/boost/parameter/macros.hpp @@ -1,99 +1,232 @@ -// Copyright David Abrahams, Daniel Wallin 2003. Use, modification and -// distribution is subject to the Boost Software License, Version 1.0. -// (See accompanying file LICENSE_1_0.txt or copy at +// 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/preprocessor/tuple/elem.hpp> -#include <boost/preprocessor/repetition/repeat_from_to.hpp> -#include <boost/preprocessor/arithmetic/inc.hpp> -#include <boost/preprocessor/logical/bool.hpp> -#include <boost/preprocessor/punctuation/comma_if.hpp> -#include <boost/preprocessor/control/expr_if.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> -#include <boost/detail/workaround.hpp> - -#define BOOST_PARAMETER_FUN_TEMPLATE_HEAD1(n) \ - template<BOOST_PP_ENUM_PARAMS(n, class T)> - -#define BOOST_PARAMETER_FUN_TEMPLATE_HEAD0(n) - -#if ! defined(BOOST_NO_SFINAE) && ! BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x592)) - -# define BOOST_PARAMETER_MATCH_TYPE(n, param) \ - BOOST_PP_EXPR_IF(n, typename) param::match \ - < \ - BOOST_PP_ENUM_PARAMS(n, T) \ - >::type - -#else - -# define BOOST_PARAMETER_MATCH_TYPE(n, param) param - -#endif - -#define BOOST_PARAMETER_FUN_DECL(z, n, params) \ - \ - BOOST_PP_CAT(BOOST_PARAMETER_FUN_TEMPLATE_HEAD, BOOST_PP_BOOL(n))(n) \ - \ - BOOST_PP_TUPLE_ELEM(3, 0, params) \ - BOOST_PP_TUPLE_ELEM(3, 1, params)( \ - BOOST_PP_ENUM_BINARY_PARAMS(n, T, const& p) \ - BOOST_PP_COMMA_IF(n) \ - BOOST_PARAMETER_MATCH_TYPE(n,BOOST_PP_TUPLE_ELEM(3, 2, params)) \ - kw = 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(n, p)) \ - ); \ + +#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<class Params> +// template <typename Params> // ret name ## _with_named_params(Params const&); // -// template<class T0> -// ret name(T0 const& p0, typename parameters::match<T0>::type kw = parameters()) +// template <typename T0> +// ret name( +// T0 && p0 +// , typename parameters::match<T0>::type kw = parameters() +// ) // { // return name ## _with_named_params(kw(p0)); // } // -// template<class T0, ..., class TN> -// ret name(T0 const& p0, ..., TN const& PN -// , typename parameters::match<T0, ..., TN>::type kw = parameters()) +// 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, ..., pN)); +// return name ## _with_named_params(kw(p0, ..., p ## N)); // } // -// template<class Params> +// template <typename Params> // ret name ## _with_named_params(Params const&) // -// lo and hi determines the min and max arity of the generated functions. - -#define BOOST_PARAMETER_FUN(ret, name, lo, hi, parameters) \ - \ - template<class Params> \ - ret BOOST_PP_CAT(name, _with_named_params)(Params const& p); \ - \ - BOOST_PP_REPEAT_FROM_TO( \ - lo, BOOST_PP_INC(hi), BOOST_PARAMETER_FUN_DECL, (ret, name, parameters)) \ - \ - template<class Params> \ - ret BOOST_PP_CAT(name, _with_named_params)(Params const& p) +// 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<class Params> \ +#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 // BOOST_PARAMETER_MACROS_050412_HPP +#endif // include guard |