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 | |
---|