1 // Copyright Eric Niebler 2005. 2 // Distributed under the Boost Software License, Version 1.0. 3 // (See accompanying file LICENSE_1_0.txt or copy at 4 // http://www.boost.org/LICENSE_1_0.txt) 5 6 #ifndef BOOST_PARAMETER_NESTED_KEYWORD_HPP 7 #define BOOST_PARAMETER_NESTED_KEYWORD_HPP 8 9 #include <boost/parameter/aux_/name.hpp> 10 #include <boost/parameter/keyword.hpp> 11 #include <boost/parameter/config.hpp> 12 #include <boost/preprocessor/cat.hpp> 13 #include <boost/preprocessor/stringize.hpp> 14 15 #if defined(BOOST_PARAMETER_CAN_USE_MP11) 16 #define BOOST_PARAMETER_NESTED_KEYWORD_AUX(tag_namespace, q, name, alias) \ 17 namespace tag_namespace \ 18 { \ 19 template <int Dummy = 0> \ 20 struct BOOST_PP_CAT(name, _) \ 21 { \ 22 static BOOST_CONSTEXPR char const* keyword_name() \ 23 { \ 24 return BOOST_PP_STRINGIZE(name); \ 25 } \ 26 using _ = BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE( \ 27 BOOST_PP_CAT(name, _)<Dummy> \ 28 ); \ 29 using _1 = BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE( \ 30 BOOST_PP_CAT(name, _)<Dummy> \ 31 ); \ 32 BOOST_PARAMETER_TAG_MP11_PLACEHOLDER_BINDING( \ 33 binding_fn \ 34 , BOOST_PP_CAT(name, _)<Dummy> \ 35 ); \ 36 BOOST_PARAMETER_TAG_MP11_PLACEHOLDER_VALUE( \ 37 fn \ 38 , BOOST_PP_CAT(name, _)<Dummy> \ 39 ); \ 40 using qualifier = ::boost::parameter::q; \ 41 static ::boost::parameter::keyword< \ 42 BOOST_PP_CAT(name, _)<Dummy> \ 43 > const& alias; \ 44 }; \ 45 template <int Dummy> \ 46 ::boost::parameter::keyword< \ 47 BOOST_PP_CAT(name, _)<Dummy> \ 48 > const& BOOST_PP_CAT(name, _)<Dummy>::alias \ 49 = ::boost::parameter::keyword< \ 50 BOOST_PP_CAT(name, _)<Dummy> \ 51 >::instance; \ 52 typedef BOOST_PP_CAT(name, _)<> name; \ 53 } \ 54 namespace \ 55 { \ 56 ::boost::parameter::keyword<tag_namespace::name> const& name \ 57 = ::boost::parameter::keyword<tag_namespace::name>::instance; \ 58 } 59 /**/ 60 #else // !defined(BOOST_PARAMETER_CAN_USE_MP11) 61 #define BOOST_PARAMETER_NESTED_KEYWORD_AUX(tag_namespace, q, name, alias) \ 62 namespace tag_namespace \ 63 { \ 64 template <int Dummy = 0> \ 65 struct BOOST_PP_CAT(name, _) \ 66 { \ 67 static BOOST_CONSTEXPR char const* keyword_name() \ 68 { \ 69 return BOOST_PP_STRINGIZE(name); \ 70 } \ 71 typedef BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE( \ 72 BOOST_PP_CAT(name, _)<Dummy> \ 73 ) _; \ 74 typedef BOOST_PARAMETER_TAG_PLACEHOLDER_TYPE( \ 75 BOOST_PP_CAT(name, _)<Dummy> \ 76 ) _1; \ 77 typedef ::boost::parameter::q qualifier; \ 78 static ::boost::parameter::keyword< \ 79 BOOST_PP_CAT(name, _)<Dummy> \ 80 > const& alias; \ 81 }; \ 82 template <int Dummy> \ 83 ::boost::parameter::keyword< \ 84 BOOST_PP_CAT(name, _)<Dummy> \ 85 > const& BOOST_PP_CAT(name, _)<Dummy>::alias \ 86 = ::boost::parameter::keyword< \ 87 BOOST_PP_CAT(name, _)<Dummy> \ 88 >::instance; \ 89 typedef BOOST_PP_CAT(name, _)<> name; \ 90 } \ 91 namespace \ 92 { \ 93 ::boost::parameter::keyword<tag_namespace::name> const& name \ 94 = ::boost::parameter::keyword<tag_namespace::name>::instance; \ 95 } 96 /**/ 97 #endif // BOOST_PARAMETER_CAN_USE_MP11 98 99 #include <boost/parameter/aux_/preprocessor/qualifier.hpp> 100 101 #define BOOST_PARAMETER_NESTED_KEYWORD(tag_namespace, name, alias) \ 102 BOOST_PARAMETER_NESTED_KEYWORD_AUX( \ 103 tag_namespace \ 104 , BOOST_PARAMETER_GET_QUALIFIER(name) \ 105 , BOOST_PARAMETER_UNQUALIFIED(name) \ 106 , alias \ 107 ) 108 /**/ 109 110 #endif // include guard 111 112