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