| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210 | // Copyright Cromwell D. Enage 2019.// 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_COMPOSE_HPP#define BOOST_PARAMETER_COMPOSE_HPP#include <boost/parameter/aux_/arg_list.hpp>namespace boost { namespace parameter {    inline BOOST_CONSTEXPR ::boost::parameter::aux::empty_arg_list compose()    {        return ::boost::parameter::aux::empty_arg_list();    }}} // namespace boost::parameter#include <boost/parameter/config.hpp>#if defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)namespace boost { namespace parameter { namespace aux {#if defined(BOOST_PARAMETER_CAN_USE_MP11)    template <typename ...TaggedArgs>    struct compose_arg_list    {        using type = ::boost::parameter::aux::flat_like_arg_list<            ::boost::parameter::aux::flat_like_arg_tuple<                typename TaggedArgs::base_type::key_type              , typename TaggedArgs::base_type            >...        >;    };#else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)    template <typename TaggedArg0, typename ...TaggedArgs>    struct compose_arg_list;    template <typename TaggedArg0>    struct compose_arg_list<TaggedArg0>    {        typedef ::boost::parameter::aux::arg_list<TaggedArg0> type;    };    template <typename TaggedArg0, typename ...TaggedArgs>    struct compose_arg_list    {        typedef ::boost::parameter::aux::arg_list<            TaggedArg0          , typename ::boost::parameter::aux            ::compose_arg_list<TaggedArgs...>::type        > type;    };#endif  // BOOST_PARAMETER_CAN_USE_MP11}}} // namespace boost::parameter::aux#include <boost/parameter/are_tagged_arguments.hpp>#include <boost/core/enable_if.hpp>namespace boost { namespace parameter { namespace result_of {    template <typename ...TaggedArgs>    struct compose      : ::boost::lazy_enable_if<            ::boost::parameter::are_tagged_arguments<TaggedArgs...>          , ::boost::parameter::aux::compose_arg_list<TaggedArgs...>        >    {    };    template <>    struct compose<>    {        typedef ::boost::parameter::aux::empty_arg_list type;    };}}} // namespace boost::parameter::result_ofnamespace boost { namespace parameter {    template <typename TaggedArg0, typename ...TaggedArgs>    inline BOOST_CONSTEXPR typename ::boost::parameter::result_of    ::compose<TaggedArg0,TaggedArgs...>::type        compose(TaggedArg0 const& arg0, TaggedArgs const&... args)    {        return typename ::boost::parameter::aux        ::compose_arg_list<TaggedArg0,TaggedArgs...>::type(            ::boost::parameter::aux::value_type_is_not_void()          , arg0          , args...        );    }}} // namespace boost::parameter#else   // !defined(BOOST_PARAMETER_HAS_PERFECT_FORWARDING)#define BOOST_PARAMETER_compose_arg_list_type_suffix(z, n, suffix) suffix#include <boost/preprocessor/cat.hpp>#define BOOST_PARAMETER_compose_arg_list_type_prefix(z, n, prefix)           \    ::boost::parameter::aux::arg_list<BOOST_PP_CAT(prefix, n)/**/#include <boost/preprocessor/facilities/intercept.hpp>#include <boost/preprocessor/repetition/enum.hpp>#include <boost/preprocessor/repetition/repeat.hpp>#define BOOST_PARAMETER_compose_arg_list_type(z, n, prefix)                  \    BOOST_PP_CAT(BOOST_PP_ENUM_, z)(                                         \        n, BOOST_PARAMETER_compose_arg_list_type_prefix, prefix              \    ) BOOST_PP_CAT(BOOST_PP_REPEAT_, z)(                                     \        n, BOOST_PARAMETER_compose_arg_list_type_suffix, >                   \    )/**/#include <boost/parameter/aux_/void.hpp>#include <boost/preprocessor/arithmetic/inc.hpp>#include <boost/preprocessor/arithmetic/sub.hpp>#include <boost/preprocessor/repetition/enum_params.hpp>#include <boost/preprocessor/repetition/enum_binary_params.hpp>#include <boost/preprocessor/repetition/enum_trailing_params.hpp>#if defined(BOOST_NO_SFINAE)#define BOOST_PARAMETER_compose_arg_list_function_overload(z, n, prefix)     \    template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename prefix)>                 \    inline BOOST_CONSTEXPR                                                   \    BOOST_PARAMETER_compose_arg_list_type(z, n, prefix)                      \        compose(BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, prefix, const& a))       \    {                                                                        \        return BOOST_PARAMETER_compose_arg_list_type(z, n, prefix)(          \            BOOST_PP_ENUM_PARAMS_Z(z, n, a)                                  \            BOOST_PP_ENUM_TRAILING_PARAMS_Z(                                 \                z                                                            \              , BOOST_PP_SUB(BOOST_PARAMETER_COMPOSE_MAX_ARITY, n)           \              , ::boost::parameter::aux::void_reference() BOOST_PP_INTERCEPT \            )                                                                \        );                                                                   \    }/**/#else   // !defined(BOOST_NO_SFINAE)#include <boost/parameter/are_tagged_arguments.hpp>#include <boost/core/enable_if.hpp>namespace boost { namespace parameter { namespace result_of {    template <        BOOST_PP_ENUM_BINARY_PARAMS(            BOOST_PP_INC(BOOST_PARAMETER_COMPOSE_MAX_ARITY)          , typename TaggedArg          , = void BOOST_PP_INTERCEPT        )    >    struct compose;    template <>    struct compose<>    {        typedef ::boost::parameter::aux::empty_arg_list type;    };}}} // namespace boost::parameter::result_of#define BOOST_PARAMETER_compose_arg_list_function_overload(z, n, prefix)     \namespace boost { namespace parameter { namespace result_of {                \    template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename prefix)>                 \    struct compose<BOOST_PP_ENUM_PARAMS_Z(z, n, prefix)>                     \      : ::boost::enable_if<                                                  \            ::boost::parameter                                               \            ::are_tagged_arguments<BOOST_PP_ENUM_PARAMS_Z(z, n, prefix)>     \          , BOOST_PARAMETER_compose_arg_list_type(z, n, prefix)              \        >                                                                    \    {                                                                        \    };                                                                       \}}}                                                                          \namespace boost { namespace parameter {                                      \    template <BOOST_PP_ENUM_PARAMS_Z(z, n, typename prefix)>                 \    inline BOOST_CONSTEXPR typename ::boost::parameter::result_of            \    ::compose<BOOST_PP_ENUM_PARAMS_Z(z, n, prefix)>::type                    \        compose(BOOST_PP_ENUM_BINARY_PARAMS_Z(z, n, prefix, const& a))       \    {                                                                        \        return BOOST_PARAMETER_compose_arg_list_type(z, n, prefix)(          \            BOOST_PP_ENUM_PARAMS_Z(z, n, a)                                  \            BOOST_PP_ENUM_TRAILING_PARAMS_Z(                                 \                z                                                            \              , BOOST_PP_SUB(BOOST_PARAMETER_COMPOSE_MAX_ARITY, n)           \              , ::boost::parameter::aux::void_reference() BOOST_PP_INTERCEPT \            )                                                                \        );                                                                   \    }                                                                        \}}/**/#endif  // BOOST_NO_SFINAE#include <boost/preprocessor/repetition/repeat_from_to.hpp>BOOST_PP_REPEAT_FROM_TO(    1  , BOOST_PP_INC(BOOST_PARAMETER_COMPOSE_MAX_ARITY)  , BOOST_PARAMETER_compose_arg_list_function_overload  , TaggedArg)#undef BOOST_PARAMETER_compose_arg_list_function_overload#undef BOOST_PARAMETER_compose_arg_list_type#undef BOOST_PARAMETER_compose_arg_list_type_prefix#undef BOOST_PARAMETER_compose_arg_list_type_suffix#endif  // BOOST_PARAMETER_HAS_PERFECT_FORWARDING#endif  // include guard
 |