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_16_HPP)
8 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_HPP
9 
10 #include <boost/vmd/detail/recurse/data_equal/data_equal_headers.hpp>
11 
12 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_PARENS(d,em1,em2) \
13     BOOST_VMD_IDENTITY_RESULT \
14         ( \
15         BOOST_PP_IIF \
16             ( \
17             BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
18             BOOST_VMD_IDENTITY(2), \
19             BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
20             ) \
21         (d,em1,em2) \
22         ) \
23 /**/
24 
25 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_PARENS_D(d,em1,em2) \
26     BOOST_VMD_IDENTITY_RESULT \
27         ( \
28         BOOST_PP_IIF \
29             ( \
30             BOOST_VMD_DETAIL_DATA_EQUAL_IS_BOTH_COMPOSITE(em1,em2), \
31             BOOST_VMD_IDENTITY(2), \
32             BOOST_VMD_DETAIL_EQUAL_SIMPLE_D \
33             ) \
34         (d,em1,em2) \
35         ) \
36 /**/
37 
38 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP(d,state,em1,em2) \
39     BOOST_PP_IIF \
40         ( \
41         BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
42         BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
43         BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_PARENS \
44         ) \
45     (d,em1,em2) \
46 /**/
47 
48 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_D(d,state,em1,em2) \
49     BOOST_PP_IIF \
50         ( \
51         BOOST_VMD_DETAIL_DATA_EQUAL_STATE_COMP_PROCESSING(d,state), \
52         BOOST_VMD_DETAIL_EQUAL_SIMPLE_D, \
53         BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_PARENS_D \
54         ) \
55     (d,em1,em2) \
56 /**/
57 
58 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ(d,state) \
59     BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP \
60         ( \
61         d, \
62         state, \
63         BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
64         BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
65         ) \
66 /**/
67 
68 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_D(d,state) \
69     BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_CMP_D \
70         ( \
71         d, \
72         state, \
73         BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_FIRST_ELEMENT(d,state), \
74         BOOST_VMD_DETAIL_DATA_EQUAL_STATE_GET_SECOND_ELEMENT(d,state) \
75         ) \
76 /**/
77 
78 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP(d,state) \
79     BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
80         ( \
81         d, \
82         state, \
83         BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ(d,state) \
84         ) \
85 /**/
86 
87 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_D(d,state) \
88     BOOST_VMD_DETAIL_DATA_EQUAL_OP_RESULT \
89         ( \
90         d, \
91         state, \
92         BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_TEQ_D(d,state) \
93         ) \
94 /**/
95 
96 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_LOOP(dataf,datas,sz,vtype) \
97     BOOST_PP_TUPLE_ELEM \
98         ( \
99         0, \
100         BOOST_PP_WHILE \
101             ( \
102             BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
103             BOOST_VMD_DETAIL_DATA_EQUAL_16_OP, \
104                 ( \
105                 1, \
106                 dataf, \
107                 datas, \
108                 sz, \
109                 vtype, \
110                 0, \
111                 ) \
112             ) \
113         ) \
114 /**/
115 
116 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_LOOP_D(d,dataf,datas,sz,vtype) \
117     BOOST_PP_TUPLE_ELEM \
118         ( \
119         0, \
120         BOOST_PP_WHILE_ ## d \
121             ( \
122             BOOST_VMD_DETAIL_DATA_EQUAL_PRED, \
123             BOOST_VMD_DETAIL_DATA_EQUAL_16_OP_D, \
124                 ( \
125                 1, \
126                 dataf, \
127                 datas, \
128                 sz, \
129                 vtype, \
130                 0, \
131                 ) \
132             ) \
133         ) \
134 /**/
135 
136 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_SZ(dataf,datas,szf,szs,vtype) \
137     BOOST_VMD_IDENTITY_RESULT \
138         ( \
139         BOOST_PP_IIF \
140             ( \
141             BOOST_PP_EQUAL(szf,szs), \
142             BOOST_VMD_DETAIL_DATA_EQUAL_16_LOOP, \
143             BOOST_VMD_IDENTITY(0) \
144             ) \
145         (dataf,datas,szf,vtype) \
146         ) \
147 /**/
148 
149 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_SZ_D(d,dataf,datas,szf,szs,vtype) \
150     BOOST_VMD_IDENTITY_RESULT \
151         ( \
152         BOOST_PP_IIF \
153             ( \
154             BOOST_PP_EQUAL_D(d,szf,szs), \
155             BOOST_VMD_DETAIL_DATA_EQUAL_16_LOOP_D, \
156             BOOST_VMD_IDENTITY(0) \
157             ) \
158         (d,dataf,datas,szf,vtype) \
159         ) \
160 /**/
161 
162 #define BOOST_VMD_DETAIL_DATA_EQUAL_16(dataf,datas,vtype) \
163     BOOST_VMD_DETAIL_DATA_EQUAL_16_SZ \
164         ( \
165         dataf, \
166         datas, \
167         BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(dataf,vtype), \
168         BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE(datas,vtype), \
169         vtype \
170         ) \
171 /**/
172 
173 #define BOOST_VMD_DETAIL_DATA_EQUAL_16_D(d,dataf,datas,vtype) \
174     BOOST_VMD_DETAIL_DATA_EQUAL_16_SZ_D \
175         ( \
176         d, \
177         dataf, \
178         datas, \
179         BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,dataf,vtype), \
180         BOOST_VMD_DETAIL_DATA_EQUAL_GET_SIZE_D(d,datas,vtype), \
181         vtype \
182         ) \
183 /**/
184 
185 #endif /* BOOST_VMD_DETAIL_DATA_EQUAL_16_HPP */
186