// 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 #include #include #include #include #if defined(BOOST_PARAMETER_CAN_USE_MP11) #define BOOST_PARAMETER_NESTED_KEYWORD_AUX(tag_namespace, q, name, alias) \ namespace tag_namespace \ { \ template \ 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, _) \ ); \ using _1 = BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE( \ BOOST_PP_CAT(name, _) \ ); \ BOOST_PARAMETER_TAG_MP11_PLACEHOLDER_BINDING( \ binding_fn \ , BOOST_PP_CAT(name, _) \ ); \ BOOST_PARAMETER_TAG_MP11_PLACEHOLDER_VALUE( \ fn \ , BOOST_PP_CAT(name, _) \ ); \ using qualifier = ::boost::parameter::q; \ static ::boost::parameter::keyword< \ BOOST_PP_CAT(name, _) \ > const& alias; \ }; \ template \ ::boost::parameter::keyword< \ BOOST_PP_CAT(name, _) \ > const& BOOST_PP_CAT(name, _)::alias \ = ::boost::parameter::keyword< \ BOOST_PP_CAT(name, _) \ >::instance; \ typedef BOOST_PP_CAT(name, _)<> name; \ } \ namespace \ { \ ::boost::parameter::keyword const& name \ = ::boost::parameter::keyword::instance; \ } /**/ #else // !defined(BOOST_PARAMETER_CAN_USE_MP11) #define BOOST_PARAMETER_NESTED_KEYWORD_AUX(tag_namespace, q, name, alias) \ namespace tag_namespace \ { \ template \ 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, _) \ ) _; \ typedef BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE( \ BOOST_PP_CAT(name, _) \ ) _1; \ typedef ::boost::parameter::q qualifier; \ static ::boost::parameter::keyword< \ BOOST_PP_CAT(name, _) \ > const& alias; \ }; \ template \ ::boost::parameter::keyword< \ BOOST_PP_CAT(name, _) \ > const& BOOST_PP_CAT(name, _)::alias \ = ::boost::parameter::keyword< \ BOOST_PP_CAT(name, _) \ >::instance; \ typedef BOOST_PP_CAT(name, _)<> name; \ } \ namespace \ { \ ::boost::parameter::keyword const& name \ = ::boost::parameter::keyword::instance; \ } /**/ #endif // BOOST_PARAMETER_CAN_USE_MP11 #include #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