| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 | // Copyright Eric Niebler 2005.// 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_NESTED_KEYWORD_HPP#define BOOST_PARAMETER_NESTED_KEYWORD_HPP#include <boost/parameter/aux_/name.hpp>#include <boost/parameter/keyword.hpp>#include <boost/parameter/config.hpp>#include <boost/preprocessor/cat.hpp>#include <boost/preprocessor/stringize.hpp>#if defined(BOOST_PARAMETER_CAN_USE_MP11)#define BOOST_PARAMETER_NESTED_KEYWORD_AUX(tag_namespace, q, name, alias)    \    namespace tag_namespace                                                  \    {                                                                        \        template <int Dummy = 0>                                             \        struct BOOST_PP_CAT(name, _)                                         \        {                                                                    \            static BOOST_CONSTEXPR char const* keyword_name()                \            {                                                                \                return BOOST_PP_STRINGIZE(name);                             \            }                                                                \            using _ = BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE(                  \                BOOST_PP_CAT(name, _)<Dummy>                                 \            );                                                               \            using _1 = BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE(                 \                BOOST_PP_CAT(name, _)<Dummy>                                 \            );                                                               \            BOOST_PARAMETER_TAG_MP11_PLACEHOLDER_BINDING(                    \                binding_fn                                                   \              , BOOST_PP_CAT(name, _)<Dummy>                                 \            );                                                               \            BOOST_PARAMETER_TAG_MP11_PLACEHOLDER_VALUE(                      \                fn                                                           \              , BOOST_PP_CAT(name, _)<Dummy>                                 \            );                                                               \            using qualifier = ::boost::parameter::q;                         \            static ::boost::parameter::keyword<                              \                BOOST_PP_CAT(name, _)<Dummy>                                 \            > const& alias;                                                  \        };                                                                   \        template <int Dummy>                                                 \        ::boost::parameter::keyword<                                         \            BOOST_PP_CAT(name, _)<Dummy>                                     \        > const& BOOST_PP_CAT(name, _)<Dummy>::alias                         \            = ::boost::parameter::keyword<                                   \                BOOST_PP_CAT(name, _)<Dummy>                                 \            >::instance;                                                     \        typedef BOOST_PP_CAT(name, _)<> name;                                \    }                                                                        \    namespace                                                                \    {                                                                        \        ::boost::parameter::keyword<tag_namespace::name> const& name         \            = ::boost::parameter::keyword<tag_namespace::name>::instance;    \    }/**/#else   // !defined(BOOST_PARAMETER_CAN_USE_MP11)#define BOOST_PARAMETER_NESTED_KEYWORD_AUX(tag_namespace, q, name, alias)    \    namespace tag_namespace                                                  \    {                                                                        \        template <int Dummy = 0>                                             \        struct BOOST_PP_CAT(name, _)                                         \        {                                                                    \            static BOOST_CONSTEXPR char const* keyword_name()                \            {                                                                \                return BOOST_PP_STRINGIZE(name);                             \            }                                                                \            typedef BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE(                    \                BOOST_PP_CAT(name, _)<Dummy>                                 \            ) _;                                                             \            typedef BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE(                    \                BOOST_PP_CAT(name, _)<Dummy>                                 \            ) _1;                                                            \            typedef ::boost::parameter::q qualifier;                         \            static ::boost::parameter::keyword<                              \                BOOST_PP_CAT(name, _)<Dummy>                                 \            > const& alias;                                                  \        };                                                                   \        template <int Dummy>                                                 \        ::boost::parameter::keyword<                                         \            BOOST_PP_CAT(name, _)<Dummy>                                     \        > const& BOOST_PP_CAT(name, _)<Dummy>::alias                         \            = ::boost::parameter::keyword<                                   \                BOOST_PP_CAT(name, _)<Dummy>                                 \            >::instance;                                                     \        typedef BOOST_PP_CAT(name, _)<> name;                                \    }                                                                        \    namespace                                                                \    {                                                                        \        ::boost::parameter::keyword<tag_namespace::name> const& name         \            = ::boost::parameter::keyword<tag_namespace::name>::instance;    \    }/**/#endif  // BOOST_PARAMETER_CAN_USE_MP11#include <boost/parameter/aux_/preprocessor/qualifier.hpp>#define BOOST_PARAMETER_NESTED_KEYWORD(tag_namespace, name, alias)           \    BOOST_PARAMETER_NESTED_KEYWORD_AUX(                                      \        tag_namespace                                                        \      , BOOST_PARAMETER_GET_QUALIFIER(name)                                  \      , BOOST_PARAMETER_UNQUALIFIED(name)                                    \      , alias                                                                \    )/**/#endif  // include guard
 |