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_IS_ARRAY_COMMON_HPP)
8 #define BOOST_VMD_DETAIL_IS_ARRAY_COMMON_HPP
9 
10 #include <boost/preprocessor/cat.hpp>
11 #include <boost/preprocessor/comparison/equal.hpp>
12 #include <boost/preprocessor/control/if.hpp>
13 #include <boost/preprocessor/control/iif.hpp>
14 #include <boost/preprocessor/facilities/empty.hpp>
15 #include <boost/preprocessor/tuple/elem.hpp>
16 #include <boost/preprocessor/tuple/size.hpp>
17 #include <boost/vmd/identity.hpp>
18 #include <boost/vmd/is_empty.hpp>
19 #include <boost/vmd/is_number.hpp>
20 #include <boost/vmd/is_tuple.hpp>
21 #include <boost/vmd/detail/is_empty_tuple.hpp>
22 
23 #define BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(tuple) \
24     BOOST_VMD_IDENTITY_RESULT \
25         ( \
26         BOOST_PP_IIF \
27             ( \
28             BOOST_PP_EQUAL(2,BOOST_PP_TUPLE_SIZE(tuple)), \
29             BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM, \
30             BOOST_VMD_IDENTITY(0) \
31             ) \
32         (tuple) \
33         ) \
34 /**/
35 
36 #define BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,tuple) \
37     BOOST_VMD_IDENTITY_RESULT \
38         ( \
39         BOOST_PP_IIF \
40             ( \
41             BOOST_PP_EQUAL_D(d,2,BOOST_PP_TUPLE_SIZE(tuple)), \
42             BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM_D, \
43             BOOST_VMD_IDENTITY(0) \
44             ) \
45         (d,tuple) \
46         ) \
47 /**/
48 
49 /*
50 
51   Check if the first element of the tuple is equal to the number of tuple elements of the second element
52 
53 */
54 
55 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE(x) \
56     BOOST_PP_EQUAL(BOOST_PP_TUPLE_ELEM(0,x),BOOST_PP_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,x))) \
57 /**/
58 
59 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE_D(d,x) \
60     BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_ELEM(0,x),BOOST_PP_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,x))) \
61 /**/
62 
63 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY(tuple) \
64     BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,tuple)) \
65 /**/
66 
67 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY_D(d,tuple) \
68     BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,tuple)) \
69 /**/
70 
71 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH(tuple) \
72     BOOST_PP_IF \
73         ( \
74         BOOST_PP_TUPLE_ELEM(0,tuple), \
75         BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE, \
76         BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY \
77         ) \
78     (tuple) \
79 /**/
80 
81 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_D(d,tuple) \
82     BOOST_PP_IF \
83         ( \
84         BOOST_PP_TUPLE_ELEM(0,tuple), \
85         BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE_D, \
86         BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY_D \
87         ) \
88     (d,tuple) \
89 /**/
90 
91 /*
92 
93   Check if the first element is numeric
94 
95 */
96 
97 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC(tuple) \
98     BOOST_VMD_IDENTITY_RESULT \
99         ( \
100         BOOST_PP_IIF \
101           ( \
102           BOOST_VMD_DETAIL_IS_ARRAY_NUM(BOOST_PP_TUPLE_ELEM(0,tuple)), \
103           BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH, \
104           BOOST_VMD_IDENTITY(0) \
105           ) \
106         (tuple) \
107         ) \
108 /**/
109 
110 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_D(d,tuple) \
111     BOOST_VMD_IDENTITY_RESULT \
112         ( \
113         BOOST_PP_IIF \
114           ( \
115           BOOST_VMD_DETAIL_IS_ARRAY_NUM(BOOST_PP_TUPLE_ELEM(0,tuple)), \
116           BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_D, \
117           BOOST_VMD_IDENTITY(0) \
118           ) \
119         (d,tuple) \
120         ) \
121 /**/
122 
123 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER(tuple) \
124     BOOST_VMD_IDENTITY_RESULT \
125         ( \
126         BOOST_PP_IIF \
127             ( \
128             BOOST_VMD_IS_NUMBER(BOOST_PP_TUPLE_ELEM(0,tuple)), \
129             BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC, \
130             BOOST_VMD_IDENTITY(0) \
131             ) \
132         (tuple) \
133         ) \
134 /**/
135 
136 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER_D(d,tuple) \
137     BOOST_VMD_IDENTITY_RESULT \
138         ( \
139         BOOST_PP_IIF \
140             ( \
141             BOOST_VMD_IS_NUMBER(BOOST_PP_TUPLE_ELEM(0,tuple)), \
142             BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_D, \
143             BOOST_VMD_IDENTITY(0) \
144             ) \
145         (d,tuple) \
146         ) \
147 /**/
148 
149 /*
150 
151   Check if the second element is a tuple
152 
153 */
154 
155 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM(tuple) \
156     BOOST_VMD_IDENTITY_RESULT \
157         ( \
158         BOOST_PP_IIF \
159           ( \
160           BOOST_VMD_IS_TUPLE(BOOST_PP_TUPLE_ELEM(1,tuple)), \
161           BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER, \
162           BOOST_VMD_IDENTITY(0) \
163           ) \
164         (tuple) \
165         ) \
166 /**/
167 
168 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM_D(d,tuple) \
169     BOOST_VMD_IDENTITY_RESULT \
170         ( \
171         BOOST_PP_IIF \
172           ( \
173           BOOST_VMD_IS_TUPLE(BOOST_PP_TUPLE_ELEM(1,tuple)), \
174           BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER_D, \
175           BOOST_VMD_IDENTITY(0) \
176           ) \
177         (d,tuple) \
178         ) \
179 /**/
180 
181 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM(x) BOOST_VMD_IS_EMPTY(BOOST_PP_CAT(BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_, x) BOOST_PP_EMPTY())
182 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_0
183 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_1
184 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_2
185 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_3
186 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_4
187 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_5
188 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_6
189 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_7
190 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_8
191 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_9
192 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_10
193 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_11
194 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_12
195 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_13
196 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_14
197 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_15
198 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_16
199 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_17
200 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_18
201 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_19
202 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_20
203 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_21
204 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_22
205 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_23
206 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_24
207 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_25
208 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_26
209 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_27
210 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_28
211 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_29
212 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_30
213 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_31
214 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_32
215 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_33
216 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_34
217 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_35
218 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_36
219 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_37
220 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_38
221 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_39
222 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_40
223 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_41
224 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_42
225 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_43
226 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_44
227 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_45
228 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_46
229 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_47
230 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_48
231 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_49
232 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_50
233 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_51
234 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_52
235 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_53
236 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_54
237 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_55
238 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_56
239 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_57
240 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_58
241 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_59
242 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_60
243 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_61
244 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_62
245 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_63
246 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_64
247 
248 #endif /* BOOST_VMD_DETAIL_IS_ARRAY_COMMON_HPP */
249