Chris@16
|
1 /*=============================================================================
|
Chris@16
|
2 Copyright (c) 2010-2011 Christopher Schmidt
|
Chris@16
|
3
|
Chris@16
|
4 Distributed under the Boost Software License, Version 1.0. (See accompanying
|
Chris@16
|
5 file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
Chris@16
|
6 ==============================================================================*/
|
Chris@16
|
7
|
Chris@16
|
8 #ifndef BOOST_FUSION_ADAPTED_DETAIL_STRUCT_DEFINE_STRUCT_HPP
|
Chris@16
|
9 #define BOOST_FUSION_ADAPTED_DETAIL_STRUCT_DEFINE_STRUCT_HPP
|
Chris@16
|
10
|
Chris@101
|
11 #include <boost/fusion/support/config.hpp>
|
Chris@16
|
12 #include <boost/config.hpp>
|
Chris@16
|
13 #include <boost/fusion/sequence/intrinsic/begin.hpp>
|
Chris@16
|
14 #include <boost/fusion/iterator/deref.hpp>
|
Chris@16
|
15 #include <boost/fusion/iterator/next.hpp>
|
Chris@16
|
16 #include <boost/fusion/iterator/advance.hpp>
|
Chris@16
|
17 #include <boost/fusion/adapted/struct/detail/adapt_base.hpp>
|
Chris@16
|
18 #include <boost/fusion/adapted/struct/detail/namespace.hpp>
|
Chris@16
|
19 #include <boost/preprocessor/inc.hpp>
|
Chris@16
|
20 #include <boost/preprocessor/if.hpp>
|
Chris@16
|
21 #include <boost/preprocessor/expr_if.hpp>
|
Chris@16
|
22 #include <boost/preprocessor/dec.hpp>
|
Chris@16
|
23 #include <boost/preprocessor/logical/not.hpp>
|
Chris@16
|
24 #include <boost/preprocessor/punctuation/comma_if.hpp>
|
Chris@16
|
25 #include <boost/preprocessor/comparison/equal.hpp>
|
Chris@16
|
26 #include <boost/preprocessor/seq/seq.hpp>
|
Chris@16
|
27 #include <boost/preprocessor/seq/for_each.hpp>
|
Chris@16
|
28 #include <boost/preprocessor/seq/for_each_i.hpp>
|
Chris@16
|
29 #include <boost/preprocessor/seq/enum.hpp>
|
Chris@16
|
30 #include <boost/preprocessor/seq/size.hpp>
|
Chris@16
|
31 #include <boost/preprocessor/tuple/elem.hpp>
|
Chris@16
|
32 #include <boost/preprocessor/tuple/eat.hpp>
|
Chris@16
|
33 #include <boost/call_traits.hpp>
|
Chris@16
|
34 #include <boost/type_traits/is_convertible.hpp>
|
Chris@16
|
35 #include <boost/utility/enable_if.hpp>
|
Chris@16
|
36
|
Chris@101
|
37 #define BOOST_FUSION_DEFINE_STRUCT_FILLER_0(X, Y) \
|
Chris@101
|
38 ((X, Y)) BOOST_FUSION_DEFINE_STRUCT_FILLER_1
|
Chris@101
|
39 #define BOOST_FUSION_DEFINE_STRUCT_FILLER_1(X, Y) \
|
Chris@101
|
40 ((X, Y)) BOOST_FUSION_DEFINE_STRUCT_FILLER_0
|
Chris@101
|
41 #define BOOST_FUSION_DEFINE_STRUCT_FILLER_0_END
|
Chris@101
|
42 #define BOOST_FUSION_DEFINE_STRUCT_FILLER_1_END
|
Chris@101
|
43
|
Chris@16
|
44 #define BOOST_FUSION_DEFINE_STRUCT_COPY_CTOR_FILLER_I( \
|
Chris@16
|
45 R, ATTRIBUTE_TUPEL_SIZE, I, ATTRIBUTE) \
|
Chris@16
|
46 \
|
Chris@16
|
47 BOOST_PP_COMMA_IF(I) \
|
Chris@16
|
48 BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)( \
|
Chris@16
|
49 other_self.BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE))
|
Chris@16
|
50
|
Chris@16
|
51 #define BOOST_FUSION_DEFINE_STRUCT_ASSIGN_FILLER_I( \
|
Chris@16
|
52 R, ATTRIBUTE_TUPEL_SIZE, I_, ATTRIBUTE) \
|
Chris@16
|
53 \
|
Chris@16
|
54 BOOST_PP_EXPR_IF( \
|
Chris@16
|
55 I_, \
|
Chris@16
|
56 typedef typename \
|
Chris@16
|
57 boost::fusion::result_of::next< \
|
Chris@16
|
58 BOOST_PP_CAT(I,BOOST_PP_DEC(I_)) \
|
Chris@16
|
59 >::type \
|
Chris@16
|
60 BOOST_PP_CAT(I,I_); \
|
Chris@16
|
61 BOOST_PP_CAT(I,I_) BOOST_PP_CAT(i,I_)= \
|
Chris@16
|
62 boost::fusion::next(BOOST_PP_CAT(i,BOOST_PP_DEC(I_))); \
|
Chris@16
|
63 ) \
|
Chris@16
|
64 \
|
Chris@16
|
65 BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)= \
|
Chris@16
|
66 boost::fusion::deref(BOOST_PP_CAT(i,I_));
|
Chris@16
|
67
|
Chris@16
|
68 #define BOOST_FUSION_DEFINE_STRUCT_ASSIGN_OP( \
|
Chris@16
|
69 ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
70 \
|
Chris@16
|
71 template<typename Seq> \
|
Chris@101
|
72 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
73 self_type& \
|
Chris@16
|
74 operator=(Seq const& seq) \
|
Chris@16
|
75 { \
|
Chris@16
|
76 typedef typename \
|
Chris@16
|
77 boost::fusion::result_of::begin<Seq const>::type \
|
Chris@16
|
78 I0; \
|
Chris@16
|
79 I0 i0=boost::fusion::begin(seq); \
|
Chris@16
|
80 \
|
Chris@16
|
81 BOOST_PP_SEQ_FOR_EACH_I_R( \
|
Chris@16
|
82 1, \
|
Chris@16
|
83 BOOST_FUSION_DEFINE_STRUCT_ASSIGN_FILLER_I, \
|
Chris@16
|
84 ATTRIBUTE_TUPEL_SIZE, \
|
Chris@16
|
85 ATTRIBUTES_SEQ) \
|
Chris@16
|
86 \
|
Chris@16
|
87 return *this; \
|
Chris@16
|
88 }
|
Chris@16
|
89
|
Chris@16
|
90 #define BOOST_FUSION_DEFINE_STRUCT_ATTR_I(R, ATTRIBUTE_TUPEL_SIZE, ATTRIBUTE) \
|
Chris@16
|
91 \
|
Chris@16
|
92 BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,0,ATTRIBUTE) \
|
Chris@16
|
93 BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE);
|
Chris@16
|
94
|
Chris@16
|
95 #define BOOST_FUSION_DEFINE_STRUCT_SEQ_CTOR_FILLER_I( \
|
Chris@16
|
96 R, ATTRIBUTE_TUPEL_SIZE, I, ATTRIBUTE) \
|
Chris@16
|
97 \
|
Chris@16
|
98 BOOST_PP_COMMA_IF(I) \
|
Chris@16
|
99 BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)( \
|
Chris@16
|
100 boost::fusion::deref(boost::fusion::advance_c<I>(boost::fusion::begin( \
|
Chris@16
|
101 seq))))
|
Chris@16
|
102
|
Chris@16
|
103 #define BOOST_FUSION_DEFINE_STRUCT_SEQ_CTOR_DISABLER( \
|
Chris@16
|
104 ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
105 \
|
Chris@16
|
106 , typename boost::disable_if< \
|
Chris@16
|
107 boost::is_convertible< \
|
Chris@16
|
108 Seq const& \
|
Chris@16
|
109 , BOOST_PP_TUPLE_ELEM( \
|
Chris@16
|
110 ATTRIBUTE_TUPEL_SIZE, \
|
Chris@16
|
111 0, \
|
Chris@16
|
112 BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ)) \
|
Chris@16
|
113 > \
|
Chris@16
|
114 >::type* =0
|
Chris@16
|
115
|
Chris@16
|
116 #define BOOST_FUSION_DEFINE_STRUCT_SEQ_DEFAULT_CTOR_FILLER_I( \
|
Chris@16
|
117 R, ATTRIBUTE_TUPEL_SIZE, I, ATTRIBUTE) \
|
Chris@16
|
118 \
|
Chris@16
|
119 BOOST_PP_COMMA_IF(I) \
|
Chris@16
|
120 BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)()
|
Chris@16
|
121
|
Chris@16
|
122 #define BOOST_FUSION_DEFINE_STRUCT_IMPL_IMPL( \
|
Chris@16
|
123 NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
124 \
|
Chris@16
|
125 BOOST_PP_SEQ_FOR_EACH_R( \
|
Chris@16
|
126 1, \
|
Chris@16
|
127 BOOST_FUSION_DEFINE_STRUCT_ATTR_I, \
|
Chris@16
|
128 ATTRIBUTE_TUPEL_SIZE, \
|
Chris@16
|
129 ATTRIBUTES_SEQ) \
|
Chris@16
|
130 \
|
Chris@101
|
131 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
132 NAME() \
|
Chris@16
|
133 : BOOST_PP_SEQ_FOR_EACH_I_R( \
|
Chris@16
|
134 1, \
|
Chris@16
|
135 BOOST_FUSION_DEFINE_STRUCT_SEQ_DEFAULT_CTOR_FILLER_I, \
|
Chris@16
|
136 ATTRIBUTE_TUPEL_SIZE, \
|
Chris@16
|
137 ATTRIBUTES_SEQ) \
|
Chris@16
|
138 {} \
|
Chris@16
|
139 \
|
Chris@101
|
140 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
141 NAME(self_type const& other_self) \
|
Chris@16
|
142 : BOOST_PP_SEQ_FOR_EACH_I_R( \
|
Chris@16
|
143 1, \
|
Chris@16
|
144 BOOST_FUSION_DEFINE_STRUCT_COPY_CTOR_FILLER_I, \
|
Chris@16
|
145 ATTRIBUTE_TUPEL_SIZE, \
|
Chris@16
|
146 ATTRIBUTES_SEQ) \
|
Chris@16
|
147 {} \
|
Chris@16
|
148 \
|
Chris@16
|
149 template<typename Seq> \
|
Chris@101
|
150 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
151 NAME(Seq const& seq \
|
Chris@16
|
152 BOOST_PP_IF( \
|
Chris@16
|
153 BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \
|
Chris@16
|
154 BOOST_PP_TUPLE_EAT(2), \
|
Chris@16
|
155 BOOST_FUSION_DEFINE_STRUCT_SEQ_CTOR_DISABLER)( \
|
Chris@16
|
156 ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
157 ) \
|
Chris@16
|
158 : BOOST_PP_SEQ_FOR_EACH_I_R( \
|
Chris@16
|
159 1, \
|
Chris@16
|
160 BOOST_FUSION_DEFINE_STRUCT_SEQ_CTOR_FILLER_I, \
|
Chris@16
|
161 ATTRIBUTE_TUPEL_SIZE, \
|
Chris@16
|
162 ATTRIBUTES_SEQ) \
|
Chris@16
|
163 {} \
|
Chris@16
|
164 \
|
Chris@16
|
165 BOOST_FUSION_DEFINE_STRUCT_ASSIGN_OP(ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE)
|
Chris@16
|
166
|
Chris@16
|
167 #define BOOST_FUSION_DEFINE_STRUCT_CTOR_1( \
|
Chris@16
|
168 NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
169 \
|
Chris@101
|
170 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
171 explicit \
|
Chris@16
|
172 NAME(boost::call_traits< \
|
Chris@16
|
173 BOOST_PP_TUPLE_ELEM( \
|
Chris@16
|
174 ATTRIBUTE_TUPEL_SIZE,0,BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ)) \
|
Chris@16
|
175 >::param_type arg) \
|
Chris@16
|
176 : BOOST_PP_TUPLE_ELEM( \
|
Chris@16
|
177 ATTRIBUTE_TUPEL_SIZE,1,BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ))(arg) \
|
Chris@16
|
178 {}
|
Chris@16
|
179
|
Chris@16
|
180 #define BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_1( \
|
Chris@16
|
181 TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
182 \
|
Chris@101
|
183 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
184 explicit \
|
Chris@16
|
185 NAME(typename boost::call_traits< \
|
Chris@16
|
186 typename boost::fusion::detail::get_first_arg< \
|
Chris@16
|
187 BOOST_PP_TUPLE_ELEM( \
|
Chris@16
|
188 ATTRIBUTE_TUPEL_SIZE, \
|
Chris@16
|
189 0, \
|
Chris@16
|
190 BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ)) \
|
Chris@16
|
191 , BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ) \
|
Chris@16
|
192 >::type \
|
Chris@16
|
193 >::param_type arg) \
|
Chris@16
|
194 : BOOST_PP_TUPLE_ELEM( \
|
Chris@16
|
195 ATTRIBUTE_TUPEL_SIZE,1,BOOST_PP_SEQ_HEAD(ATTRIBUTES_SEQ))(arg) \
|
Chris@16
|
196 {}
|
Chris@16
|
197
|
Chris@16
|
198 #define BOOST_FUSION_DEFINE_STRUCT_CTOR_FILLER_I( \
|
Chris@16
|
199 R, ATTRIBUTE_TUPEL_SIZE, I, ATTRIBUTE) \
|
Chris@16
|
200 \
|
Chris@16
|
201 BOOST_PP_COMMA_IF(I) \
|
Chris@16
|
202 BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,1,ATTRIBUTE)(BOOST_PP_CAT(_,I))
|
Chris@16
|
203
|
Chris@16
|
204 #define BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_ARG_I(R, DATA, I, ATTRIBUTE) \
|
Chris@16
|
205 \
|
Chris@16
|
206 BOOST_PP_COMMA_IF(I) \
|
Chris@16
|
207 typename boost::call_traits< \
|
Chris@16
|
208 typename boost::fusion::detail::get_first_arg< \
|
Chris@16
|
209 BOOST_PP_TUPLE_ELEM( \
|
Chris@16
|
210 BOOST_PP_TUPLE_ELEM(3,0,DATA), \
|
Chris@16
|
211 0, \
|
Chris@16
|
212 ATTRIBUTE) \
|
Chris@16
|
213 , BOOST_PP_TUPLE_ELEM(3,2,DATA) \
|
Chris@16
|
214 >::type \
|
Chris@16
|
215 >::param_type BOOST_PP_CAT(_,I)
|
Chris@16
|
216
|
Chris@16
|
217 #define BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_N( \
|
Chris@16
|
218 TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
219 \
|
Chris@101
|
220 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
221 NAME(BOOST_PP_SEQ_FOR_EACH_I_R( \
|
Chris@16
|
222 1, \
|
Chris@16
|
223 BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_ARG_I, \
|
Chris@16
|
224 ( \
|
Chris@16
|
225 ATTRIBUTE_TUPEL_SIZE, \
|
Chris@16
|
226 BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ), \
|
Chris@16
|
227 BOOST_PP_SEQ_HEAD(TEMPLATE_PARAMS_SEQ) \
|
Chris@16
|
228 ), \
|
Chris@16
|
229 ATTRIBUTES_SEQ)) \
|
Chris@16
|
230 : BOOST_PP_SEQ_FOR_EACH_I_R( \
|
Chris@16
|
231 1, \
|
Chris@16
|
232 BOOST_FUSION_DEFINE_STRUCT_CTOR_FILLER_I, \
|
Chris@16
|
233 ATTRIBUTE_TUPEL_SIZE, \
|
Chris@16
|
234 ATTRIBUTES_SEQ) \
|
Chris@16
|
235 {}
|
Chris@16
|
236
|
Chris@16
|
237 #define BOOST_FUSION_DEFINE_STRUCT_CTOR_ARG_I( \
|
Chris@16
|
238 R, ATTRIBUTE_TUPEL_SIZE, I, ATTRIBUTE) \
|
Chris@16
|
239 \
|
Chris@16
|
240 BOOST_PP_COMMA_IF(I) \
|
Chris@16
|
241 boost::call_traits< \
|
Chris@16
|
242 BOOST_PP_TUPLE_ELEM(ATTRIBUTE_TUPEL_SIZE,0,ATTRIBUTE) \
|
Chris@16
|
243 >::param_type BOOST_PP_CAT(_,I)
|
Chris@16
|
244
|
Chris@16
|
245 #define BOOST_FUSION_DEFINE_STRUCT_CTOR_N( \
|
Chris@16
|
246 NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
247 \
|
Chris@101
|
248 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
249 NAME(BOOST_PP_SEQ_FOR_EACH_I_R( \
|
Chris@16
|
250 1, \
|
Chris@16
|
251 BOOST_FUSION_DEFINE_STRUCT_CTOR_ARG_I, \
|
Chris@16
|
252 ATTRIBUTE_TUPEL_SIZE, \
|
Chris@16
|
253 ATTRIBUTES_SEQ)) \
|
Chris@16
|
254 : BOOST_PP_SEQ_FOR_EACH_I_R( \
|
Chris@16
|
255 1, \
|
Chris@16
|
256 BOOST_FUSION_DEFINE_STRUCT_CTOR_FILLER_I, \
|
Chris@16
|
257 ATTRIBUTE_TUPEL_SIZE, \
|
Chris@16
|
258 ATTRIBUTES_SEQ) \
|
Chris@16
|
259 {}
|
Chris@16
|
260
|
Chris@16
|
261 #define BOOST_FUSION_DEFINE_STRUCT_CTOR( \
|
Chris@16
|
262 NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
263 \
|
Chris@16
|
264 BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \
|
Chris@16
|
265 BOOST_FUSION_DEFINE_STRUCT_CTOR_N, \
|
Chris@16
|
266 BOOST_FUSION_DEFINE_STRUCT_CTOR_1)( \
|
Chris@16
|
267 NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE)
|
Chris@16
|
268
|
Chris@16
|
269 #define BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR( \
|
Chris@16
|
270 TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
271 \
|
Chris@16
|
272 BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \
|
Chris@16
|
273 BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_N, \
|
Chris@16
|
274 BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR_1)( \
|
Chris@16
|
275 TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE)
|
Chris@16
|
276
|
Chris@16
|
277 #define BOOST_FUSION_DEFINE_NONEMPTY_STRUCT_IMPL( \
|
Chris@16
|
278 NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
279 \
|
Chris@16
|
280 BOOST_FUSION_DEFINE_STRUCT_IMPL_IMPL( \
|
Chris@16
|
281 NAME, BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ), ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
282 \
|
Chris@16
|
283 BOOST_FUSION_DEFINE_STRUCT_CTOR( \
|
Chris@16
|
284 NAME, BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ), ATTRIBUTE_TUPEL_SIZE)
|
Chris@16
|
285
|
Chris@16
|
286 #define BOOST_FUSION_DEFINE_EMPTY_STRUCT_IMPL( \
|
Chris@16
|
287 NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
288 \
|
Chris@16
|
289 template<typename Seq> \
|
Chris@101
|
290 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
291 NAME(Seq const&) \
|
Chris@16
|
292 {} \
|
Chris@16
|
293 \
|
Chris@16
|
294 template<typename Seq> \
|
Chris@101
|
295 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED \
|
Chris@16
|
296 self_type& \
|
Chris@16
|
297 operator=(Seq const& seq) \
|
Chris@16
|
298 { \
|
Chris@16
|
299 return *this; \
|
Chris@16
|
300 }
|
Chris@16
|
301
|
Chris@16
|
302 #define BOOST_FUSION_DEFINE_STRUCT_IMPL( \
|
Chris@16
|
303 NAMESPACE_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
304 \
|
Chris@16
|
305 BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DEFINITION_BEGIN(NAMESPACE_SEQ) \
|
Chris@16
|
306 \
|
Chris@16
|
307 struct NAME \
|
Chris@16
|
308 { \
|
Chris@16
|
309 typedef NAME self_type; \
|
Chris@16
|
310 \
|
Chris@16
|
311 BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \
|
Chris@16
|
312 BOOST_FUSION_DEFINE_NONEMPTY_STRUCT_IMPL, \
|
Chris@16
|
313 BOOST_FUSION_DEFINE_EMPTY_STRUCT_IMPL)( \
|
Chris@16
|
314 NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
315 }; \
|
Chris@16
|
316 \
|
Chris@16
|
317 BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DEFINITION_END(NAMESPACE_SEQ)
|
Chris@16
|
318
|
Chris@16
|
319 #define BOOST_FUSION_DEFINE_NONEMPTY_TPL_STRUCT_IMPL( \
|
Chris@16
|
320 TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
321 \
|
Chris@16
|
322 BOOST_FUSION_DEFINE_STRUCT_IMPL_IMPL( \
|
Chris@16
|
323 NAME, BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ), ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
324 \
|
Chris@16
|
325 BOOST_FUSION_DEFINE_TPL_STRUCT_CTOR( \
|
Chris@16
|
326 TEMPLATE_PARAMS_SEQ, \
|
Chris@16
|
327 NAME, \
|
Chris@16
|
328 BOOST_PP_SEQ_TAIL(ATTRIBUTES_SEQ), \
|
Chris@16
|
329 ATTRIBUTE_TUPEL_SIZE)
|
Chris@16
|
330
|
Chris@16
|
331 #define BOOST_FUSION_DEFINE_EMPTY_TPL_STRUCT_IMPL( \
|
Chris@16
|
332 TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
333 \
|
Chris@16
|
334 BOOST_FUSION_DEFINE_EMPTY_STRUCT_IMPL( \
|
Chris@16
|
335 NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE)
|
Chris@16
|
336
|
Chris@16
|
337 #define BOOST_FUSION_DEFINE_TPL_STRUCT_IMPL( \
|
Chris@16
|
338 TEMPLATE_PARAMS_SEQ, \
|
Chris@16
|
339 NAMESPACE_SEQ, \
|
Chris@16
|
340 NAME, \
|
Chris@16
|
341 ATTRIBUTES_SEQ, \
|
Chris@16
|
342 ATTRIBUTE_TUPEL_SIZE) \
|
Chris@16
|
343 \
|
Chris@16
|
344 BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DEFINITION_BEGIN(NAMESPACE_SEQ) \
|
Chris@16
|
345 \
|
Chris@16
|
346 template< \
|
Chris@16
|
347 BOOST_FUSION_ADAPT_STRUCT_UNPACK_TEMPLATE_PARAMS_IMPL( \
|
Chris@16
|
348 (0)TEMPLATE_PARAMS_SEQ) \
|
Chris@16
|
349 > \
|
Chris@16
|
350 struct NAME \
|
Chris@16
|
351 { \
|
Chris@16
|
352 typedef NAME self_type; \
|
Chris@16
|
353 \
|
Chris@16
|
354 BOOST_PP_IF(BOOST_PP_DEC(BOOST_PP_SEQ_SIZE(ATTRIBUTES_SEQ)), \
|
Chris@16
|
355 BOOST_FUSION_DEFINE_NONEMPTY_TPL_STRUCT_IMPL, \
|
Chris@16
|
356 BOOST_FUSION_DEFINE_EMPTY_TPL_STRUCT_IMPL)( \
|
Chris@16
|
357 TEMPLATE_PARAMS_SEQ, NAME, ATTRIBUTES_SEQ, ATTRIBUTE_TUPEL_SIZE)\
|
Chris@16
|
358 }; \
|
Chris@16
|
359 \
|
Chris@16
|
360 BOOST_FUSION_ADAPT_STRUCT_NAMESPACE_DEFINITION_END(NAMESPACE_SEQ)
|
Chris@16
|
361
|
Chris@16
|
362 namespace boost { namespace fusion { namespace detail
|
Chris@16
|
363 {
|
Chris@16
|
364 template<typename A1, typename A2>
|
Chris@16
|
365 struct get_first_arg
|
Chris@16
|
366 {
|
Chris@16
|
367 typedef A1 type;
|
Chris@16
|
368 };
|
Chris@16
|
369 }}}
|
Chris@16
|
370
|
Chris@16
|
371 #endif
|