]>
Commit | Line | Data |
---|---|---|
1 | ||
2 | // (C) Copyright Edward Diener 2011-2015 | |
3 | // Use, modification and distribution are subject to the Boost Software License, | |
4 | // Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at | |
5 | // http://www.boost.org/LICENSE_1_0.txt). | |
6 | ||
7 | #if !defined(BOOST_VMD_DETAIL_MODS_HPP) | |
8 | #define BOOST_VMD_DETAIL_MODS_HPP | |
9 | ||
10 | #include <boost/preprocessor/arithmetic/inc.hpp> | |
11 | #include <boost/preprocessor/comparison/equal.hpp> | |
12 | #include <boost/preprocessor/comparison/greater.hpp> | |
13 | #include <boost/preprocessor/control/iif.hpp> | |
14 | #include <boost/preprocessor/control/while.hpp> | |
15 | #include <boost/preprocessor/punctuation/is_begin_parens.hpp> | |
16 | #include <boost/preprocessor/tuple/elem.hpp> | |
17 | #include <boost/preprocessor/tuple/pop_front.hpp> | |
18 | #include <boost/preprocessor/tuple/push_back.hpp> | |
19 | #include <boost/preprocessor/tuple/replace.hpp> | |
20 | #include <boost/preprocessor/tuple/size.hpp> | |
21 | #include <boost/preprocessor/variadic/to_tuple.hpp> | |
22 | #include <boost/vmd/identity.hpp> | |
23 | #include <boost/vmd/is_empty.hpp> | |
24 | #include <boost/vmd/is_type.hpp> | |
25 | #include <boost/vmd/detail/modifiers.hpp> | |
26 | ||
27 | #define BOOST_VMD_DETAIL_MODS_NO_RETURN 0 | |
28 | #define BOOST_VMD_DETAIL_MODS_RETURN 1 | |
29 | #define BOOST_VMD_DETAIL_MODS_RETURN_TUPLE 2 | |
30 | #define BOOST_VMD_DETAIL_MODS_RETURN_ARRAY 3 | |
31 | #define BOOST_VMD_DETAIL_MODS_RETURN_LIST 4 | |
32 | #define BOOST_VMD_DETAIL_MODS_NO_AFTER 0 | |
33 | #define BOOST_VMD_DETAIL_MODS_RETURN_AFTER 1 | |
34 | #define BOOST_VMD_DETAIL_MODS_NO_INDEX 0 | |
35 | #define BOOST_VMD_DETAIL_MODS_RETURN_INDEX 1 | |
36 | #define BOOST_VMD_DETAIL_MODS_NO_ONLY_AFTER 0 | |
37 | #define BOOST_VMD_DETAIL_MODS_RETURN_ONLY_AFTER 1 | |
38 | ||
39 | #define BOOST_VMD_DETAIL_MODS_TUPLE_RETURN 0 | |
40 | #define BOOST_VMD_DETAIL_MODS_TUPLE_AFTER 1 | |
41 | #define BOOST_VMD_DETAIL_MODS_TUPLE_INDEX 2 | |
42 | #define BOOST_VMD_DETAIL_MODS_TUPLE_OTHER 3 | |
43 | #define BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER 4 | |
44 | #define BOOST_VMD_DETAIL_MODS_TUPLE_TYPE 5 | |
45 | ||
46 | #define BOOST_VMD_DETAIL_MODS_DATA_INPUT 0 | |
47 | #define BOOST_VMD_DETAIL_MODS_DATA_INDEX 1 | |
48 | #define BOOST_VMD_DETAIL_MODS_DATA_SIZE 2 | |
49 | #define BOOST_VMD_DETAIL_MODS_DATA_RESULT 3 | |
50 | #define BOOST_VMD_DETAIL_MODS_DATA_ALLOW 4 | |
51 | ||
52 | #define BOOST_VMD_DETAIL_MODS_STATE_INPUT(state) \ | |
53 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_INPUT,state) \ | |
54 | /**/ | |
55 | ||
56 | #define BOOST_VMD_DETAIL_MODS_STATE_INDEX(state) \ | |
57 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_INDEX,state) \ | |
58 | /**/ | |
59 | ||
60 | #define BOOST_VMD_DETAIL_MODS_STATE_SIZE(state) \ | |
61 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_SIZE,state) \ | |
62 | /**/ | |
63 | ||
64 | #define BOOST_VMD_DETAIL_MODS_STATE_RESULT(state) \ | |
65 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_RESULT,state) \ | |
66 | /**/ | |
67 | ||
68 | #define BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state) \ | |
69 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_ALLOW,state) \ | |
70 | /**/ | |
71 | ||
72 | #define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state) \ | |
73 | BOOST_VMD_DETAIL_IS_ALLOW_ALL(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \ | |
74 | /**/ | |
75 | ||
76 | #define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_RETURN(state) \ | |
77 | BOOST_VMD_DETAIL_IS_ALLOW_RETURN(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \ | |
78 | /**/ | |
79 | ||
80 | #define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_AFTER(state) \ | |
81 | BOOST_VMD_DETAIL_IS_ALLOW_AFTER(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \ | |
82 | /**/ | |
83 | ||
84 | #define BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_INDEX(state) \ | |
85 | BOOST_VMD_DETAIL_IS_ALLOW_INDEX(BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state)) \ | |
86 | /**/ | |
87 | ||
88 | #define BOOST_VMD_DETAIL_MODS_STATE_CURRENT(state) \ | |
89 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_STATE_INDEX(state),BOOST_VMD_DETAIL_MODS_STATE_INPUT(state)) \ | |
90 | /**/ | |
91 | ||
92 | #define BOOST_VMD_DETAIL_MODS_STATE_TYPE(state) \ | |
93 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_RETURN,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \ | |
94 | /**/ | |
95 | ||
96 | #define BOOST_VMD_DETAIL_MODS_STATE_AFTER(state) \ | |
97 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_AFTER,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \ | |
98 | /**/ | |
99 | ||
100 | #define BOOST_VMD_DETAIL_MODS_STATE_ONLY_AFTER(state) \ | |
101 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \ | |
102 | /**/ | |
103 | ||
104 | #define BOOST_VMD_DETAIL_MODS_STATE_TINDEX(state) \ | |
105 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_INDEX,BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \ | |
106 | /**/ | |
107 | ||
108 | #define BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE(result) \ | |
109 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_RETURN,result) \ | |
110 | /**/ | |
111 | ||
112 | #define BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(result) \ | |
113 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_AFTER,result) \ | |
114 | /**/ | |
115 | ||
116 | #define BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(result) \ | |
117 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER,result) \ | |
118 | /**/ | |
119 | ||
120 | #define BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(result) \ | |
121 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_INDEX,result) \ | |
122 | /**/ | |
123 | ||
124 | #define BOOST_VMD_DETAIL_MODS_RESULT_OTHER(result) \ | |
125 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_OTHER,result) \ | |
126 | /**/ | |
127 | ||
128 | #define BOOST_VMD_DETAIL_MODS_RESULT_TYPE(result) \ | |
129 | BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_TYPE,result) \ | |
130 | /**/ | |
131 | ||
132 | #define BOOST_VMD_DETAIL_MODS_PRED(d,state) \ | |
133 | BOOST_PP_GREATER_D(d,BOOST_VMD_DETAIL_MODS_STATE_SIZE(state),BOOST_VMD_DETAIL_MODS_STATE_INDEX(state)) | |
134 | /**/ | |
135 | ||
136 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,number) \ | |
137 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \ | |
138 | ( \ | |
139 | d, \ | |
140 | BOOST_PP_TUPLE_REPLACE_D \ | |
141 | ( \ | |
142 | d, \ | |
143 | state, \ | |
144 | BOOST_VMD_DETAIL_MODS_DATA_RESULT, \ | |
145 | BOOST_PP_TUPLE_REPLACE_D \ | |
146 | ( \ | |
147 | d, \ | |
148 | BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \ | |
149 | BOOST_VMD_DETAIL_MODS_TUPLE_RETURN, \ | |
150 | number \ | |
151 | ) \ | |
152 | ) \ | |
153 | ) \ | |
154 | /**/ | |
155 | ||
156 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER(d,state,id) \ | |
157 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \ | |
158 | ( \ | |
159 | d, \ | |
160 | BOOST_PP_TUPLE_REPLACE_D \ | |
161 | ( \ | |
162 | d, \ | |
163 | state, \ | |
164 | BOOST_VMD_DETAIL_MODS_DATA_RESULT, \ | |
165 | BOOST_PP_TUPLE_REPLACE_D \ | |
166 | ( \ | |
167 | d, \ | |
168 | BOOST_PP_TUPLE_REPLACE_D \ | |
169 | ( \ | |
170 | d, \ | |
171 | BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \ | |
172 | BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER, \ | |
173 | 1 \ | |
174 | ), \ | |
175 | BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \ | |
176 | 1 \ | |
177 | ) \ | |
178 | ) \ | |
179 | ) \ | |
180 | /**/ | |
181 | ||
182 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,number) \ | |
183 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \ | |
184 | ( \ | |
185 | d, \ | |
186 | BOOST_PP_TUPLE_REPLACE_D \ | |
187 | ( \ | |
188 | d, \ | |
189 | state, \ | |
190 | BOOST_VMD_DETAIL_MODS_DATA_RESULT, \ | |
191 | BOOST_PP_TUPLE_REPLACE_D \ | |
192 | ( \ | |
193 | d, \ | |
194 | BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \ | |
195 | BOOST_VMD_DETAIL_MODS_TUPLE_INDEX, \ | |
196 | number \ | |
197 | ) \ | |
198 | ) \ | |
199 | ) \ | |
200 | /**/ | |
201 | ||
202 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT(d,state,id) \ | |
203 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE) \ | |
204 | /**/ | |
205 | ||
206 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET(d,state,id) \ | |
207 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN) \ | |
208 | /**/ | |
209 | ||
210 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA(d,state,id) \ | |
211 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY) \ | |
212 | /**/ | |
213 | ||
214 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL(d,state,id) \ | |
215 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_RETURN_LIST) \ | |
216 | /**/ | |
217 | ||
218 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT(d,state,id) \ | |
219 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,BOOST_VMD_DETAIL_MODS_NO_RETURN) \ | |
220 | /**/ | |
221 | ||
222 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT(d,state,id) \ | |
223 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \ | |
224 | ( \ | |
225 | d, \ | |
226 | BOOST_PP_TUPLE_REPLACE_D \ | |
227 | ( \ | |
228 | d, \ | |
229 | state, \ | |
230 | BOOST_VMD_DETAIL_MODS_DATA_RESULT, \ | |
231 | BOOST_PP_TUPLE_REPLACE_D \ | |
232 | ( \ | |
233 | d, \ | |
234 | BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \ | |
235 | BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \ | |
236 | BOOST_VMD_DETAIL_MODS_RETURN_AFTER \ | |
237 | ) \ | |
238 | ) \ | |
239 | ) \ | |
240 | /**/ | |
241 | ||
242 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT(d,state,id) \ | |
243 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \ | |
244 | ( \ | |
245 | d, \ | |
246 | BOOST_PP_TUPLE_REPLACE_D \ | |
247 | ( \ | |
248 | d, \ | |
249 | state, \ | |
250 | BOOST_VMD_DETAIL_MODS_DATA_RESULT, \ | |
251 | BOOST_PP_TUPLE_REPLACE_D \ | |
252 | ( \ | |
253 | d, \ | |
254 | BOOST_PP_TUPLE_REPLACE_D \ | |
255 | ( \ | |
256 | d, \ | |
257 | BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \ | |
258 | BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER, \ | |
259 | 0 \ | |
260 | ), \ | |
261 | BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \ | |
262 | BOOST_VMD_DETAIL_MODS_NO_AFTER \ | |
263 | ) \ | |
264 | ) \ | |
265 | ) \ | |
266 | /**/ | |
267 | ||
268 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND(d,state,id) \ | |
269 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,BOOST_VMD_DETAIL_MODS_RETURN_INDEX) \ | |
270 | /**/ | |
271 | ||
272 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NO_IND(d,state,id) \ | |
273 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,BOOST_VMD_DETAIL_MODS_NO_INDEX) \ | |
274 | /**/ | |
275 | ||
276 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_REPLACE(d,state,id) \ | |
277 | BOOST_PP_TUPLE_REPLACE_D \ | |
278 | ( \ | |
279 | d, \ | |
280 | BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \ | |
281 | BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \ | |
282 | BOOST_PP_VARIADIC_TO_TUPLE(id) \ | |
283 | ) \ | |
284 | /**/ | |
285 | ||
286 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_ADD(d,state,id) \ | |
287 | BOOST_PP_TUPLE_REPLACE_D \ | |
288 | ( \ | |
289 | d, \ | |
290 | BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \ | |
291 | BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \ | |
292 | BOOST_PP_TUPLE_PUSH_BACK \ | |
293 | ( \ | |
294 | BOOST_VMD_DETAIL_MODS_RESULT_OTHER(BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)), \ | |
295 | id \ | |
296 | ) \ | |
297 | ) \ | |
298 | /**/ | |
299 | ||
300 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE(d,state,id) \ | |
301 | BOOST_PP_IIF \ | |
302 | ( \ | |
303 | BOOST_VMD_IS_EMPTY \ | |
304 | ( \ | |
305 | BOOST_VMD_DETAIL_MODS_RESULT_OTHER(BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \ | |
306 | ), \ | |
307 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_REPLACE, \ | |
308 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_ADD \ | |
309 | ) \ | |
310 | (d,state,id) \ | |
311 | /**/ | |
312 | ||
313 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE_RETURN(d,state,id) \ | |
314 | BOOST_PP_TUPLE_REPLACE_D \ | |
315 | ( \ | |
316 | d, \ | |
317 | BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \ | |
318 | BOOST_VMD_DETAIL_MODS_TUPLE_RETURN, \ | |
319 | BOOST_PP_IIF \ | |
320 | ( \ | |
321 | BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,id,BOOST_VMD_TYPE_ARRAY), \ | |
322 | BOOST_VMD_DETAIL_MODS_RETURN_ARRAY, \ | |
323 | BOOST_PP_IIF \ | |
324 | ( \ | |
325 | BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,id,BOOST_VMD_TYPE_LIST), \ | |
326 | BOOST_VMD_DETAIL_MODS_RETURN_LIST, \ | |
327 | BOOST_VMD_DETAIL_MODS_RETURN_TUPLE \ | |
328 | ) \ | |
329 | ) \ | |
330 | ) \ | |
331 | /**/ | |
332 | ||
333 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE(d,state,id) \ | |
334 | BOOST_PP_TUPLE_REPLACE_D \ | |
335 | ( \ | |
336 | d, \ | |
337 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE_RETURN(d,state,id), \ | |
338 | BOOST_VMD_DETAIL_MODS_TUPLE_TYPE, \ | |
339 | id \ | |
340 | ) \ | |
341 | /**/ | |
342 | ||
343 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN(d,state,id) \ | |
344 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \ | |
345 | ( \ | |
346 | d, \ | |
347 | BOOST_PP_TUPLE_REPLACE_D \ | |
348 | ( \ | |
349 | d, \ | |
350 | state, \ | |
351 | BOOST_VMD_DETAIL_MODS_DATA_RESULT, \ | |
352 | BOOST_PP_IIF \ | |
353 | ( \ | |
354 | BOOST_PP_BITAND \ | |
355 | ( \ | |
356 | BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state), \ | |
357 | BOOST_VMD_IS_TYPE_D(d,id) \ | |
358 | ), \ | |
359 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE, \ | |
360 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE \ | |
361 | ) \ | |
362 | (d,state,id) \ | |
363 | ) \ | |
364 | ) \ | |
365 | /**/ | |
366 | ||
367 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE(d,state) \ | |
368 | BOOST_PP_TUPLE_REPLACE_D \ | |
369 | ( \ | |
370 | d, \ | |
371 | state, \ | |
372 | BOOST_VMD_DETAIL_MODS_DATA_INDEX, \ | |
373 | BOOST_PP_INC(BOOST_VMD_DETAIL_MODS_STATE_INDEX(state)) \ | |
374 | ) \ | |
375 | /**/ | |
376 | ||
377 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_ALL(d,state,id) \ | |
378 | BOOST_PP_IIF \ | |
379 | ( \ | |
380 | BOOST_VMD_DETAIL_IS_RETURN_TYPE_TUPLE(id), \ | |
381 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT, \ | |
382 | BOOST_PP_IIF \ | |
383 | ( \ | |
384 | BOOST_VMD_DETAIL_IS_RETURN_TYPE(id), \ | |
385 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET, \ | |
386 | BOOST_PP_IIF \ | |
387 | ( \ | |
388 | BOOST_VMD_DETAIL_IS_RETURN_TYPE_ARRAY(id), \ | |
389 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA, \ | |
390 | BOOST_PP_IIF \ | |
391 | ( \ | |
392 | BOOST_VMD_DETAIL_IS_RETURN_TYPE_LIST(id), \ | |
393 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL, \ | |
394 | BOOST_PP_IIF \ | |
395 | ( \ | |
396 | BOOST_VMD_DETAIL_IS_RETURN_NO_TYPE(id), \ | |
397 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT, \ | |
398 | BOOST_PP_IIF \ | |
399 | ( \ | |
400 | BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \ | |
401 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \ | |
402 | BOOST_PP_IIF \ | |
403 | ( \ | |
404 | BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \ | |
405 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \ | |
406 | BOOST_PP_IIF \ | |
407 | ( \ | |
408 | BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \ | |
409 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \ | |
410 | BOOST_PP_IIF \ | |
411 | ( \ | |
412 | BOOST_VMD_DETAIL_IS_RETURN_INDEX(id), \ | |
413 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND, \ | |
414 | BOOST_PP_IIF \ | |
415 | ( \ | |
416 | BOOST_VMD_DETAIL_IS_RETURN_NO_INDEX(id), \ | |
417 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_NO_IND, \ | |
418 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \ | |
419 | ) \ | |
420 | ) \ | |
421 | ) \ | |
422 | ) \ | |
423 | ) \ | |
424 | ) \ | |
425 | ) \ | |
426 | ) \ | |
427 | ) \ | |
428 | ) \ | |
429 | (d,state,id) \ | |
430 | /**/ | |
431 | ||
432 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_RETURN(d,state,id) \ | |
433 | BOOST_PP_IIF \ | |
434 | ( \ | |
435 | BOOST_VMD_DETAIL_IS_RETURN_TYPE_TUPLE(id), \ | |
436 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT, \ | |
437 | BOOST_PP_IIF \ | |
438 | ( \ | |
439 | BOOST_VMD_DETAIL_IS_RETURN_TYPE(id), \ | |
440 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET, \ | |
441 | BOOST_PP_IIF \ | |
442 | ( \ | |
443 | BOOST_VMD_DETAIL_IS_RETURN_TYPE_ARRAY(id), \ | |
444 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA, \ | |
445 | BOOST_PP_IIF \ | |
446 | ( \ | |
447 | BOOST_VMD_DETAIL_IS_RETURN_TYPE_LIST(id), \ | |
448 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL, \ | |
449 | BOOST_PP_IIF \ | |
450 | ( \ | |
451 | BOOST_VMD_DETAIL_IS_RETURN_NO_TYPE(id), \ | |
452 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT, \ | |
453 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \ | |
454 | ) \ | |
455 | ) \ | |
456 | ) \ | |
457 | ) \ | |
458 | ) \ | |
459 | (d,state,id) \ | |
460 | /**/ | |
461 | ||
462 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_AFTER(d,state,id) \ | |
463 | BOOST_PP_IIF \ | |
464 | ( \ | |
465 | BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \ | |
466 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \ | |
467 | BOOST_PP_IIF \ | |
468 | ( \ | |
469 | BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \ | |
470 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \ | |
471 | BOOST_PP_IIF \ | |
472 | ( \ | |
473 | BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \ | |
474 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \ | |
475 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \ | |
476 | ) \ | |
477 | ) \ | |
478 | ) \ | |
479 | (d,state,id) \ | |
480 | /**/ | |
481 | ||
482 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_INDEX(d,state,id) \ | |
483 | BOOST_PP_IIF \ | |
484 | ( \ | |
485 | BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \ | |
486 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \ | |
487 | BOOST_PP_IIF \ | |
488 | ( \ | |
489 | BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \ | |
490 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \ | |
491 | BOOST_PP_IIF \ | |
492 | ( \ | |
493 | BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \ | |
494 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \ | |
495 | BOOST_PP_IIF \ | |
496 | ( \ | |
497 | BOOST_VMD_DETAIL_IS_RETURN_INDEX(id), \ | |
498 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND, \ | |
499 | BOOST_PP_IIF \ | |
500 | ( \ | |
501 | BOOST_VMD_DETAIL_IS_RETURN_NO_INDEX(id), \ | |
502 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_NO_IND, \ | |
503 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN \ | |
504 | ) \ | |
505 | ) \ | |
506 | ) \ | |
507 | ) \ | |
508 | ) \ | |
509 | (d,state,id) \ | |
510 | /**/ | |
511 | ||
512 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_UPDATE(d,state,id) \ | |
513 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE(d,state) \ | |
514 | /**/ | |
515 | ||
516 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ID(d,state,id) \ | |
517 | BOOST_PP_IIF \ | |
518 | ( \ | |
519 | BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state), \ | |
520 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_ALL, \ | |
521 | BOOST_PP_IIF \ | |
522 | ( \ | |
523 | BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_RETURN(state), \ | |
524 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_RETURN, \ | |
525 | BOOST_PP_IIF \ | |
526 | ( \ | |
527 | BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_AFTER(state), \ | |
528 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_AFTER, \ | |
529 | BOOST_PP_IIF \ | |
530 | ( \ | |
531 | BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_INDEX(state), \ | |
532 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_INDEX, \ | |
533 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_UPDATE \ | |
534 | ) \ | |
535 | ) \ | |
536 | ) \ | |
537 | ) \ | |
538 | (d,state,id) \ | |
539 | /**/ | |
540 | ||
541 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_TUPLE(d,state,id) \ | |
542 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \ | |
543 | ( \ | |
544 | d, \ | |
545 | BOOST_PP_TUPLE_REPLACE_D \ | |
546 | ( \ | |
547 | d, \ | |
548 | state, \ | |
549 | BOOST_VMD_DETAIL_MODS_DATA_RESULT, \ | |
550 | BOOST_PP_TUPLE_REPLACE_D \ | |
551 | ( \ | |
552 | d, \ | |
553 | BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \ | |
554 | BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \ | |
555 | id \ | |
556 | ) \ | |
557 | ) \ | |
558 | ) \ | |
559 | /**/ | |
560 | ||
561 | #define BOOST_VMD_DETAIL_MODS_OP_CURRENT(d,state,id) \ | |
562 | BOOST_PP_IIF \ | |
563 | ( \ | |
564 | BOOST_PP_IS_BEGIN_PARENS(id), \ | |
565 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_TUPLE, \ | |
566 | BOOST_VMD_DETAIL_MODS_OP_CURRENT_ID \ | |
567 | ) \ | |
568 | (d,state,id) \ | |
569 | /**/ | |
570 | ||
571 | #define BOOST_VMD_DETAIL_MODS_OP(d,state) \ | |
572 | BOOST_VMD_DETAIL_MODS_OP_CURRENT(d,state,BOOST_VMD_DETAIL_MODS_STATE_CURRENT(state)) \ | |
573 | /**/ | |
574 | ||
575 | #define BOOST_VMD_DETAIL_MODS_LOOP(allow,tuple) \ | |
576 | BOOST_PP_TUPLE_ELEM \ | |
577 | ( \ | |
578 | 3, \ | |
579 | BOOST_PP_WHILE \ | |
580 | ( \ | |
581 | BOOST_VMD_DETAIL_MODS_PRED, \ | |
582 | BOOST_VMD_DETAIL_MODS_OP, \ | |
583 | ( \ | |
584 | tuple, \ | |
585 | 0, \ | |
586 | BOOST_PP_TUPLE_SIZE(tuple), \ | |
587 | (0,0,0,,0,), \ | |
588 | allow \ | |
589 | ) \ | |
590 | ) \ | |
591 | ) \ | |
592 | /**/ | |
593 | ||
594 | #define BOOST_VMD_DETAIL_MODS_LOOP_D(d,allow,tuple) \ | |
595 | BOOST_PP_TUPLE_ELEM \ | |
596 | ( \ | |
597 | 3, \ | |
598 | BOOST_PP_WHILE_ ## d \ | |
599 | ( \ | |
600 | BOOST_VMD_DETAIL_MODS_PRED, \ | |
601 | BOOST_VMD_DETAIL_MODS_OP, \ | |
602 | ( \ | |
603 | tuple, \ | |
604 | 0, \ | |
605 | BOOST_PP_TUPLE_SIZE(tuple), \ | |
606 | (0,0,0,,0,), \ | |
607 | allow \ | |
608 | ) \ | |
609 | ) \ | |
610 | ) \ | |
611 | /**/ | |
612 | ||
613 | #define BOOST_VMD_DETAIL_NEW_MODS_VAR(allow,tuple) \ | |
614 | BOOST_VMD_DETAIL_MODS_LOOP \ | |
615 | ( \ | |
616 | allow, \ | |
617 | BOOST_PP_TUPLE_POP_FRONT(tuple) \ | |
618 | ) \ | |
619 | /**/ | |
620 | ||
621 | #define BOOST_VMD_DETAIL_NEW_MODS_VAR_D(d,allow,tuple) \ | |
622 | BOOST_VMD_DETAIL_MODS_LOOP_D \ | |
623 | ( \ | |
624 | d, \ | |
625 | allow, \ | |
626 | BOOST_PP_TUPLE_POP_FRONT(tuple) \ | |
627 | ) \ | |
628 | /**/ | |
629 | ||
630 | #define BOOST_VMD_DETAIL_NEW_MODS_IR(allow,tuple) \ | |
631 | BOOST_VMD_IDENTITY_RESULT \ | |
632 | ( \ | |
633 | BOOST_PP_IIF \ | |
634 | ( \ | |
635 | BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(tuple),1), \ | |
636 | BOOST_VMD_IDENTITY((0,0,0,,0,)), \ | |
637 | BOOST_VMD_DETAIL_NEW_MODS_VAR \ | |
638 | ) \ | |
639 | (allow,tuple) \ | |
640 | ) \ | |
641 | /**/ | |
642 | ||
643 | #define BOOST_VMD_DETAIL_NEW_MODS_IR_D(d,allow,tuple) \ | |
644 | BOOST_VMD_IDENTITY_RESULT \ | |
645 | ( \ | |
646 | BOOST_PP_IIF \ | |
647 | ( \ | |
648 | BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_SIZE(tuple),1), \ | |
649 | BOOST_VMD_IDENTITY((0,0,0,,0,)), \ | |
650 | BOOST_VMD_DETAIL_NEW_MODS_VAR_D \ | |
651 | ) \ | |
652 | (d,allow,tuple) \ | |
653 | ) \ | |
654 | /**/ | |
655 | ||
656 | /* | |
657 | ||
658 | Returns a six-element tuple: | |
659 | ||
660 | First tuple element = 0 No type return | |
661 | 1 Exact type return | |
662 | 2 General tuple type return | |
663 | 3 Array return | |
664 | 4 List return | |
665 | ||
666 | Second tuple element = 0 No after return | |
667 | 1 After return | |
668 | ||
669 | Third tuple element = 0 No identifier index | |
670 | 1 Identifier Index | |
671 | ||
672 | Fourth tuple element = Tuple of other identifiers | |
673 | ||
674 | Fifth tuple element = 0 No after only return | |
675 | 1 After only return | |
676 | ||
677 | Sixth tuple element = Type identifier | |
678 | ||
679 | Input = allow, either | |
680 | BOOST_VMD_ALLOW_ALL | |
681 | BOOST_VMD_ALLOW_RETURN | |
682 | BOOST_VMD_ALLOW_AFTER | |
683 | BOOST_VMD_ALLOW_INDEX | |
684 | ||
685 | ..., modifiers, first variadic is discarded | |
686 | Possible modifiers are: | |
687 | ||
688 | BOOST_VMD_RETURN_NO_TYPE = (0,0) | |
689 | BOOST_VMD_RETURN_TYPE = (1,0) | |
690 | BOOST_VMD_RETURN_TYPE_TUPLE = (2,0) | |
691 | BOOST_VMD_RETURN_TYPE_ARRAY = (3,0) | |
692 | BOOST_VMD_RETURN_TYPE_LIST = (4,0) | |
693 | ||
694 | BOOST_VMD_RETURN_NO_AFTER = (0,0) | |
695 | BOOST_VMD_RETURN_AFTER = (0,1) | |
696 | ||
697 | */ | |
698 | ||
699 | #define BOOST_VMD_DETAIL_NEW_MODS(allow,...) \ | |
700 | BOOST_VMD_DETAIL_NEW_MODS_IR(allow,BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__)) \ | |
701 | /**/ | |
702 | ||
703 | #define BOOST_VMD_DETAIL_NEW_MODS_D(d,allow,...) \ | |
704 | BOOST_VMD_DETAIL_NEW_MODS_IR_D(d,allow,BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__)) \ | |
705 | /**/ | |
706 | ||
707 | #endif /* BOOST_VMD_DETAIL_MODS_HPP */ |