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