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_7_HPP) 8 #define BOOST_VMD_DETAIL_EQUAL_7_HPP 9 10 #include <boost/vmd/detail/recurse/equal/equal_headers.hpp> 11 12 #define BOOST_VMD_DETAIL_EQUAL_7_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_7, \ 29 BOOST_VMD_DETAIL_EQUAL_CNI_SMP \ 30 ) \ 31 (vseq1,vseq2,vtype) \ 32 /**/ 33 34 #define BOOST_VMD_DETAIL_EQUAL_7_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_7_D, \ 51 BOOST_VMD_DETAIL_EQUAL_CNI_SMP_D \ 52 ) \ 53 (d,vseq1,vseq2,vtype) \ 54 /**/ 55 56 #define BOOST_VMD_DETAIL_EQUAL_7_VSEQ(vseq1,vseq2,vtype) \ 57 BOOST_VMD_DETAIL_DATA_EQUAL_7 \ 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_7_VSEQ_D(d,vseq1,vseq2,vtype) \ 66 BOOST_VMD_DETAIL_DATA_EQUAL_7_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_7_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_7_VSEQ, \ 84 BOOST_VMD_DETAIL_EQUAL_7_CNI_CHK \ 85 ) \ 86 (vseq1,vseq2,vtype) \ 87 /**/ 88 89 #define BOOST_VMD_DETAIL_EQUAL_7_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_7_VSEQ_D, \ 99 BOOST_VMD_DETAIL_EQUAL_7_CNI_CHK_D \ 100 ) \ 101 (d,vseq1,vseq2,vtype) \ 102 /**/ 103 104 #define BOOST_VMD_DETAIL_EQUAL_7_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_7_CNI, \ 115 BOOST_VMD_IDENTITY(0) \ 116 ) \ 117 (vseq1,vseq2,vtype1) \ 118 ) \ 119 /**/ 120 121 #define BOOST_VMD_DETAIL_EQUAL_7_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_7_CNI_D, \ 133 BOOST_VMD_IDENTITY(0) \ 134 ) \ 135 (d,vseq1,vseq2,vtype1) \ 136 ) \ 137 /**/ 138 139 #define BOOST_VMD_DETAIL_EQUAL_7_WT_CONVERT(vseq1,vseq2,vtype1,vtype2) \ 140 BOOST_VMD_DETAIL_EQUAL_7_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_7_WT_CONVERT_D(d,vseq1,vseq2,vtype1,vtype2) \ 150 BOOST_VMD_DETAIL_EQUAL_7_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_7_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_7_WT_CONVERT \ 168 ) \ 169 (vseq1,vseq2,vtype1,vtype2) \ 170 ) \ 171 /**/ 172 173 #define BOOST_VMD_DETAIL_EQUAL_7_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_7_WT_CONVERT_D \ 181 ) \ 182 (d,vseq1,vseq2,vtype1,vtype2) \ 183 ) \ 184 /**/ 185 186 #define BOOST_VMD_DETAIL_EQUAL_7_GTYPE(vseq1,vseq2) \ 187 BOOST_VMD_DETAIL_EQUAL_7_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_7_GTYPE_D(d,vseq1,vseq2) \ 197 BOOST_VMD_DETAIL_EQUAL_7_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_7_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_7_GTYPE, \ 218 BOOST_VMD_IDENTITY(0) \ 219 ) \ 220 (vseq1,vseq2) \ 221 ) \ 222 /**/ 223 224 #define BOOST_VMD_DETAIL_EQUAL_7_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_7_GTYPE_D, \ 235 BOOST_VMD_IDENTITY(0) \ 236 ) \ 237 (d,vseq1,vseq2) \ 238 ) \ 239 /**/ 240 241 #define BOOST_VMD_DETAIL_EQUAL_7_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_7_EBP \ 247 ) \ 248 (vseq1,vseq2,be1,be2) \ 249 /**/ 250 251 #define BOOST_VMD_DETAIL_EQUAL_7_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_7_EBP_D \ 257 ) \ 258 (d,vseq1,vseq2,be1,be2) \ 259 /**/ 260 261 #define BOOST_VMD_DETAIL_EQUAL_7(vseq1,vseq2) \ 262 BOOST_VMD_DETAIL_EQUAL_7_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_7_D(d,vseq1,vseq2) \ 272 BOOST_VMD_DETAIL_EQUAL_7_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_7_HPP */ 283