Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 2001-2009 Joel de Guzman
|
Chris@16
|
3 Copyright (c) 2005-2006 Dan Marsden
|
Chris@16
|
4 Copyright (c) 2010 Christopher Schmidt
|
Chris@16
|
5
|
Chris@16
|
6 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
7 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
8 ==============================================================================*/
|
Chris@16
|
9
|
Chris@16
|
10 #ifndef BOOST_FUSION_ADAPTED_ADT_DETAIL_ADAPT_BASE_HPP
|
Chris@16
|
11 #define BOOST_FUSION_ADAPTED_ADT_DETAIL_ADAPT_BASE_HPP
|
Chris@16
|
12
|
Chris@101
|
13 #include <boost/fusion/support/config.hpp>
|
Chris@101
|
14 #include <boost/fusion/adapted/struct/detail/adapt_auto.hpp>
|
Chris@101
|
15 #include <boost/fusion/adapted/struct/detail/adapt_is_tpl.hpp>
|
Chris@101
|
16
|
Chris@16
|
17 #include <boost/preprocessor/control/if.hpp>
|
Chris@16
|
18 #include <boost/preprocessor/seq/seq.hpp>
|
Chris@16
|
19 #include <boost/preprocessor/seq/elem.hpp>
|
Chris@16
|
20 #include <boost/mpl/if.hpp>
|
Chris@16
|
21 #include <boost/type_traits/is_const.hpp>
|
Chris@101
|
22 #include <boost/type_traits/add_const.hpp>
|
Chris@101
|
23 #include <boost/type_traits/remove_const.hpp>
|
Chris@101
|
24
|
Chris@101
|
25 #include <boost/typeof/typeof.hpp>
|
Chris@16
|
26
|
Chris@16
|
27 #define BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_TEMPLATE_IMPL(TEMPLATE_PARAMS_SEQ) \
|
Chris@16
|
28 typename detail::get_identity< \
|
Chris@16
|
29 lvalue \
|
Chris@16
|
30 , BOOST_PP_SEQ_ELEM(1,TEMPLATE_PARAMS_SEQ) \
|
Chris@16
|
31 >::type
|
Chris@16
|
32
|
Chris@16
|
33 #define BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_NON_TEMPLATE_IMPL( \
|
Chris@16
|
34 TEMPLATE_PARAMS_SEQ) \
|
Chris@16
|
35 \
|
Chris@16
|
36 boost::remove_const<boost::remove_reference<lvalue>::type>::type
|
Chris@16
|
37
|
Chris@101
|
38 #define BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
|
Chris@101
|
39 ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE) \
|
Chris@101
|
40 BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, \
|
Chris@101
|
41 BOOST_PP_IF(DEDUCE_TYPE, 0, 2), ATTRIBUTE)
|
Chris@101
|
42
|
Chris@101
|
43 #define BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_SETEXPR(ATTRIBUTE, \
|
Chris@101
|
44 ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE) \
|
Chris@101
|
45 BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, \
|
Chris@101
|
46 BOOST_PP_IF(DEDUCE_TYPE, 1, 3), ATTRIBUTE)
|
Chris@101
|
47
|
Chris@101
|
48 #ifdef BOOST_MSVC
|
Chris@101
|
49 # define BOOST_FUSION_DEDUCED_ATTR_TYPE(NAME_SEQ, ATTRIBUTE, \
|
Chris@101
|
50 ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
Chris@101
|
51 \
|
Chris@101
|
52 BOOST_FUSION_ADAPT_STRUCT_MSVC_REDEFINE_TEMPLATE_PARAMS( \
|
Chris@101
|
53 TEMPLATE_PARAMS_SEQ) \
|
Chris@101
|
54 \
|
Chris@101
|
55 struct deduced_attr_type { \
|
Chris@101
|
56 static const BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj; \
|
Chris@101
|
57 typedef \
|
Chris@101
|
58 BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
|
Chris@101
|
59 BOOST_TYPEOF( PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR( \
|
Chris@101
|
60 ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, 1)) type; \
|
Chris@101
|
61 };
|
Chris@101
|
62
|
Chris@101
|
63 #else
|
Chris@101
|
64 # define BOOST_FUSION_DEDUCED_ATTR_TYPE(NAME_SEQ, ATTRIBUTE, \
|
Chris@101
|
65 ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
Chris@101
|
66 struct deduced_attr_type { \
|
Chris@101
|
67 static const BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj; \
|
Chris@101
|
68 typedef BOOST_TYPEOF( PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR( \
|
Chris@101
|
69 ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, 1)) type; \
|
Chris@101
|
70 };
|
Chris@101
|
71
|
Chris@101
|
72 #endif
|
Chris@101
|
73
|
Chris@101
|
74 #define BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF( \
|
Chris@101
|
75 NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
Chris@101
|
76 \
|
Chris@101
|
77 BOOST_FUSION_DEDUCED_ATTR_TYPE( \
|
Chris@101
|
78 NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
Chris@101
|
79 \
|
Chris@101
|
80 typedef \
|
Chris@101
|
81 BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
|
Chris@101
|
82 boost::remove_const< \
|
Chris@101
|
83 BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
|
Chris@101
|
84 deduced_attr_type::type \
|
Chris@101
|
85 >::type type; \
|
Chris@101
|
86 \
|
Chris@101
|
87 typedef \
|
Chris@101
|
88 BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
|
Chris@101
|
89 boost::add_const< \
|
Chris@101
|
90 BOOST_PP_IF(BOOST_FUSION_ADAPT_IS_TPL(TEMPLATE_PARAMS_SEQ),typename,) \
|
Chris@101
|
91 deduced_attr_type::type \
|
Chris@101
|
92 >::type const_type;
|
Chris@101
|
93
|
Chris@101
|
94 #define BOOST_FUSION_ADT_ATTRIBUTE_GIVENTYPE( \
|
Chris@101
|
95 NAME_SEQ, ATTRIBUTE, ATTRIBUTE_TUPEL_SIZE, PREFIX, TEMPLATE_PARAMS_SEQ) \
|
Chris@101
|
96 \
|
Chris@101
|
97 typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 0, ATTRIBUTE) type; \
|
Chris@101
|
98 typedef BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE, 1, ATTRIBUTE) const_type;
|
Chris@101
|
99
|
Chris@101
|
100
|
Chris@16
|
101 #define BOOST_FUSION_ADAPT_ADT_C_BASE( \
|
Chris@101
|
102 TEMPLATE_PARAMS_SEQ,NAME_SEQ,I,PREFIX, \
|
Chris@101
|
103 ATTRIBUTE,ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE) \
|
Chris@16
|
104 \
|
Chris@16
|
105 template< \
|
Chris@16
|
106 BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
|
Chris@16
|
107 > \
|
Chris@16
|
108 struct access::adt_attribute_access< \
|
Chris@16
|
109 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
Chris@16
|
110 , I \
|
Chris@16
|
111 > \
|
Chris@16
|
112 { \
|
Chris@101
|
113 \
|
Chris@101
|
114 BOOST_PP_IF(DEDUCE_TYPE, \
|
Chris@101
|
115 BOOST_FUSION_ADT_ATTRIBUTE_TYPEOF, \
|
Chris@101
|
116 BOOST_FUSION_ADT_ATTRIBUTE_GIVENTYPE)( \
|
Chris@101
|
117 NAME_SEQ, \
|
Chris@101
|
118 ATTRIBUTE, \
|
Chris@101
|
119 ATTRIBUTE_TUPEL_SIZE, \
|
Chris@101
|
120 PREFIX, \
|
Chris@101
|
121 TEMPLATE_PARAMS_SEQ) \
|
Chris@101
|
122 \
|
Chris@16
|
123 template<class Val> \
|
Chris@101
|
124 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
125 static void \
|
Chris@16
|
126 boost_fusion_adapt_adt_impl_set( \
|
Chris@16
|
127 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj, \
|
Chris@16
|
128 Val const& val) \
|
Chris@16
|
129 { \
|
Chris@101
|
130 PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_SETEXPR(ATTRIBUTE, \
|
Chris@101
|
131 ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE); \
|
Chris@16
|
132 } \
|
Chris@16
|
133 \
|
Chris@101
|
134 BOOST_FUSION_GPU_ENABLED \
|
Chris@101
|
135 static type \
|
Chris@16
|
136 boost_fusion_adapt_adt_impl_get( \
|
Chris@16
|
137 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& obj) \
|
Chris@16
|
138 { \
|
Chris@101
|
139 return PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
|
Chris@101
|
140 ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE); \
|
Chris@16
|
141 } \
|
Chris@16
|
142 \
|
Chris@101
|
143 BOOST_FUSION_GPU_ENABLED \
|
Chris@101
|
144 static const_type \
|
Chris@16
|
145 boost_fusion_adapt_adt_impl_get( \
|
Chris@16
|
146 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const& obj) \
|
Chris@16
|
147 { \
|
Chris@101
|
148 return PREFIX() BOOST_FUSION_ADAPT_ADT_ATTRIBUTE_GETEXPR(ATTRIBUTE, \
|
Chris@101
|
149 ATTRIBUTE_TUPEL_SIZE, DEDUCE_TYPE); \
|
Chris@16
|
150 } \
|
Chris@16
|
151 }; \
|
Chris@16
|
152 \
|
Chris@16
|
153 template< \
|
Chris@16
|
154 BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
|
Chris@16
|
155 > \
|
Chris@16
|
156 struct adt_attribute_proxy< \
|
Chris@16
|
157 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
Chris@16
|
158 , I \
|
Chris@16
|
159 , true \
|
Chris@16
|
160 > \
|
Chris@16
|
161 { \
|
Chris@101
|
162 typedef \
|
Chris@101
|
163 BOOST_PP_IF(BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ), typename, ) \
|
Chris@101
|
164 access::adt_attribute_access< \
|
Chris@101
|
165 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
Chris@101
|
166 , I \
|
Chris@101
|
167 >::const_type type; \
|
Chris@16
|
168 \
|
Chris@101
|
169 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
170 explicit \
|
Chris@16
|
171 adt_attribute_proxy( \
|
Chris@16
|
172 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const& o) \
|
Chris@16
|
173 : obj(&o) \
|
Chris@16
|
174 {} \
|
Chris@16
|
175 \
|
Chris@101
|
176 BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
177 type get() const \
|
Chris@16
|
178 { \
|
Chris@16
|
179 return access::adt_attribute_access< \
|
Chris@16
|
180 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
Chris@16
|
181 , I \
|
Chris@16
|
182 >::boost_fusion_adapt_adt_impl_get(*obj); \
|
Chris@16
|
183 } \
|
Chris@16
|
184 \
|
Chris@101
|
185 BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
186 operator type() const \
|
Chris@16
|
187 { \
|
Chris@16
|
188 return get(); \
|
Chris@16
|
189 } \
|
Chris@16
|
190 \
|
Chris@16
|
191 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) const* obj; \
|
Chris@16
|
192 }; \
|
Chris@16
|
193 \
|
Chris@16
|
194 template< \
|
Chris@16
|
195 BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
|
Chris@16
|
196 > \
|
Chris@16
|
197 struct adt_attribute_proxy< \
|
Chris@16
|
198 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
Chris@16
|
199 , I \
|
Chris@16
|
200 , false \
|
Chris@16
|
201 > \
|
Chris@16
|
202 { \
|
Chris@101
|
203 typedef \
|
Chris@101
|
204 BOOST_PP_IF(BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ), typename, ) \
|
Chris@101
|
205 access::adt_attribute_access< \
|
Chris@101
|
206 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
Chris@101
|
207 , I \
|
Chris@101
|
208 >::type type; \
|
Chris@16
|
209 \
|
Chris@101
|
210 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
211 explicit \
|
Chris@16
|
212 adt_attribute_proxy( \
|
Chris@16
|
213 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)& o) \
|
Chris@16
|
214 : obj(&o) \
|
Chris@16
|
215 {} \
|
Chris@16
|
216 \
|
Chris@16
|
217 template<class Val> \
|
Chris@101
|
218 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
219 adt_attribute_proxy& \
|
Chris@16
|
220 operator=(Val const& val) \
|
Chris@16
|
221 { \
|
Chris@16
|
222 access::adt_attribute_access< \
|
Chris@16
|
223 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
Chris@16
|
224 , I \
|
Chris@16
|
225 >::boost_fusion_adapt_adt_impl_set(*obj, val); \
|
Chris@16
|
226 return *this; \
|
Chris@16
|
227 } \
|
Chris@16
|
228 \
|
Chris@101
|
229 BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
230 type get() const \
|
Chris@16
|
231 { \
|
Chris@16
|
232 return access::adt_attribute_access< \
|
Chris@16
|
233 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
Chris@16
|
234 , I \
|
Chris@16
|
235 >::boost_fusion_adapt_adt_impl_get(*obj); \
|
Chris@16
|
236 } \
|
Chris@16
|
237 \
|
Chris@101
|
238 BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
239 operator type() const \
|
Chris@16
|
240 { \
|
Chris@16
|
241 return get(); \
|
Chris@16
|
242 } \
|
Chris@16
|
243 \
|
Chris@16
|
244 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ)* obj; \
|
Chris@16
|
245 }; \
|
Chris@16
|
246 \
|
Chris@16
|
247 template< \
|
Chris@16
|
248 BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS(TEMPLATE_PARAMS_SEQ) \
|
Chris@16
|
249 > \
|
Chris@16
|
250 struct access::struct_member< \
|
Chris@16
|
251 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
Chris@16
|
252 , I \
|
Chris@16
|
253 > \
|
Chris@16
|
254 { \
|
Chris@101
|
255 typedef BOOST_PP_IF(BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ), typename, ) \
|
Chris@101
|
256 adt_attribute_proxy< \
|
Chris@101
|
257 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
Chris@101
|
258 , I \
|
Chris@101
|
259 , false \
|
Chris@101
|
260 >::type lvalue; \
|
Chris@101
|
261 \
|
Chris@16
|
262 BOOST_FUSION_ADAPT_STRUCT_MSVC_REDEFINE_TEMPLATE_PARAMS( \
|
Chris@16
|
263 TEMPLATE_PARAMS_SEQ) \
|
Chris@16
|
264 \
|
Chris@16
|
265 typedef \
|
Chris@16
|
266 BOOST_PP_IF( \
|
Chris@16
|
267 BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ), \
|
Chris@16
|
268 BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_TEMPLATE_IMPL, \
|
Chris@16
|
269 BOOST_FUSION_ADAPT_ADT_GET_IDENTITY_NON_TEMPLATE_IMPL)( \
|
Chris@16
|
270 TEMPLATE_PARAMS_SEQ) \
|
Chris@16
|
271 type; \
|
Chris@16
|
272 \
|
Chris@16
|
273 template<typename Seq> \
|
Chris@16
|
274 struct apply \
|
Chris@16
|
275 { \
|
Chris@16
|
276 typedef \
|
Chris@16
|
277 adt_attribute_proxy< \
|
Chris@16
|
278 BOOST_FUSION_ADAPT_STRUCT_UNPACK_NAME(NAME_SEQ) \
|
Chris@16
|
279 , I \
|
Chris@16
|
280 , is_const<Seq>::value \
|
Chris@16
|
281 > \
|
Chris@16
|
282 type; \
|
Chris@16
|
283 \
|
Chris@101
|
284 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
285 static type \
|
Chris@16
|
286 call(Seq& obj) \
|
Chris@16
|
287 { \
|
Chris@16
|
288 return type(obj); \
|
Chris@16
|
289 } \
|
Chris@16
|
290 }; \
|
Chris@16
|
291 };
|
Chris@16
|
292
|
Chris@16
|
293 #endif
|