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_EQUAL_HPP)
8 #define BOOST_VMD_DETAIL_EQUAL_HPP
10 #include <boost/preprocessor/cat.hpp>
11 #include <boost/preprocessor/detail/auto_rec.hpp>
12 #include <boost/preprocessor/facilities/empty.hpp>
13 #include <boost/preprocessor/facilities/overload.hpp>
14 #include <boost/preprocessor/logical/compl.hpp>
15 #include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
16 #include <boost/vmd/is_identifier.hpp>
17 #include <boost/vmd/is_empty_list.hpp>
18 #include <boost/vmd/detail/not_empty.hpp>
20 #include <boost/vmd/detail/recurse/equal/equal_1.hpp>
21 #include <boost/vmd/detail/recurse/equal/equal_2.hpp>
22 #include <boost/vmd/detail/recurse/equal/equal_3.hpp>
23 #include <boost/vmd/detail/recurse/equal/equal_4.hpp>
24 #include <boost/vmd/detail/recurse/equal/equal_5.hpp>
25 #include <boost/vmd/detail/recurse/equal/equal_6.hpp>
26 #include <boost/vmd/detail/recurse/equal/equal_7.hpp>
27 #include <boost/vmd/detail/recurse/equal/equal_8.hpp>
28 #include <boost/vmd/detail/recurse/equal/equal_9.hpp>
29 #include <boost/vmd/detail/recurse/equal/equal_10.hpp>
30 #include <boost/vmd/detail/recurse/equal/equal_11.hpp>
31 #include <boost/vmd/detail/recurse/equal/equal_12.hpp>
32 #include <boost/vmd/detail/recurse/equal/equal_13.hpp>
33 #include <boost/vmd/detail/recurse/equal/equal_14.hpp>
34 #include <boost/vmd/detail/recurse/equal/equal_15.hpp>
35 #include <boost/vmd/detail/recurse/equal/equal_16.hpp>
37 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_1(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_1_D(d,vseq1,vseq2)
38 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_2(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_2_D(d,vseq1,vseq2)
39 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_3(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_3_D(d,vseq1,vseq2)
40 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_4(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_4_D(d,vseq1,vseq2)
41 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_5(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_5_D(d,vseq1,vseq2)
42 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_6(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_6_D(d,vseq1,vseq2)
43 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_7(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_7_D(d,vseq1,vseq2)
44 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_8(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_8_D(d,vseq1,vseq2)
45 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_9(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_9_D(d,vseq1,vseq2)
46 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_10(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_10_D(d,vseq1,vseq2)
47 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_11(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_11_D(d,vseq1,vseq2)
48 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_12(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_12_D(d,vseq1,vseq2)
49 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_13(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_13_D(d,vseq1,vseq2)
50 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_14(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_14_D(d,vseq1,vseq2)
51 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_15(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_15_D(d,vseq1,vseq2)
52 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_16(d,vseq1,vseq2) BOOST_VMD_DETAIL_EQUAL_16_D(d,vseq1,vseq2)
54 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_AUTO_REC_D(n) \
55 BOOST_VMD_DETAIL_EQUAL_IS_1 \
57 BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_ ## n(1,,) \
61 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
64 BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_, \
65 BOOST_PP_AUTO_REC(BOOST_VMD_DETAIL_EQUAL_SIMPLE_AUTO_REC_D,16) \
70 #define BOOST_VMD_DETAIL_EQUAL_CNI_CHK(vseq1,vseq2,vtype) \
77 BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
78 BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
82 BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
83 BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
86 BOOST_VMD_DETAIL_DATA_EQUAL, \
87 BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
92 #define BOOST_VMD_DETAIL_EQUAL_CNI_CHK_D(d,vseq1,vseq2,vtype) \
99 BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
100 BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
104 BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
105 BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
108 BOOST_VMD_DETAIL_DATA_EQUAL_D, \
109 BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
111 (d,vseq1,vseq2,vtype) \
114 #define BOOST_VMD_DETAIL_EQUAL_VSEQ(vseq1,vseq2,vtype) \
115 BOOST_VMD_DETAIL_DATA_EQUAL \
117 BOOST_VMD_TO_SEQ(vseq1), \
118 BOOST_VMD_TO_SEQ(vseq2), \
123 #define BOOST_VMD_DETAIL_EQUAL_VSEQ_D(d,vseq1,vseq2,vtype) \
124 BOOST_VMD_DETAIL_DATA_EQUAL_D \
127 BOOST_VMD_TO_SEQ_D(d,vseq1), \
128 BOOST_VMD_TO_SEQ_D(d,vseq2), \
133 #define BOOST_VMD_DETAIL_EQUAL_CNI(vseq1,vseq2,vtype) \
136 BOOST_VMD_DETAIL_EQUAL_TYPE \
139 BOOST_VMD_TYPE_SEQUENCE \
141 BOOST_VMD_DETAIL_EQUAL_VSEQ, \
142 BOOST_VMD_DETAIL_EQUAL_CNI_CHK \
144 (vseq1,vseq2,vtype) \
147 #define BOOST_VMD_DETAIL_EQUAL_CNI_D(d,vseq1,vseq2,vtype) \
150 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
154 BOOST_VMD_TYPE_SEQUENCE \
156 BOOST_VMD_DETAIL_EQUAL_VSEQ_D, \
157 BOOST_VMD_DETAIL_EQUAL_CNI_CHK_D \
159 (d,vseq1,vseq2,vtype) \
162 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE(vseq1,vtype1,type) \
165 BOOST_VMD_DETAIL_EQUAL_TYPE \
167 BOOST_VMD_TYPE_ARRAY, \
172 BOOST_VMD_DETAIL_EQUAL_TYPE \
174 BOOST_VMD_TYPE_LIST, \
179 BOOST_VMD_IS_EMPTY_LIST(vseq1) \
185 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE_D(d,vseq1,vtype1,type) \
188 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
191 BOOST_VMD_TYPE_ARRAY, \
196 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
199 BOOST_VMD_TYPE_LIST, \
204 BOOST_VMD_IS_EMPTY_LIST_D(d,vseq1) \
210 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER(vseq1,vtype1,type) \
211 BOOST_VMD_IDENTITY_RESULT \
215 BOOST_VMD_DETAIL_EQUAL_TYPE \
217 BOOST_VMD_TYPE_IDENTIFIER, \
220 BOOST_VMD_IS_IDENTIFIER, \
221 BOOST_VMD_IDENTITY(0) \
227 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER_D(d,vseq1,vtype1,type) \
228 BOOST_VMD_IDENTITY_RESULT \
232 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
235 BOOST_VMD_TYPE_IDENTIFIER, \
238 BOOST_VMD_IS_IDENTIFIER_D, \
239 BOOST_VMD_IDENTITY(0) \
245 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK(vseq1,vtype1,type) \
248 BOOST_VMD_DETAIL_EQUAL_TYPE \
250 BOOST_VMD_TYPE_TUPLE, \
253 BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE, \
254 BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER \
256 (vseq1,vtype1,type) \
259 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_D(d,vseq1,vtype1,type) \
262 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
265 BOOST_VMD_TYPE_TUPLE, \
268 BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE_D, \
269 BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER_D \
271 (d,vseq1,vtype1,type) \
274 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE(vseq1,vtype1,type) \
275 BOOST_VMD_IDENTITY_RESULT \
279 BOOST_VMD_DETAIL_EQUAL_TYPE \
284 BOOST_VMD_IDENTITY(1), \
285 BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK \
287 (vseq1,vtype1,type) \
291 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_D(d,vseq1,vtype1,type) \
292 BOOST_VMD_IDENTITY_RESULT \
296 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
302 BOOST_VMD_IDENTITY(1), \
303 BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_D \
305 (d,vseq1,vtype1,type) \
309 #define BOOST_VMD_DETAIL_EQUAL_WT_CHECK(vseq1,vseq2,vtype1,vtype2,type) \
310 BOOST_VMD_IDENTITY_RESULT \
316 BOOST_VMD_DETAIL_EQUAL_TYPE \
321 BOOST_VMD_IDENTITY_RESULT \
325 BOOST_VMD_DETAIL_NOT_EMPTY(type), \
326 BOOST_VMD_DETAIL_EQUAL_TEST_TYPE, \
327 BOOST_VMD_IDENTITY(1) \
329 (vseq1,vtype1,type) \
332 BOOST_VMD_DETAIL_EQUAL_CNI, \
333 BOOST_VMD_IDENTITY(0) \
335 (vseq1,vseq2,vtype1) \
339 #define BOOST_VMD_DETAIL_EQUAL_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2,type) \
340 BOOST_VMD_IDENTITY_RESULT \
346 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
352 BOOST_VMD_IDENTITY_RESULT \
356 BOOST_VMD_DETAIL_NOT_EMPTY(type), \
357 BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_D, \
358 BOOST_VMD_IDENTITY(1) \
360 (d,vseq1,vtype1,type) \
363 BOOST_VMD_DETAIL_EQUAL_CNI_D, \
364 BOOST_VMD_IDENTITY(0) \
366 (d,vseq1,vseq2,vtype1) \
370 #define BOOST_VMD_DETAIL_EQUAL_WT_CONVERT(vseq1,vseq2,vtype1,vtype2,type) \
371 BOOST_VMD_DETAIL_EQUAL_WT_CHECK \
375 BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
376 BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2), \
381 #define BOOST_VMD_DETAIL_EQUAL_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2,type) \
382 BOOST_VMD_DETAIL_EQUAL_WT_CHECK_D \
387 BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
388 BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2), \
393 #define BOOST_VMD_DETAIL_EQUAL_WT(vseq1,vseq2,vtype1,vtype2,type) \
394 BOOST_VMD_IDENTITY_RESULT \
398 BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
399 BOOST_VMD_IDENTITY(0), \
400 BOOST_VMD_DETAIL_EQUAL_WT_CONVERT \
402 (vseq1,vseq2,vtype1,vtype2,type) \
406 #define BOOST_VMD_DETAIL_EQUAL_WT_D(d,vseq1,vseq2,vtype1,vtype2,type) \
407 BOOST_VMD_IDENTITY_RESULT \
411 BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
412 BOOST_VMD_IDENTITY(0), \
413 BOOST_VMD_DETAIL_EQUAL_WT_CONVERT_D \
415 (d,vseq1,vseq2,vtype1,vtype2,type) \
419 #define BOOST_VMD_DETAIL_EQUAL_GTYPE(vseq1,vseq2,type) \
420 BOOST_VMD_DETAIL_EQUAL_WT \
424 BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
425 BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE), \
430 #define BOOST_VMD_DETAIL_EQUAL_GTYPE_D(d,vseq1,vseq2,type) \
431 BOOST_VMD_DETAIL_EQUAL_WT_D \
436 BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
437 BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE), \
442 #define BOOST_VMD_DETAIL_EQUAL_EBP(vseq1,vseq2,be1,be2,type) \
443 BOOST_VMD_IDENTITY_RESULT \
449 BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
450 BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
452 BOOST_VMD_DETAIL_EQUAL_GTYPE, \
453 BOOST_VMD_IDENTITY(0) \
459 #define BOOST_VMD_DETAIL_EQUAL_EBP_D(d,vseq1,vseq2,be1,be2,type) \
460 BOOST_VMD_IDENTITY_RESULT \
466 BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
467 BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
469 BOOST_VMD_DETAIL_EQUAL_GTYPE_D, \
470 BOOST_VMD_IDENTITY(0) \
472 (d,vseq1,vseq2,type) \
476 #define BOOST_VMD_DETAIL_EQUAL_EMPTY(vseq1,vseq2,be1,be2,type) \
479 BOOST_PP_BITAND(be1,be2), \
480 BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
481 BOOST_VMD_DETAIL_EQUAL_EBP \
483 (vseq1,vseq2,be1,be2,type) \
486 #define BOOST_VMD_DETAIL_EQUAL_EMPTY_D(d,vseq1,vseq2,be1,be2,type) \
489 BOOST_PP_BITAND(be1,be2), \
490 BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
491 BOOST_VMD_DETAIL_EQUAL_EBP_D \
493 (d,vseq1,vseq2,be1,be2,type) \
496 #define BOOST_VMD_DETAIL_EQUAL_OV1(vseq1,vseq2) \
497 BOOST_VMD_DETAIL_EQUAL_EMPTY \
501 BOOST_VMD_IS_EMPTY(vseq1), \
502 BOOST_VMD_IS_EMPTY(vseq2), \
506 #define BOOST_VMD_DETAIL_EQUAL_OV2(vseq1,vseq2,type) \
507 BOOST_VMD_DETAIL_EQUAL_EMPTY \
511 BOOST_VMD_IS_EMPTY(vseq1), \
512 BOOST_VMD_IS_EMPTY(vseq2), \
517 #define BOOST_VMD_DETAIL_EQUAL_D_OV1(d,vseq1,vseq2) \
518 BOOST_VMD_DETAIL_EQUAL_EMPTY_D \
523 BOOST_VMD_IS_EMPTY(vseq1), \
524 BOOST_VMD_IS_EMPTY(vseq2), \
528 #define BOOST_VMD_DETAIL_EQUAL_D_OV2(d,vseq1,vseq2,type) \
529 BOOST_VMD_DETAIL_EQUAL_EMPTY_D \
534 BOOST_VMD_IS_EMPTY(vseq1), \
535 BOOST_VMD_IS_EMPTY(vseq2), \
542 #define BOOST_VMD_DETAIL_EQUAL(vseq1,...) \
543 BOOST_PP_CAT(BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_OV,__VA_ARGS__)(vseq1,__VA_ARGS__),BOOST_PP_EMPTY()) \
546 #define BOOST_VMD_DETAIL_EQUAL_D(d,vseq1,...) \
547 BOOST_PP_CAT(BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_D_OV,__VA_ARGS__)(d,vseq1,__VA_ARGS__),BOOST_PP_EMPTY()) \
552 #define BOOST_VMD_DETAIL_EQUAL(vseq1,...) \
553 BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_OV,__VA_ARGS__)(vseq1,__VA_ARGS__) \
556 #define BOOST_VMD_DETAIL_EQUAL_D(d,vseq1,...) \
557 BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_D_OV,__VA_ARGS__)(d,vseq1,__VA_ARGS__) \
562 #endif /* BOOST_VMD_DETAIL_EQUAL_HPP */