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_EQUAL_HPP)
8 #define BOOST_VMD_DETAIL_EQUAL_HPP
9 
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>
19 
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>
36 
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)
53 
54 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_AUTO_REC_D(n) \
55     BOOST_VMD_DETAIL_EQUAL_IS_1 \
56         ( \
57         BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_ ## n(1,,) \
58         ) \
59 /**/
60 
61 #define BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
62     BOOST_PP_CAT \
63         ( \
64         BOOST_VMD_DETAIL_EQUAL_SIMPLE_D_, \
65         BOOST_PP_AUTO_REC(BOOST_VMD_DETAIL_EQUAL_SIMPLE_AUTO_REC_D,16) \
66         ) \
67 /**/
68 
69 
70 #define BOOST_VMD_DETAIL_EQUAL_CNI_CHK(vseq1,vseq2,vtype) \
71     BOOST_PP_IIF \
72         ( \
73         BOOST_PP_BITOR \
74             ( \
75             BOOST_PP_BITOR \
76                 ( \
77                 BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
78                 BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
79                 ), \
80             BOOST_PP_BITOR \
81                 ( \
82                 BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
83                 BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
84                 ) \
85             ), \
86         BOOST_VMD_DETAIL_DATA_EQUAL, \
87         BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
88         ) \
89     (vseq1,vseq2,vtype) \
90 /**/
91 
92 #define BOOST_VMD_DETAIL_EQUAL_CNI_CHK_D(d,vseq1,vseq2,vtype) \
93     BOOST_PP_IIF \
94         ( \
95         BOOST_PP_BITOR \
96             ( \
97             BOOST_PP_BITOR \
98                 ( \
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) \
101                 ), \
102             BOOST_PP_BITOR \
103                 ( \
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) \
106                 ) \
107             ), \
108         BOOST_VMD_DETAIL_DATA_EQUAL_D, \
109         BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
110         ) \
111     (d,vseq1,vseq2,vtype) \
112 /**/
113 
114 #define BOOST_VMD_DETAIL_EQUAL_VSEQ(vseq1,vseq2,vtype) \
115     BOOST_VMD_DETAIL_DATA_EQUAL \
116         ( \
117         BOOST_VMD_TO_SEQ(vseq1), \
118         BOOST_VMD_TO_SEQ(vseq2), \
119         BOOST_VMD_TYPE_SEQ \
120         ) \
121 /**/
122 
123 #define BOOST_VMD_DETAIL_EQUAL_VSEQ_D(d,vseq1,vseq2,vtype) \
124     BOOST_VMD_DETAIL_DATA_EQUAL_D \
125         ( \
126         d, \
127         BOOST_VMD_TO_SEQ_D(d,vseq1), \
128         BOOST_VMD_TO_SEQ_D(d,vseq2), \
129         BOOST_VMD_TYPE_SEQ \
130         ) \
131 /**/
132 
133 #define BOOST_VMD_DETAIL_EQUAL_CNI(vseq1,vseq2,vtype) \
134     BOOST_PP_IIF \
135         ( \
136         BOOST_VMD_DETAIL_EQUAL_TYPE \
137             ( \
138             vtype, \
139             BOOST_VMD_TYPE_SEQUENCE \
140             ), \
141         BOOST_VMD_DETAIL_EQUAL_VSEQ, \
142         BOOST_VMD_DETAIL_EQUAL_CNI_CHK \
143         ) \
144     (vseq1,vseq2,vtype) \
145 /**/
146 
147 #define BOOST_VMD_DETAIL_EQUAL_CNI_D(d,vseq1,vseq2,vtype) \
148     BOOST_PP_IIF \
149         ( \
150         BOOST_VMD_DETAIL_EQUAL_TYPE_D \
151             ( \
152             d, \
153             vtype, \
154             BOOST_VMD_TYPE_SEQUENCE \
155             ), \
156         BOOST_VMD_DETAIL_EQUAL_VSEQ_D, \
157         BOOST_VMD_DETAIL_EQUAL_CNI_CHK_D \
158         ) \
159     (d,vseq1,vseq2,vtype) \
160 /**/
161 
162 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE(vseq1,vtype1,type) \
163     BOOST_PP_BITOR \
164         ( \
165         BOOST_VMD_DETAIL_EQUAL_TYPE \
166             ( \
167             BOOST_VMD_TYPE_ARRAY, \
168             vtype1 \
169             ), \
170         BOOST_PP_BITAND \
171             ( \
172             BOOST_VMD_DETAIL_EQUAL_TYPE \
173                 ( \
174                 BOOST_VMD_TYPE_LIST, \
175                 vtype1 \
176                 ), \
177             BOOST_PP_COMPL \
178                 ( \
179                 BOOST_VMD_IS_EMPTY_LIST(vseq1) \
180                 ) \
181             ) \
182         ) \
183 /**/
184 
185 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE_D(d,vseq1,vtype1,type) \
186     BOOST_PP_BITOR \
187         ( \
188         BOOST_VMD_DETAIL_EQUAL_TYPE_D \
189             ( \
190             d, \
191             BOOST_VMD_TYPE_ARRAY, \
192             vtype1 \
193             ), \
194         BOOST_PP_BITAND \
195             ( \
196             BOOST_VMD_DETAIL_EQUAL_TYPE_D \
197                 ( \
198                 d, \
199                 BOOST_VMD_TYPE_LIST, \
200                 vtype1 \
201                 ), \
202             BOOST_PP_COMPL \
203                 ( \
204                 BOOST_VMD_IS_EMPTY_LIST_D(d,vseq1) \
205                 ) \
206             ) \
207         ) \
208 /**/
209 
210 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER(vseq1,vtype1,type) \
211     BOOST_VMD_IDENTITY_RESULT \
212         ( \
213         BOOST_PP_IIF \
214             ( \
215             BOOST_VMD_DETAIL_EQUAL_TYPE \
216                 ( \
217                 BOOST_VMD_TYPE_IDENTIFIER, \
218                 type \
219                 ), \
220             BOOST_VMD_IS_IDENTIFIER, \
221             BOOST_VMD_IDENTITY(0) \
222             ) \
223         (vseq1) \
224         ) \
225 /**/
226 
227 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER_D(d,vseq1,vtype1,type) \
228     BOOST_VMD_IDENTITY_RESULT \
229         ( \
230         BOOST_PP_IIF \
231             ( \
232             BOOST_VMD_DETAIL_EQUAL_TYPE_D \
233                 ( \
234                 d, \
235                 BOOST_VMD_TYPE_IDENTIFIER, \
236                 type \
237                 ), \
238             BOOST_VMD_IS_IDENTIFIER_D, \
239             BOOST_VMD_IDENTITY(0) \
240             ) \
241         (d,vseq1) \
242         ) \
243 /**/
244 
245 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK(vseq1,vtype1,type) \
246     BOOST_PP_IIF \
247         ( \
248         BOOST_VMD_DETAIL_EQUAL_TYPE \
249             ( \
250             BOOST_VMD_TYPE_TUPLE, \
251             type \
252             ), \
253         BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE, \
254         BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER \
255         ) \
256     (vseq1,vtype1,type) \
257 /**/
258 
259 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_D(d,vseq1,vtype1,type) \
260     BOOST_PP_IIF \
261         ( \
262         BOOST_VMD_DETAIL_EQUAL_TYPE_D \
263             ( \
264             d, \
265             BOOST_VMD_TYPE_TUPLE, \
266             type \
267             ), \
268         BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_TUPLE_D, \
269         BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_IDENTIFIER_D \
270         ) \
271     (d,vseq1,vtype1,type) \
272 /**/
273 
274 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE(vseq1,vtype1,type) \
275     BOOST_VMD_IDENTITY_RESULT \
276         ( \
277         BOOST_PP_IIF \
278             ( \
279             BOOST_VMD_DETAIL_EQUAL_TYPE \
280                 ( \
281                 vtype1, \
282                 type \
283                 ), \
284             BOOST_VMD_IDENTITY(1), \
285             BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK \
286             ) \
287         (vseq1,vtype1,type)    \
288         ) \
289 /**/
290 
291 #define BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_D(d,vseq1,vtype1,type) \
292     BOOST_VMD_IDENTITY_RESULT \
293         ( \
294         BOOST_PP_IIF \
295             ( \
296             BOOST_VMD_DETAIL_EQUAL_TYPE_D \
297                 ( \
298                 d, \
299                 vtype1, \
300                 type \
301                 ), \
302             BOOST_VMD_IDENTITY(1), \
303             BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_CHECK_D \
304             ) \
305         (d,vseq1,vtype1,type)    \
306         ) \
307 /**/
308 
309 #define BOOST_VMD_DETAIL_EQUAL_WT_CHECK(vseq1,vseq2,vtype1,vtype2,type) \
310     BOOST_VMD_IDENTITY_RESULT \
311         ( \
312         BOOST_PP_IIF \
313             ( \
314             BOOST_PP_BITAND \
315                 ( \
316                 BOOST_VMD_DETAIL_EQUAL_TYPE \
317                     ( \
318                     vtype1, \
319                     vtype2 \
320                     ), \
321                 BOOST_VMD_IDENTITY_RESULT \
322                     ( \
323                     BOOST_PP_IIF \
324                         ( \
325                         BOOST_VMD_DETAIL_NOT_EMPTY(type), \
326                         BOOST_VMD_DETAIL_EQUAL_TEST_TYPE, \
327                         BOOST_VMD_IDENTITY(1) \
328                         ) \
329                     (vseq1,vtype1,type) \
330                     ) \
331                 ), \
332             BOOST_VMD_DETAIL_EQUAL_CNI, \
333             BOOST_VMD_IDENTITY(0) \
334             ) \
335         (vseq1,vseq2,vtype1) \
336         ) \
337 /**/
338 
339 #define BOOST_VMD_DETAIL_EQUAL_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2,type) \
340     BOOST_VMD_IDENTITY_RESULT \
341         ( \
342         BOOST_PP_IIF \
343             ( \
344             BOOST_PP_BITAND \
345                 ( \
346                 BOOST_VMD_DETAIL_EQUAL_TYPE_D \
347                     ( \
348                     d, \
349                     vtype1, \
350                     vtype2 \
351                     ), \
352                 BOOST_VMD_IDENTITY_RESULT \
353                     ( \
354                     BOOST_PP_IIF \
355                         ( \
356                         BOOST_VMD_DETAIL_NOT_EMPTY(type), \
357                         BOOST_VMD_DETAIL_EQUAL_TEST_TYPE_D, \
358                         BOOST_VMD_IDENTITY(1) \
359                         ) \
360                     (d,vseq1,vtype1,type) \
361                     ) \
362                 ), \
363             BOOST_VMD_DETAIL_EQUAL_CNI_D, \
364             BOOST_VMD_IDENTITY(0) \
365             ) \
366         (d,vseq1,vseq2,vtype1) \
367         ) \
368 /**/
369 
370 #define BOOST_VMD_DETAIL_EQUAL_WT_CONVERT(vseq1,vseq2,vtype1,vtype2,type) \
371     BOOST_VMD_DETAIL_EQUAL_WT_CHECK \
372         ( \
373         vseq1, \
374         vseq2, \
375         BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
376         BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2), \
377         type \
378         ) \
379 /**/
380 
381 #define BOOST_VMD_DETAIL_EQUAL_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2,type) \
382     BOOST_VMD_DETAIL_EQUAL_WT_CHECK_D \
383         ( \
384         d, \
385         vseq1, \
386         vseq2, \
387         BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
388         BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2), \
389         type \
390         ) \
391 /**/
392 
393 #define BOOST_VMD_DETAIL_EQUAL_WT(vseq1,vseq2,vtype1,vtype2,type) \
394     BOOST_VMD_IDENTITY_RESULT \
395         ( \
396         BOOST_PP_IIF \
397             ( \
398             BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
399             BOOST_VMD_IDENTITY(0), \
400             BOOST_VMD_DETAIL_EQUAL_WT_CONVERT \
401             ) \
402         (vseq1,vseq2,vtype1,vtype2,type) \
403         ) \
404 /**/
405 
406 #define BOOST_VMD_DETAIL_EQUAL_WT_D(d,vseq1,vseq2,vtype1,vtype2,type) \
407     BOOST_VMD_IDENTITY_RESULT \
408         ( \
409         BOOST_PP_IIF \
410             ( \
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 \
414             ) \
415         (d,vseq1,vseq2,vtype1,vtype2,type) \
416         ) \
417 /**/
418 
419 #define BOOST_VMD_DETAIL_EQUAL_GTYPE(vseq1,vseq2,type) \
420     BOOST_VMD_DETAIL_EQUAL_WT \
421         ( \
422         vseq1, \
423         vseq2, \
424         BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
425         BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE), \
426         type \
427         ) \
428 /**/
429 
430 #define BOOST_VMD_DETAIL_EQUAL_GTYPE_D(d,vseq1,vseq2,type) \
431     BOOST_VMD_DETAIL_EQUAL_WT_D \
432         ( \
433         d, \
434         vseq1, \
435         vseq2, \
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), \
438         type \
439         ) \
440 /**/
441 
442 #define BOOST_VMD_DETAIL_EQUAL_EBP(vseq1,vseq2,be1,be2,type) \
443     BOOST_VMD_IDENTITY_RESULT \
444         ( \
445         BOOST_PP_IIF \
446             ( \
447             BOOST_PP_BITAND \
448                 ( \
449                 BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
450                 BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
451                 ), \
452             BOOST_VMD_DETAIL_EQUAL_GTYPE, \
453             BOOST_VMD_IDENTITY(0) \
454             ) \
455         (vseq1,vseq2,type) \
456         ) \
457 /**/
458 
459 #define BOOST_VMD_DETAIL_EQUAL_EBP_D(d,vseq1,vseq2,be1,be2,type) \
460     BOOST_VMD_IDENTITY_RESULT \
461         ( \
462         BOOST_PP_IIF \
463             ( \
464             BOOST_PP_BITAND \
465                 ( \
466                 BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
467                 BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
468                 ), \
469             BOOST_VMD_DETAIL_EQUAL_GTYPE_D, \
470             BOOST_VMD_IDENTITY(0) \
471             ) \
472         (d,vseq1,vseq2,type) \
473         ) \
474 /**/
475 
476 #define BOOST_VMD_DETAIL_EQUAL_EMPTY(vseq1,vseq2,be1,be2,type) \
477     BOOST_PP_IIF \
478         ( \
479         BOOST_PP_BITAND(be1,be2), \
480         BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
481         BOOST_VMD_DETAIL_EQUAL_EBP \
482         ) \
483     (vseq1,vseq2,be1,be2,type) \
484 /**/
485 
486 #define BOOST_VMD_DETAIL_EQUAL_EMPTY_D(d,vseq1,vseq2,be1,be2,type) \
487     BOOST_PP_IIF \
488         ( \
489         BOOST_PP_BITAND(be1,be2), \
490         BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
491         BOOST_VMD_DETAIL_EQUAL_EBP_D \
492         ) \
493     (d,vseq1,vseq2,be1,be2,type) \
494 /**/
495 
496 #define BOOST_VMD_DETAIL_EQUAL_OV1(vseq1,vseq2) \
497     BOOST_VMD_DETAIL_EQUAL_EMPTY \
498         ( \
499         vseq1, \
500         vseq2, \
501         BOOST_VMD_IS_EMPTY(vseq1), \
502         BOOST_VMD_IS_EMPTY(vseq2), \
503         ) \
504 /**/
505 
506 #define BOOST_VMD_DETAIL_EQUAL_OV2(vseq1,vseq2,type) \
507     BOOST_VMD_DETAIL_EQUAL_EMPTY \
508         ( \
509         vseq1, \
510         vseq2, \
511         BOOST_VMD_IS_EMPTY(vseq1), \
512         BOOST_VMD_IS_EMPTY(vseq2), \
513         type \
514         ) \
515 /**/
516 
517 #define BOOST_VMD_DETAIL_EQUAL_D_OV1(d,vseq1,vseq2) \
518     BOOST_VMD_DETAIL_EQUAL_EMPTY_D \
519         ( \
520         d, \
521         vseq1, \
522         vseq2, \
523         BOOST_VMD_IS_EMPTY(vseq1), \
524         BOOST_VMD_IS_EMPTY(vseq2), \
525         ) \
526 /**/
527 
528 #define BOOST_VMD_DETAIL_EQUAL_D_OV2(d,vseq1,vseq2,type) \
529     BOOST_VMD_DETAIL_EQUAL_EMPTY_D \
530         ( \
531         d, \
532         vseq1, \
533         vseq2, \
534         BOOST_VMD_IS_EMPTY(vseq1), \
535         BOOST_VMD_IS_EMPTY(vseq2), \
536         type \
537         ) \
538 /**/
539 
540 #if BOOST_VMD_MSVC
541 
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()) \
544 /**/
545 
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()) \
548 /**/
549 
550 #else
551 
552 #define BOOST_VMD_DETAIL_EQUAL(vseq1,...) \
553     BOOST_PP_OVERLOAD(BOOST_VMD_DETAIL_EQUAL_OV,__VA_ARGS__)(vseq1,__VA_ARGS__) \
554 /**/
555 
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__) \
558 /**/
559 
560 #endif
561 
562 #endif /* BOOST_VMD_DETAIL_EQUAL_HPP */
563