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_3_HPP)
8 #define BOOST_VMD_DETAIL_EQUAL_3_HPP
9 
10 #include <boost/vmd/detail/recurse/equal/equal_headers.hpp>
11 
12 #define BOOST_VMD_DETAIL_EQUAL_3_CNI_CHK(vseq1,vseq2,vtype) \
13     BOOST_PP_IIF \
14         ( \
15         BOOST_PP_BITOR \
16             ( \
17             BOOST_PP_BITOR \
18                 ( \
19                 BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_ARRAY), \
20                 BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_LIST) \
21                 ), \
22             BOOST_PP_BITOR \
23                 ( \
24                 BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_SEQ), \
25                 BOOST_VMD_DETAIL_EQUAL_TYPE(vtype,BOOST_VMD_TYPE_TUPLE) \
26                 ) \
27             ), \
28         BOOST_VMD_DETAIL_DATA_EQUAL_3, \
29         BOOST_VMD_DETAIL_EQUAL_CNI_SMP \
30         ) \
31     (vseq1,vseq2,vtype) \
32 /**/
33 
34 #define BOOST_VMD_DETAIL_EQUAL_3_CNI_CHK_D(d,vseq1,vseq2,vtype) \
35     BOOST_PP_IIF \
36         ( \
37         BOOST_PP_BITOR \
38             ( \
39             BOOST_PP_BITOR \
40                 ( \
41                 BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_ARRAY), \
42                 BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_LIST) \
43                 ), \
44             BOOST_PP_BITOR \
45                 ( \
46                 BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_SEQ), \
47                 BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,vtype,BOOST_VMD_TYPE_TUPLE) \
48                 ) \
49             ), \
50         BOOST_VMD_DETAIL_DATA_EQUAL_3_D, \
51         BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \
52         ) \
53     (d,vseq1,vseq2,vtype) \
54 /**/
55 
56 #define BOOST_VMD_DETAIL_EQUAL_3_VSEQ(vseq1,vseq2,vtype) \
57     BOOST_VMD_DETAIL_DATA_EQUAL_3 \
58         ( \
59         BOOST_VMD_TO_SEQ(vseq1), \
60         BOOST_VMD_TO_SEQ(vseq2), \
61         BOOST_VMD_TYPE_SEQ \
62         ) \
63 /**/
64 
65 #define BOOST_VMD_DETAIL_EQUAL_3_VSEQ_D(d,vseq1,vseq2,vtype) \
66     BOOST_VMD_DETAIL_DATA_EQUAL_3_D \
67         ( \
68         d, \
69         BOOST_VMD_TO_SEQ_D(d,vseq1), \
70         BOOST_VMD_TO_SEQ_D(d,vseq2), \
71         BOOST_VMD_TYPE_SEQ \
72         ) \
73 /**/
74 
75 #define BOOST_VMD_DETAIL_EQUAL_3_CNI(vseq1,vseq2,vtype) \
76     BOOST_PP_IIF \
77         ( \
78         BOOST_VMD_DETAIL_EQUAL_TYPE \
79             ( \
80             vtype, \
81             BOOST_VMD_TYPE_SEQUENCE \
82             ), \
83         BOOST_VMD_DETAIL_EQUAL_3_VSEQ, \
84         BOOST_VMD_DETAIL_EQUAL_3_CNI_CHK \
85         ) \
86     (vseq1,vseq2,vtype) \
87 /**/
88 
89 #define BOOST_VMD_DETAIL_EQUAL_3_CNI_D(d,vseq1,vseq2,vtype) \
90     BOOST_PP_IIF \
91         ( \
92         BOOST_VMD_DETAIL_EQUAL_TYPE_D \
93             ( \
94             d, \
95             vtype, \
96             BOOST_VMD_TYPE_SEQUENCE \
97             ), \
98         BOOST_VMD_DETAIL_EQUAL_3_VSEQ_D, \
99         BOOST_VMD_DETAIL_EQUAL_3_CNI_CHK_D \
100         ) \
101     (d,vseq1,vseq2,vtype) \
102 /**/
103 
104 #define BOOST_VMD_DETAIL_EQUAL_3_WT_CHECK(vseq1,vseq2,vtype1,vtype2) \
105     BOOST_VMD_IDENTITY_RESULT \
106         ( \
107         BOOST_PP_IIF \
108             ( \
109             BOOST_VMD_DETAIL_EQUAL_TYPE \
110                 ( \
111                 vtype1, \
112                 vtype2 \
113                 ), \
114             BOOST_VMD_DETAIL_EQUAL_3_CNI, \
115             BOOST_VMD_IDENTITY(0) \
116             ) \
117         (vseq1,vseq2,vtype1) \
118         ) \
119 /**/
120 
121 #define BOOST_VMD_DETAIL_EQUAL_3_WT_CHECK_D(d,vseq1,vseq2,vtype1,vtype2) \
122     BOOST_VMD_IDENTITY_RESULT \
123         ( \
124         BOOST_PP_IIF \
125             ( \
126             BOOST_VMD_DETAIL_EQUAL_TYPE_D \
127                 ( \
128                 d, \
129                 vtype1, \
130                 vtype2 \
131                 ), \
132             BOOST_VMD_DETAIL_EQUAL_3_CNI_D, \
133             BOOST_VMD_IDENTITY(0) \
134             ) \
135         (d,vseq1,vseq2,vtype1) \
136         ) \
137 /**/
138 
139 #define BOOST_VMD_DETAIL_EQUAL_3_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \
140     BOOST_VMD_DETAIL_EQUAL_3_WT_CHECK \
141         ( \
142         vseq1, \
143         vseq2, \
144         BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq1,vtype1), \
145         BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(vseq2,vtype2) \
146         ) \
147 /**/
148 
149 #define BOOST_VMD_DETAIL_EQUAL_3_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \
150     BOOST_VMD_DETAIL_EQUAL_3_WT_CHECK_D \
151         ( \
152         d, \
153         vseq1, \
154         vseq2, \
155         BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq1,vtype1), \
156         BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,vseq2,vtype2) \
157         ) \
158 /**/
159 
160 #define BOOST_VMD_DETAIL_EQUAL_3_WT(vseq1,vseq2,vtype1,vtype2) \
161     BOOST_VMD_IDENTITY_RESULT \
162         ( \
163         BOOST_PP_IIF \
164             ( \
165             BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH(vseq1,vseq2,vtype1,vtype2), \
166             BOOST_VMD_IDENTITY(0), \
167             BOOST_VMD_DETAIL_EQUAL_3_WT_CONVERT \
168             ) \
169         (vseq1,vseq2,vtype1,vtype2) \
170         ) \
171 /**/
172 
173 #define BOOST_VMD_DETAIL_EQUAL_3_WT_D(d,vseq1,vseq2,vtype1,vtype2) \
174     BOOST_VMD_IDENTITY_RESULT \
175         ( \
176         BOOST_PP_IIF \
177             ( \
178             BOOST_VMD_DETAIL_EQUAL_IS_TUPLE_MISMATCH_D(d,vseq1,vseq2,vtype1,vtype2), \
179             BOOST_VMD_IDENTITY(0), \
180             BOOST_VMD_DETAIL_EQUAL_3_WT_CONVERT_D \
181             ) \
182         (d,vseq1,vseq2,vtype1,vtype2) \
183         ) \
184 /**/
185 
186 #define BOOST_VMD_DETAIL_EQUAL_3_GTYPE(vseq1,vseq2) \
187     BOOST_VMD_DETAIL_EQUAL_3_WT \
188         ( \
189         vseq1, \
190         vseq2, \
191         BOOST_VMD_GET_TYPE(vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
192         BOOST_VMD_GET_TYPE(vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
193         ) \
194 /**/
195 
196 #define BOOST_VMD_DETAIL_EQUAL_3_GTYPE_D(d,vseq1,vseq2) \
197     BOOST_VMD_DETAIL_EQUAL_3_WT_D \
198         ( \
199         d, \
200         vseq1, \
201         vseq2, \
202         BOOST_VMD_GET_TYPE_D(d,vseq1,BOOST_VMD_RETURN_TYPE_TUPLE), \
203         BOOST_VMD_GET_TYPE_D(d,vseq2,BOOST_VMD_RETURN_TYPE_TUPLE) \
204         ) \
205 /**/
206 
207 #define BOOST_VMD_DETAIL_EQUAL_3_EBP(vseq1,vseq2,be1,be2) \
208     BOOST_VMD_IDENTITY_RESULT \
209         ( \
210         BOOST_PP_IIF \
211             ( \
212             BOOST_PP_BITAND \
213                 ( \
214                 BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
215                 BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
216                 ), \
217             BOOST_VMD_DETAIL_EQUAL_3_GTYPE, \
218             BOOST_VMD_IDENTITY(0) \
219             ) \
220         (vseq1,vseq2) \
221         ) \
222 /**/
223 
224 #define BOOST_VMD_DETAIL_EQUAL_3_EBP_D(d,vseq1,vseq2,be1,be2) \
225     BOOST_VMD_IDENTITY_RESULT \
226         ( \
227         BOOST_PP_IIF \
228             ( \
229             BOOST_PP_BITAND \
230                 ( \
231                 BOOST_VMD_DETAIL_EQUAL_CHK_MATCH(be1,be2), \
232                 BOOST_VMD_DETAIL_EQUAL_CHK_PARENS_MATCH(vseq1,vseq2) \
233                 ), \
234             BOOST_VMD_DETAIL_EQUAL_3_GTYPE_D, \
235             BOOST_VMD_IDENTITY(0) \
236             ) \
237         (d,vseq1,vseq2) \
238         ) \
239 /**/
240 
241 #define BOOST_VMD_DETAIL_EQUAL_3_EMPTY(vseq1,vseq2,be1,be2) \
242     BOOST_PP_IIF \
243         ( \
244         BOOST_PP_BITAND(be1,be2), \
245         BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
246         BOOST_VMD_DETAIL_EQUAL_3_EBP \
247         ) \
248     (vseq1,vseq2,be1,be2) \
249 /**/
250 
251 #define BOOST_VMD_DETAIL_EQUAL_3_EMPTY_D(d,vseq1,vseq2,be1,be2) \
252     BOOST_PP_IIF \
253         ( \
254         BOOST_PP_BITAND(be1,be2), \
255         BOOST_VMD_DETAIL_EQUAL_BOTH_EMPTY, \
256         BOOST_VMD_DETAIL_EQUAL_3_EBP_D \
257         ) \
258     (d,vseq1,vseq2,be1,be2) \
259 /**/
260 
261 #define BOOST_VMD_DETAIL_EQUAL_3(vseq1,vseq2) \
262     BOOST_VMD_DETAIL_EQUAL_3_EMPTY \
263         ( \
264         vseq1, \
265         vseq2, \
266         BOOST_VMD_IS_EMPTY(vseq1), \
267         BOOST_VMD_IS_EMPTY(vseq2) \
268         ) \
269 /**/
270 
271 #define BOOST_VMD_DETAIL_EQUAL_3_D(d,vseq1,vseq2) \
272     BOOST_VMD_DETAIL_EQUAL_3_EMPTY_D \
273         ( \
274         d, \
275         vseq1, \
276         vseq2, \
277         BOOST_VMD_IS_EMPTY(vseq1), \
278         BOOST_VMD_IS_EMPTY(vseq2) \
279         ) \
280 /**/
281 
282 #endif /* BOOST_VMD_DETAIL_EQUAL_3_HPP */
283