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