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).
7 #if !defined(BOOST_VMD_DETAIL_MODS_HPP)
8 #define BOOST_VMD_DETAIL_MODS_HPP
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>
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
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
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
52 #define BOOST_VMD_DETAIL_MODS_STATE_INPUT(state) \
53 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_INPUT,state) \
56 #define BOOST_VMD_DETAIL_MODS_STATE_INDEX(state) \
57 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_INDEX,state) \
60 #define BOOST_VMD_DETAIL_MODS_STATE_SIZE(state) \
61 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_SIZE,state) \
64 #define BOOST_VMD_DETAIL_MODS_STATE_RESULT(state) \
65 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_RESULT,state) \
68 #define BOOST_VMD_DETAIL_MODS_STATE_ALLOW(state) \
69 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_DATA_ALLOW,state) \
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)) \
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)) \
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)) \
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)) \
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)) \
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)) \
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)) \
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)) \
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)) \
108 #define BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE(result) \
109 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_RETURN,result) \
112 #define BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER(result) \
113 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_AFTER,result) \
116 #define BOOST_VMD_DETAIL_MODS_IS_RESULT_ONLY_AFTER(result) \
117 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER,result) \
120 #define BOOST_VMD_DETAIL_MODS_IS_RESULT_INDEX(result) \
121 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_INDEX,result) \
124 #define BOOST_VMD_DETAIL_MODS_RESULT_OTHER(result) \
125 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_OTHER,result) \
128 #define BOOST_VMD_DETAIL_MODS_RESULT_TYPE(result) \
129 BOOST_PP_TUPLE_ELEM(BOOST_VMD_DETAIL_MODS_TUPLE_TYPE,result) \
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))
136 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_RETURN_TYPE(d,state,number) \
137 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
140 BOOST_PP_TUPLE_REPLACE_D \
144 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
145 BOOST_PP_TUPLE_REPLACE_D \
148 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
149 BOOST_VMD_DETAIL_MODS_TUPLE_RETURN, \
156 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER(d,state,id) \
157 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
160 BOOST_PP_TUPLE_REPLACE_D \
164 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
165 BOOST_PP_TUPLE_REPLACE_D \
168 BOOST_PP_TUPLE_REPLACE_D \
171 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
172 BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER, \
175 BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \
182 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_INDEX(d,state,number) \
183 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
186 BOOST_PP_TUPLE_REPLACE_D \
190 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
191 BOOST_PP_TUPLE_REPLACE_D \
194 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
195 BOOST_VMD_DETAIL_MODS_TUPLE_INDEX, \
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) \
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) \
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) \
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) \
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) \
222 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT(d,state,id) \
223 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
226 BOOST_PP_TUPLE_REPLACE_D \
230 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
231 BOOST_PP_TUPLE_REPLACE_D \
234 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
235 BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \
236 BOOST_VMD_DETAIL_MODS_RETURN_AFTER \
242 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT(d,state,id) \
243 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
246 BOOST_PP_TUPLE_REPLACE_D \
250 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
251 BOOST_PP_TUPLE_REPLACE_D \
254 BOOST_PP_TUPLE_REPLACE_D \
257 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
258 BOOST_VMD_DETAIL_MODS_TUPLE_ONLY_AFTER, \
261 BOOST_VMD_DETAIL_MODS_TUPLE_AFTER, \
262 BOOST_VMD_DETAIL_MODS_NO_AFTER \
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) \
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) \
276 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_REPLACE(d,state,id) \
277 BOOST_PP_TUPLE_REPLACE_D \
280 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
281 BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \
282 BOOST_PP_VARIADIC_TO_TUPLE(id) \
286 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_ADD(d,state,id) \
287 BOOST_PP_TUPLE_REPLACE_D \
290 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
291 BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \
292 BOOST_PP_TUPLE_PUSH_BACK \
294 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)), \
300 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE(d,state,id) \
305 BOOST_VMD_DETAIL_MODS_RESULT_OTHER(BOOST_VMD_DETAIL_MODS_STATE_RESULT(state)) \
307 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_REPLACE, \
308 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE_ADD \
313 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE_RETURN(d,state,id) \
314 BOOST_PP_TUPLE_REPLACE_D \
317 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
318 BOOST_VMD_DETAIL_MODS_TUPLE_RETURN, \
321 BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,id,BOOST_VMD_TYPE_ARRAY), \
322 BOOST_VMD_DETAIL_MODS_RETURN_ARRAY, \
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 \
333 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE(d,state,id) \
334 BOOST_PP_TUPLE_REPLACE_D \
337 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE_RETURN(d,state,id), \
338 BOOST_VMD_DETAIL_MODS_TUPLE_TYPE, \
343 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN(d,state,id) \
344 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
347 BOOST_PP_TUPLE_REPLACE_D \
351 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
356 BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state), \
357 BOOST_VMD_IS_TYPE_D(d,id) \
359 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_TYPE, \
360 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UNKNOWN_CTUPLE \
367 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE(d,state) \
368 BOOST_PP_TUPLE_REPLACE_D \
372 BOOST_VMD_DETAIL_MODS_DATA_INDEX, \
373 BOOST_PP_INC(BOOST_VMD_DETAIL_MODS_STATE_INDEX(state)) \
377 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_ALL(d,state,id) \
380 BOOST_VMD_DETAIL_IS_RETURN_TYPE_TUPLE(id), \
381 BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT, \
384 BOOST_VMD_DETAIL_IS_RETURN_TYPE(id), \
385 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET, \
388 BOOST_VMD_DETAIL_IS_RETURN_TYPE_ARRAY(id), \
389 BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA, \
392 BOOST_VMD_DETAIL_IS_RETURN_TYPE_LIST(id), \
393 BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL, \
396 BOOST_VMD_DETAIL_IS_RETURN_NO_TYPE(id), \
397 BOOST_VMD_DETAIL_MODS_OP_CURRENT_NT, \
400 BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \
401 BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \
404 BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \
405 BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \
408 BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \
409 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \
412 BOOST_VMD_DETAIL_IS_RETURN_INDEX(id), \
413 BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND, \
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 \
432 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_RETURN(d,state,id) \
435 BOOST_VMD_DETAIL_IS_RETURN_TYPE_TUPLE(id), \
436 BOOST_VMD_DETAIL_MODS_OP_CURRENT_GTT, \
439 BOOST_VMD_DETAIL_IS_RETURN_TYPE(id), \
440 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ET, \
443 BOOST_VMD_DETAIL_IS_RETURN_TYPE_ARRAY(id), \
444 BOOST_VMD_DETAIL_MODS_OP_CURRENT_SA, \
447 BOOST_VMD_DETAIL_IS_RETURN_TYPE_LIST(id), \
448 BOOST_VMD_DETAIL_MODS_OP_CURRENT_SL, \
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 \
462 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_AFTER(d,state,id) \
465 BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \
466 BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \
469 BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \
470 BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \
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 \
482 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_INDEX(d,state,id) \
485 BOOST_VMD_DETAIL_IS_RETURN_AFTER(id), \
486 BOOST_VMD_DETAIL_MODS_OP_CURRENT_AFT, \
489 BOOST_VMD_DETAIL_IS_RETURN_NO_AFTER(id), \
490 BOOST_VMD_DETAIL_MODS_OP_CURRENT_NOAFT, \
493 BOOST_VMD_DETAIL_IS_RETURN_ONLY_AFTER(id), \
494 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ONLY_AFTER, \
497 BOOST_VMD_DETAIL_IS_RETURN_INDEX(id), \
498 BOOST_VMD_DETAIL_MODS_OP_CURRENT_IND, \
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 \
512 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_UPDATE(d,state,id) \
513 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE(d,state) \
516 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_ID(d,state,id) \
519 BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_ALL(state), \
520 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_ALL, \
523 BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_RETURN(state), \
524 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_RETURN, \
527 BOOST_VMD_DETAIL_MODS_STATE_IS_ALLOW_AFTER(state), \
528 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ALLOW_AFTER, \
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 \
541 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT_TUPLE(d,state,id) \
542 BOOST_VMD_DETAIL_MODS_OP_CURRENT_UPDATE \
545 BOOST_PP_TUPLE_REPLACE_D \
549 BOOST_VMD_DETAIL_MODS_DATA_RESULT, \
550 BOOST_PP_TUPLE_REPLACE_D \
553 BOOST_VMD_DETAIL_MODS_STATE_RESULT(state), \
554 BOOST_VMD_DETAIL_MODS_TUPLE_OTHER, \
561 #define BOOST_VMD_DETAIL_MODS_OP_CURRENT(d,state,id) \
564 BOOST_PP_IS_BEGIN_PARENS(id), \
565 BOOST_VMD_DETAIL_MODS_OP_CURRENT_TUPLE, \
566 BOOST_VMD_DETAIL_MODS_OP_CURRENT_ID \
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)) \
575 #define BOOST_VMD_DETAIL_MODS_LOOP(allow,tuple) \
576 BOOST_PP_TUPLE_ELEM \
581 BOOST_VMD_DETAIL_MODS_PRED, \
582 BOOST_VMD_DETAIL_MODS_OP, \
586 BOOST_PP_TUPLE_SIZE(tuple), \
594 #define BOOST_VMD_DETAIL_MODS_LOOP_D(d,allow,tuple) \
595 BOOST_PP_TUPLE_ELEM \
598 BOOST_PP_WHILE_ ## d \
600 BOOST_VMD_DETAIL_MODS_PRED, \
601 BOOST_VMD_DETAIL_MODS_OP, \
605 BOOST_PP_TUPLE_SIZE(tuple), \
613 #define BOOST_VMD_DETAIL_NEW_MODS_VAR(allow,tuple) \
614 BOOST_VMD_DETAIL_MODS_LOOP \
617 BOOST_PP_TUPLE_POP_FRONT(tuple) \
621 #define BOOST_VMD_DETAIL_NEW_MODS_VAR_D(d,allow,tuple) \
622 BOOST_VMD_DETAIL_MODS_LOOP_D \
626 BOOST_PP_TUPLE_POP_FRONT(tuple) \
630 #define BOOST_VMD_DETAIL_NEW_MODS_IR(allow,tuple) \
631 BOOST_VMD_IDENTITY_RESULT \
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 \
643 #define BOOST_VMD_DETAIL_NEW_MODS_IR_D(d,allow,tuple) \
644 BOOST_VMD_IDENTITY_RESULT \
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 \
658 Returns a six-element tuple:
660 First tuple element = 0 No type return
662 2 General tuple type return
666 Second tuple element = 0 No after return
669 Third tuple element = 0 No identifier index
672 Fourth tuple element = Tuple of other identifiers
674 Fifth tuple element = 0 No after only return
677 Sixth tuple element = Type identifier
679 Input = allow, either
681 BOOST_VMD_ALLOW_RETURN
682 BOOST_VMD_ALLOW_AFTER
683 BOOST_VMD_ALLOW_INDEX
685 ..., modifiers, first variadic is discarded
686 Possible modifiers are:
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)
694 BOOST_VMD_RETURN_NO_AFTER = (0,0)
695 BOOST_VMD_RETURN_AFTER = (0,1)
699 #define BOOST_VMD_DETAIL_NEW_MODS(allow,...) \
700 BOOST_VMD_DETAIL_NEW_MODS_IR(allow,BOOST_PP_VARIADIC_TO_TUPLE(__VA_ARGS__)) \
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__)) \
707 #endif /* BOOST_VMD_DETAIL_MODS_HPP */