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_DATA_EQUAL_HPP)
8 #define BOOST_VMD_DETAIL_DATA_EQUAL_HPP
9 
10 #include <boost/vmd/detail/recurse/data_equal/data_equal_1.hpp>
11 #include <boost/vmd/detail/recurse/data_equal/data_equal_2.hpp>
12 #include <boost/vmd/detail/recurse/data_equal/data_equal_3.hpp>
13 #include <boost/vmd/detail/recurse/data_equal/data_equal_4.hpp>
14 #include <boost/vmd/detail/recurse/data_equal/data_equal_5.hpp>
15 #include <boost/vmd/detail/recurse/data_equal/data_equal_6.hpp>
16 #include <boost/vmd/detail/recurse/data_equal/data_equal_7.hpp>
17 #include <boost/vmd/detail/recurse/data_equal/data_equal_8.hpp>
18 #include <boost/vmd/detail/recurse/data_equal/data_equal_9.hpp>
19 #include <boost/vmd/detail/recurse/data_equal/data_equal_10.hpp>
20 #include <boost/vmd/detail/recurse/data_equal/data_equal_11.hpp>
21 #include <boost/vmd/detail/recurse/data_equal/data_equal_12.hpp>
22 #include <boost/vmd/detail/recurse/data_equal/data_equal_13.hpp>
23 #include <boost/vmd/detail/recurse/data_equal/data_equal_14.hpp>
24 #include <boost/vmd/detail/recurse/data_equal/data_equal_15.hpp>
25 #include <boost/vmd/detail/recurse/data_equal/data_equal_16.hpp>
26 
27 #include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
28 
29 #define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_PARENS(d,em1,em2) \
30     BOOST_VMD_IDENTITY_RESULT \
31         ( \
32         BOOST_PP_IIF \
33             ( \
34             BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
35             BOOST_VMD_IDENTITY(2), \
36             BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
37             ) \
38         (d,em1,em2) \
39         ) \
40 /**/
41 
42 #define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
43     BOOST_VMD_IDENTITY_RESULT \
44         ( \
45         BOOST_PP_IIF \
46             ( \
47             BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
48             BOOST_VMD_IDENTITY(2), \
49             BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
50             ) \
51         (d,em1,em2) \
52         ) \
53 /**/
54 
55 #define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP(d,state,em1,em2) \
56     BOOST_PP_IIF \
57         ( \
58         BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
59         BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
60         BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_PARENS \
61         ) \
62     (d,em1,em2) \
63 /**/
64 
65 #define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_D(d,state,em1,em2) \
66     BOOST_PP_IIF \
67         ( \
68         BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
69         BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
70         BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_PARENS_D \
71         ) \
72     (d,em1,em2) \
73 /**/
74 
75 #define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ(d,state) \
76     BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP \
77         ( \
78         d, \
79         state, \
80         BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
81         BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
82         ) \
83 /**/
84 
85 #define BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_D(d,state) \
86     BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_CMP_D \
87         ( \
88         d, \
89         state, \
90         BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
91         BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
92         ) \
93 /**/
94 
95 #define BOOST_VMD_DETAIL_DATA_EQUAL_OP(d,state) \
96     BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
97         ( \
98         d, \
99         state, \
100         BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ(d,state) \
101         ) \
102 /**/
103 
104 #define BOOST_VMD_DETAIL_DATA_EQUAL_OP_D(d,state) \
105     BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
106         ( \
107         d, \
108         state, \
109         BOOST_VMD_DETAIL_DATA_EQUAL_OP_TEQ_D(d,state) \
110         ) \
111 /**/
112 
113 #define BOOST_VMD_DETAIL_DATA_EQUAL_LOOP(dataf,datas,sz,vtype) \
114     BOOST_PP_TUPLE_ELEM \
115         ( \
116         0, \
117         BOOST_PP_WHILE \
118             ( \
119             BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
120             BOOST_VMD_DETAIL_DATA_EQUAL_OP, \
121                 ( \
122                 1, \
123                 dataf, \
124                 datas, \
125                 sz, \
126                 vtype, \
127                 0, \
128                 ) \
129             ) \
130         ) \
131 /**/
132 
133 #define BOOST_VMD_DETAIL_DATA_EQUAL_LOOP_D(d,dataf,datas,sz,vtype) \
134     BOOST_PP_TUPLE_ELEM \
135         ( \
136         0, \
137         BOOST_PP_WHILE_ ## d \
138             ( \
139             BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
140             BOOST_VMD_DETAIL_DATA_EQUAL_OP_D, \
141                 ( \
142                 1, \
143                 dataf, \
144                 datas, \
145                 sz, \
146                 vtype, \
147                 0, \
148                 ) \
149             ) \
150         ) \
151 /**/
152 
153 #define BOOST_VMD_DETAIL_DATA_EQUAL_SZ(dataf,datas,szf,szs,vtype) \
154     BOOST_VMD_IDENTITY_RESULT \
155         ( \
156         BOOST_PP_IIF \
157             ( \
158             BOOST_PP_EQUAL(szf,szs), \
159             BOOST_VMD_DETAIL_DATA_EQUAL_LOOP, \
160             BOOST_VMD_IDENTITY(0) \
161             ) \
162         (dataf,datas,szf,vtype) \
163         ) \
164 /**/
165 
166 #define BOOST_VMD_DETAIL_DATA_EQUAL_SZ_D(d,dataf,datas,szf,szs,vtype) \
167     BOOST_VMD_IDENTITY_RESULT \
168         ( \
169         BOOST_PP_IIF \
170             ( \
171             BOOST_PP_EQUAL_D(d,szf,szs), \
172             BOOST_VMD_DETAIL_DATA_EQUAL_LOOP_D, \
173             BOOST_VMD_IDENTITY(0) \
174             ) \
175         (d,dataf,datas,szf,vtype) \
176         ) \
177 /**/
178 
179 #define BOOST_VMD_DETAIL_DATA_EQUAL(dataf,datas,vtype) \
180     BOOST_VMD_DETAIL_DATA_EQUAL_SZ \
181         ( \
182         dataf, \
183         datas, \
184         BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
185         BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
186         vtype \
187         ) \
188 /**/
189 
190 #define BOOST_VMD_DETAIL_DATA_EQUAL_D(d,dataf,datas,vtype) \
191     BOOST_VMD_DETAIL_DATA_EQUAL_SZ_D \
192         ( \
193         d, \
194         dataf, \
195         datas, \
196         BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
197         BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
198         vtype \
199         ) \
200 /**/
201 
202 #endif /* BOOST_VMD_DETAIL_DATA_EQUAL_HPP */
203