]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
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_SEQUENCE_TYPE_HPP) | |
8 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_HPP | |
9 | ||
10 | #include <boost/preprocessor/comparison/equal.hpp> | |
11 | #include <boost/preprocessor/control/iif.hpp> | |
12 | #include <boost/preprocessor/tuple/elem.hpp> | |
13 | #include <boost/preprocessor/variadic/elem.hpp> | |
14 | #include <boost/preprocessor/variadic/size.hpp> | |
15 | #include <boost/vmd/identity.hpp> | |
16 | #include <boost/vmd/is_empty.hpp> | |
17 | #include <boost/vmd/detail/equal_type.hpp> | |
18 | #include <boost/vmd/detail/is_array_common.hpp> | |
19 | #include <boost/vmd/detail/is_list.hpp> | |
20 | #include <boost/vmd/detail/modifiers.hpp> | |
21 | #include <boost/vmd/detail/mods.hpp> | |
22 | #include <boost/vmd/detail/sequence_elem.hpp> | |
23 | ||
24 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY(dtuple) \ | |
25 | BOOST_PP_IIF \ | |
26 | ( \ | |
27 | BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(BOOST_PP_TUPLE_ELEM(1,dtuple)), \ | |
28 | BOOST_VMD_TYPE_ARRAY, \ | |
29 | BOOST_VMD_TYPE_TUPLE \ | |
30 | ) \ | |
31 | /**/ | |
32 | ||
33 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY_D(d,dtuple) \ | |
34 | BOOST_PP_IIF \ | |
35 | ( \ | |
36 | BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,BOOST_PP_TUPLE_ELEM(1,dtuple)), \ | |
37 | BOOST_VMD_TYPE_ARRAY, \ | |
38 | BOOST_VMD_TYPE_TUPLE \ | |
39 | ) \ | |
40 | /**/ | |
41 | ||
42 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST(dtuple) \ | |
43 | BOOST_PP_IIF \ | |
44 | ( \ | |
45 | BOOST_VMD_DETAIL_IS_LIST(BOOST_PP_TUPLE_ELEM(1,dtuple)), \ | |
46 | BOOST_VMD_TYPE_LIST, \ | |
47 | BOOST_VMD_TYPE_TUPLE \ | |
48 | ) \ | |
49 | /**/ | |
50 | ||
51 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST_D(d,dtuple) \ | |
52 | BOOST_PP_IIF \ | |
53 | ( \ | |
54 | BOOST_VMD_DETAIL_IS_LIST_D(d,BOOST_PP_TUPLE_ELEM(1,dtuple)), \ | |
55 | BOOST_VMD_TYPE_LIST, \ | |
56 | BOOST_VMD_TYPE_TUPLE \ | |
57 | ) \ | |
58 | /**/ | |
59 | ||
60 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH(dtuple) \ | |
61 | BOOST_VMD_IDENTITY_RESULT \ | |
62 | ( \ | |
63 | BOOST_PP_IIF \ | |
64 | ( \ | |
65 | BOOST_VMD_DETAIL_EQUAL_TYPE \ | |
66 | ( \ | |
67 | BOOST_VMD_TYPE_TUPLE, \ | |
68 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST(dtuple) \ | |
69 | ), \ | |
70 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY, \ | |
71 | BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST) \ | |
72 | ) \ | |
73 | (dtuple) \ | |
74 | ) \ | |
75 | /**/ | |
76 | ||
77 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH_D(d,dtuple) \ | |
78 | BOOST_VMD_IDENTITY_RESULT \ | |
79 | ( \ | |
80 | BOOST_PP_IIF \ | |
81 | ( \ | |
82 | BOOST_VMD_DETAIL_EQUAL_TYPE_D \ | |
83 | ( \ | |
84 | d, \ | |
85 | BOOST_VMD_TYPE_TUPLE, \ | |
86 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST_D(d,dtuple) \ | |
87 | ), \ | |
88 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY_D, \ | |
89 | BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST) \ | |
90 | ) \ | |
91 | (d,dtuple) \ | |
92 | ) \ | |
93 | /**/ | |
94 | ||
95 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS(dtuple,rtype) \ | |
96 | BOOST_VMD_IDENTITY_RESULT \ | |
97 | ( \ | |
98 | BOOST_PP_IIF \ | |
99 | ( \ | |
100 | BOOST_PP_EQUAL(rtype,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY), \ | |
101 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY, \ | |
102 | BOOST_PP_IIF \ | |
103 | ( \ | |
104 | BOOST_PP_EQUAL(rtype,BOOST_VMD_DETAIL_MODS_RETURN_LIST), \ | |
105 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST, \ | |
106 | BOOST_PP_IIF \ | |
107 | ( \ | |
108 | BOOST_PP_EQUAL(rtype,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE), \ | |
109 | BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)), \ | |
110 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH \ | |
111 | ) \ | |
112 | ) \ | |
113 | ) \ | |
114 | ) \ | |
115 | (dtuple) \ | |
116 | /**/ | |
117 | ||
118 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS_D(d,dtuple,rtype) \ | |
119 | BOOST_VMD_IDENTITY_RESULT \ | |
120 | ( \ | |
121 | BOOST_PP_IIF \ | |
122 | ( \ | |
123 | BOOST_PP_EQUAL_D(d,rtype,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY), \ | |
124 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY_D, \ | |
125 | BOOST_PP_IIF \ | |
126 | ( \ | |
127 | BOOST_PP_EQUAL_D(d,rtype,BOOST_VMD_DETAIL_MODS_RETURN_LIST), \ | |
128 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST_D, \ | |
129 | BOOST_PP_IIF \ | |
130 | ( \ | |
131 | BOOST_PP_EQUAL_D(d,rtype,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE), \ | |
132 | BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)), \ | |
133 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH_D \ | |
134 | ) \ | |
135 | ) \ | |
136 | ) \ | |
137 | ) \ | |
138 | (d,dtuple) \ | |
139 | /**/ | |
140 | ||
141 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE(dtuple,...) \ | |
142 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS \ | |
143 | ( \ | |
144 | dtuple, \ | |
145 | BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE \ | |
146 | ( \ | |
147 | BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_ALL,__VA_ARGS__) \ | |
148 | ) \ | |
149 | ) \ | |
150 | /**/ | |
151 | ||
152 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE_D(d,dtuple,...) \ | |
153 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS_D \ | |
154 | ( \ | |
155 | d, \ | |
156 | dtuple, \ | |
157 | BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE \ | |
158 | ( \ | |
159 | BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_ALL,__VA_ARGS__) \ | |
160 | ) \ | |
161 | ) \ | |
162 | /**/ | |
163 | ||
164 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY(dtuple,...) \ | |
165 | BOOST_VMD_IDENTITY_RESULT \ | |
166 | ( \ | |
167 | BOOST_PP_IIF \ | |
168 | ( \ | |
169 | BOOST_VMD_DETAIL_EQUAL_TYPE(BOOST_VMD_TYPE_TUPLE,BOOST_PP_TUPLE_ELEM(0,dtuple)), \ | |
170 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE, \ | |
171 | BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)) \ | |
172 | ) \ | |
173 | (dtuple,__VA_ARGS__) \ | |
174 | ) \ | |
175 | /**/ | |
176 | ||
177 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY_D(d,dtuple,...) \ | |
178 | BOOST_VMD_IDENTITY_RESULT \ | |
179 | ( \ | |
180 | BOOST_PP_IIF \ | |
181 | ( \ | |
182 | BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,BOOST_VMD_TYPE_TUPLE,BOOST_PP_TUPLE_ELEM(0,dtuple)), \ | |
183 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE_D, \ | |
184 | BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)) \ | |
185 | ) \ | |
186 | (d,dtuple,__VA_ARGS__) \ | |
187 | ) \ | |
188 | /**/ | |
189 | ||
190 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE(tuple,...) \ | |
191 | BOOST_VMD_IDENTITY_RESULT \ | |
192 | ( \ | |
193 | BOOST_PP_IIF \ | |
194 | ( \ | |
195 | BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)), \ | |
196 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY, \ | |
197 | BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_SEQUENCE) \ | |
198 | ) \ | |
199 | (BOOST_PP_TUPLE_ELEM(0,tuple),__VA_ARGS__) \ | |
200 | ) \ | |
201 | /**/ | |
202 | ||
203 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE_D(d,tuple,...) \ | |
204 | BOOST_VMD_IDENTITY_RESULT \ | |
205 | ( \ | |
206 | BOOST_PP_IIF \ | |
207 | ( \ | |
208 | BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)), \ | |
209 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY_D, \ | |
210 | BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_SEQUENCE) \ | |
211 | ) \ | |
212 | (d,BOOST_PP_TUPLE_ELEM(0,tuple),__VA_ARGS__) \ | |
213 | ) \ | |
214 | /**/ | |
215 | ||
216 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE(tuple,...) \ | |
217 | BOOST_VMD_IDENTITY_RESULT \ | |
218 | ( \ | |
219 | BOOST_PP_IIF \ | |
220 | ( \ | |
221 | BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \ | |
222 | BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_EMPTY), \ | |
223 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE \ | |
224 | ) \ | |
225 | (tuple,__VA_ARGS__) \ | |
226 | ) \ | |
227 | /**/ | |
228 | ||
229 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_D(d,tuple,...) \ | |
230 | BOOST_VMD_IDENTITY_RESULT \ | |
231 | ( \ | |
232 | BOOST_PP_IIF \ | |
233 | ( \ | |
234 | BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \ | |
235 | BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_EMPTY), \ | |
236 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE_D \ | |
237 | ) \ | |
238 | (d,tuple,__VA_ARGS__) \ | |
239 | ) \ | |
240 | /**/ | |
241 | ||
242 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE(...) \ | |
243 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE \ | |
244 | ( \ | |
245 | BOOST_VMD_DETAIL_SEQUENCE_ELEM \ | |
246 | ( \ | |
247 | BOOST_VMD_ALLOW_ALL, \ | |
248 | 0, \ | |
249 | BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \ | |
250 | BOOST_VMD_RETURN_AFTER, \ | |
251 | BOOST_VMD_RETURN_TYPE_TUPLE \ | |
252 | ), \ | |
253 | __VA_ARGS__ \ | |
254 | ) \ | |
255 | /**/ | |
256 | ||
257 | #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_D(d,...) \ | |
258 | BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_D \ | |
259 | ( \ | |
260 | d, \ | |
261 | BOOST_VMD_DETAIL_SEQUENCE_ELEM_D \ | |
262 | ( \ | |
263 | d, \ | |
264 | BOOST_VMD_ALLOW_ALL, \ | |
265 | 0, \ | |
266 | BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \ | |
267 | BOOST_VMD_RETURN_AFTER, \ | |
268 | BOOST_VMD_RETURN_TYPE_TUPLE \ | |
269 | ), \ | |
270 | __VA_ARGS__ \ | |
271 | ) \ | |
272 | /**/ | |
273 | ||
274 | #endif /* BOOST_VMD_DETAIL_SEQUENCE_TYPE_HPP */ |