[29] | 1 | // Copyright Daniel Wallin 2006. Use, modification and distribution is |
---|
| 2 | // subject to the Boost Software License, Version 1.0. (See accompanying |
---|
| 3 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
---|
| 4 | |
---|
| 5 | #ifndef BOOST_PARAMETER_NAME_060806_HPP |
---|
| 6 | # define BOOST_PARAMETER_NAME_060806_HPP |
---|
| 7 | |
---|
| 8 | # include <boost/parameter/keyword.hpp> |
---|
| 9 | # include <boost/parameter/value_type.hpp> |
---|
| 10 | # include <boost/detail/workaround.hpp> |
---|
| 11 | # include <boost/preprocessor/cat.hpp> |
---|
| 12 | # include <boost/preprocessor/stringize.hpp> |
---|
| 13 | # include <boost/preprocessor/control/iif.hpp> |
---|
| 14 | # include <boost/preprocessor/tuple/eat.hpp> |
---|
| 15 | # include <boost/preprocessor/tuple/elem.hpp> |
---|
| 16 | # include <boost/mpl/placeholders.hpp> |
---|
| 17 | |
---|
| 18 | # if !defined(BOOST_NO_SFINAE) \ |
---|
| 19 | && !defined(BOOST_NO_TEMPLATE_PARTIAL_SPECIALIZATION) |
---|
| 20 | |
---|
| 21 | # include <boost/utility/enable_if.hpp> |
---|
| 22 | # include <boost/mpl/lambda.hpp> |
---|
| 23 | |
---|
| 24 | namespace boost { namespace parameter { namespace aux { |
---|
| 25 | |
---|
| 26 | // Tag type passed to MPL lambda. |
---|
| 27 | struct lambda_tag; |
---|
| 28 | |
---|
| 29 | struct name_tag_base |
---|
| 30 | {}; |
---|
| 31 | |
---|
| 32 | template <class Tag> |
---|
| 33 | struct name_tag |
---|
| 34 | {}; |
---|
| 35 | |
---|
| 36 | template <class T> |
---|
| 37 | struct is_name_tag |
---|
| 38 | : mpl::false_ |
---|
| 39 | {}; |
---|
| 40 | |
---|
| 41 | }}} // namespace boost::parameter::aux |
---|
| 42 | |
---|
| 43 | namespace boost { namespace mpl { |
---|
| 44 | |
---|
| 45 | template <class T> |
---|
| 46 | struct lambda< |
---|
| 47 | T |
---|
| 48 | , typename enable_if< |
---|
| 49 | parameter::aux::is_name_tag<T>, parameter::aux::lambda_tag |
---|
| 50 | >::type |
---|
| 51 | > |
---|
| 52 | { |
---|
| 53 | typedef true_ is_le; |
---|
| 54 | typedef bind3< quote3<parameter::value_type>, arg<2>, T, void> result_; |
---|
| 55 | typedef result_ type; |
---|
| 56 | }; |
---|
| 57 | |
---|
| 58 | }} // namespace boost::mpl |
---|
| 59 | |
---|
| 60 | # endif |
---|
| 61 | |
---|
| 62 | # if BOOST_WORKAROUND(__BORLANDC__, BOOST_TESTED_AT(0x564)) |
---|
| 63 | # include <boost/preprocessor/detail/split.hpp> |
---|
| 64 | // From Paul Mensonides |
---|
| 65 | # define BOOST_PARAMETER_IS_BINARY(x) \ |
---|
| 66 | BOOST_PP_SPLIT(1, BOOST_PARAMETER_IS_BINARY_C x BOOST_PP_COMMA() 0) \ |
---|
| 67 | /**/ |
---|
| 68 | # define BOOST_PARAMETER_IS_BINARY_C(x,y) \ |
---|
| 69 | ~, 1 BOOST_PP_RPAREN() \ |
---|
| 70 | BOOST_PP_TUPLE_EAT(2) BOOST_PP_LPAREN() ~ \ |
---|
| 71 | /**/ |
---|
| 72 | # else |
---|
| 73 | # include <boost/preprocessor/detail/is_binary.hpp> |
---|
| 74 | # define BOOST_PARAMETER_IS_BINARY(x) BOOST_PP_IS_BINARY(x) |
---|
| 75 | # endif |
---|
| 76 | |
---|
| 77 | # if BOOST_WORKAROUND(BOOST_MSVC, < 1300) |
---|
| 78 | # define BOOST_PARAMETER_NAME_OBJECT(tag, name) \ |
---|
| 79 | static ::boost::parameter::keyword<tag>& name \ |
---|
| 80 | = ::boost::parameter::keyword<tag>::get(); |
---|
| 81 | # else |
---|
| 82 | # define BOOST_PARAMETER_NAME_OBJECT(tag, name) \ |
---|
| 83 | namespace \ |
---|
| 84 | { \ |
---|
| 85 | ::boost::parameter::keyword<tag>& name \ |
---|
| 86 | = ::boost::parameter::keyword<tag>::get(); \ |
---|
| 87 | } |
---|
| 88 | # endif |
---|
| 89 | |
---|
| 90 | # define BOOST_PARAMETER_BASIC_NAME(tag_namespace, tag, name) \ |
---|
| 91 | namespace tag_namespace \ |
---|
| 92 | { \ |
---|
| 93 | struct tag \ |
---|
| 94 | { \ |
---|
| 95 | static char const* keyword_name() \ |
---|
| 96 | { \ |
---|
| 97 | return BOOST_PP_STRINGIZE(tag); \ |
---|
| 98 | } \ |
---|
| 99 | \ |
---|
| 100 | typedef boost::parameter::value_type< \ |
---|
| 101 | boost::mpl::_2, tag, boost::parameter::void_ \ |
---|
| 102 | > _; \ |
---|
| 103 | \ |
---|
| 104 | typedef boost::parameter::value_type< \ |
---|
| 105 | boost::mpl::_2, tag, boost::parameter::void_ \ |
---|
| 106 | > _1; \ |
---|
| 107 | }; \ |
---|
| 108 | } \ |
---|
| 109 | BOOST_PARAMETER_NAME_OBJECT(tag_namespace::tag, name) |
---|
| 110 | |
---|
| 111 | # define BOOST_PARAMETER_COMPLEX_NAME_TUPLE1(tag,namespace) \ |
---|
| 112 | (tag, namespace), ~ |
---|
| 113 | |
---|
| 114 | # define BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name) \ |
---|
| 115 | BOOST_PP_TUPLE_ELEM(2, 0, (BOOST_PARAMETER_COMPLEX_NAME_TUPLE1 name)) |
---|
| 116 | |
---|
| 117 | # define BOOST_PARAMETER_COMPLEX_NAME_TAG(name) \ |
---|
| 118 | BOOST_PP_TUPLE_ELEM(2, 0, BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name)) |
---|
| 119 | |
---|
| 120 | # define BOOST_PARAMETER_COMPLEX_NAME_NAMESPACE(name) \ |
---|
| 121 | BOOST_PP_TUPLE_ELEM(2, 1, BOOST_PARAMETER_COMPLEX_NAME_TUPLE(name)) |
---|
| 122 | |
---|
| 123 | # define BOOST_PARAMETER_COMPLEX_NAME(name) \ |
---|
| 124 | BOOST_PARAMETER_BASIC_NAME( \ |
---|
| 125 | BOOST_PARAMETER_COMPLEX_NAME_NAMESPACE(name) \ |
---|
| 126 | , BOOST_PP_TUPLE_EAT(2) name \ |
---|
| 127 | , BOOST_PARAMETER_COMPLEX_NAME_TAG(name) \ |
---|
| 128 | ) \ |
---|
| 129 | /**/ |
---|
| 130 | |
---|
| 131 | # define BOOST_PARAMETER_SIMPLE_NAME(name) \ |
---|
| 132 | BOOST_PARAMETER_BASIC_NAME(tag, name, BOOST_PP_CAT(_, name)) |
---|
| 133 | |
---|
| 134 | # define BOOST_PARAMETER_NAME(name) \ |
---|
| 135 | BOOST_PP_IIF( \ |
---|
| 136 | BOOST_PARAMETER_IS_BINARY(name) \ |
---|
| 137 | , BOOST_PARAMETER_COMPLEX_NAME \ |
---|
| 138 | , BOOST_PARAMETER_SIMPLE_NAME \ |
---|
| 139 | )(name) \ |
---|
| 140 | /**/ |
---|
| 141 | |
---|
| 142 | |
---|
| 143 | # define BOOST_PARAMETER_TEMPLATE_KEYWORD(name) \ |
---|
| 144 | namespace tag \ |
---|
| 145 | { \ |
---|
| 146 | struct name; \ |
---|
| 147 | } \ |
---|
| 148 | template <class T> \ |
---|
| 149 | struct name \ |
---|
| 150 | : boost::parameter::template_keyword<tag::name, T> \ |
---|
| 151 | {}; \ |
---|
| 152 | /**/ |
---|
| 153 | |
---|
| 154 | #endif // BOOST_PARAMETER_NAME_060806_HPP |
---|
| 155 | |
---|