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_IS_ARRAY_COMMON_HPP) 8 #define BOOST_VMD_DETAIL_IS_ARRAY_COMMON_HPP 9 10 #include <boost/preprocessor/cat.hpp> 11 #include <boost/preprocessor/comparison/equal.hpp> 12 #include <boost/preprocessor/control/if.hpp> 13 #include <boost/preprocessor/control/iif.hpp> 14 #include <boost/preprocessor/facilities/empty.hpp> 15 #include <boost/preprocessor/tuple/elem.hpp> 16 #include <boost/preprocessor/tuple/size.hpp> 17 #include <boost/vmd/identity.hpp> 18 #include <boost/vmd/is_empty.hpp> 19 #include <boost/vmd/is_number.hpp> 20 #include <boost/vmd/is_tuple.hpp> 21 #include <boost/vmd/detail/is_empty_tuple.hpp> 22 23 #define BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(tuple) \ 24 BOOST_VMD_IDENTITY_RESULT \ 25 ( \ 26 BOOST_PP_IIF \ 27 ( \ 28 BOOST_PP_EQUAL(2,BOOST_PP_TUPLE_SIZE(tuple)), \ 29 BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM, \ 30 BOOST_VMD_IDENTITY(0) \ 31 ) \ 32 (tuple) \ 33 ) \ 34 /**/ 35 36 #define BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,tuple) \ 37 BOOST_VMD_IDENTITY_RESULT \ 38 ( \ 39 BOOST_PP_IIF \ 40 ( \ 41 BOOST_PP_EQUAL_D(d,2,BOOST_PP_TUPLE_SIZE(tuple)), \ 42 BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM_D, \ 43 BOOST_VMD_IDENTITY(0) \ 44 ) \ 45 (d,tuple) \ 46 ) \ 47 /**/ 48 49 /* 50 51 Check if the first element of the tuple is equal to the number of tuple elements of the second element 52 53 */ 54 55 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE(x) \ 56 BOOST_PP_EQUAL(BOOST_PP_TUPLE_ELEM(0,x),BOOST_PP_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,x))) \ 57 /**/ 58 59 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE_D(d,x) \ 60 BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_ELEM(0,x),BOOST_PP_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,x))) \ 61 /**/ 62 63 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY(tuple) \ 64 BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,tuple)) \ 65 /**/ 66 67 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY_D(d,tuple) \ 68 BOOST_VMD_DETAIL_IS_EMPTY_TUPLE_SIZE(BOOST_PP_TUPLE_ELEM(1,tuple)) \ 69 /**/ 70 71 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH(tuple) \ 72 BOOST_PP_IF \ 73 ( \ 74 BOOST_PP_TUPLE_ELEM(0,tuple), \ 75 BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE, \ 76 BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY \ 77 ) \ 78 (tuple) \ 79 /**/ 80 81 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_D(d,tuple) \ 82 BOOST_PP_IF \ 83 ( \ 84 BOOST_PP_TUPLE_ELEM(0,tuple), \ 85 BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_SIZE_D, \ 86 BOOST_VMD_DETAIL_IS_ARRAY_CHECK_EMPTY_D \ 87 ) \ 88 (d,tuple) \ 89 /**/ 90 91 /* 92 93 Check if the first element is numeric 94 95 */ 96 97 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC(tuple) \ 98 BOOST_VMD_IDENTITY_RESULT \ 99 ( \ 100 BOOST_PP_IIF \ 101 ( \ 102 BOOST_VMD_DETAIL_IS_ARRAY_NUM(BOOST_PP_TUPLE_ELEM(0,tuple)), \ 103 BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH, \ 104 BOOST_VMD_IDENTITY(0) \ 105 ) \ 106 (tuple) \ 107 ) \ 108 /**/ 109 110 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_D(d,tuple) \ 111 BOOST_VMD_IDENTITY_RESULT \ 112 ( \ 113 BOOST_PP_IIF \ 114 ( \ 115 BOOST_VMD_DETAIL_IS_ARRAY_NUM(BOOST_PP_TUPLE_ELEM(0,tuple)), \ 116 BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_MATCH_D, \ 117 BOOST_VMD_IDENTITY(0) \ 118 ) \ 119 (d,tuple) \ 120 ) \ 121 /**/ 122 123 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER(tuple) \ 124 BOOST_VMD_IDENTITY_RESULT \ 125 ( \ 126 BOOST_PP_IIF \ 127 ( \ 128 BOOST_VMD_IS_NUMBER(BOOST_PP_TUPLE_ELEM(0,tuple)), \ 129 BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC, \ 130 BOOST_VMD_IDENTITY(0) \ 131 ) \ 132 (tuple) \ 133 ) \ 134 /**/ 135 136 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER_D(d,tuple) \ 137 BOOST_VMD_IDENTITY_RESULT \ 138 ( \ 139 BOOST_PP_IIF \ 140 ( \ 141 BOOST_VMD_IS_NUMBER(BOOST_PP_TUPLE_ELEM(0,tuple)), \ 142 BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMERIC_D, \ 143 BOOST_VMD_IDENTITY(0) \ 144 ) \ 145 (d,tuple) \ 146 ) \ 147 /**/ 148 149 /* 150 151 Check if the second element is a tuple 152 153 */ 154 155 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM(tuple) \ 156 BOOST_VMD_IDENTITY_RESULT \ 157 ( \ 158 BOOST_PP_IIF \ 159 ( \ 160 BOOST_VMD_IS_TUPLE(BOOST_PP_TUPLE_ELEM(1,tuple)), \ 161 BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER, \ 162 BOOST_VMD_IDENTITY(0) \ 163 ) \ 164 (tuple) \ 165 ) \ 166 /**/ 167 168 #define BOOST_VMD_DETAIL_IS_ARRAY_CHECK_ARRAY_FORM_D(d,tuple) \ 169 BOOST_VMD_IDENTITY_RESULT \ 170 ( \ 171 BOOST_PP_IIF \ 172 ( \ 173 BOOST_VMD_IS_TUPLE(BOOST_PP_TUPLE_ELEM(1,tuple)), \ 174 BOOST_VMD_DETAIL_IS_ARRAY_CHECK_NUMBER_D, \ 175 BOOST_VMD_IDENTITY(0) \ 176 ) \ 177 (d,tuple) \ 178 ) \ 179 /**/ 180 181 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM(x) BOOST_VMD_IS_EMPTY(BOOST_PP_CAT(BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_, x) BOOST_PP_EMPTY()) 182 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_0 183 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_1 184 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_2 185 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_3 186 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_4 187 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_5 188 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_6 189 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_7 190 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_8 191 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_9 192 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_10 193 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_11 194 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_12 195 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_13 196 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_14 197 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_15 198 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_16 199 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_17 200 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_18 201 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_19 202 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_20 203 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_21 204 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_22 205 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_23 206 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_24 207 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_25 208 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_26 209 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_27 210 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_28 211 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_29 212 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_30 213 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_31 214 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_32 215 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_33 216 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_34 217 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_35 218 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_36 219 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_37 220 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_38 221 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_39 222 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_40 223 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_41 224 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_42 225 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_43 226 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_44 227 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_45 228 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_46 229 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_47 230 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_48 231 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_49 232 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_50 233 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_51 234 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_52 235 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_53 236 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_54 237 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_55 238 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_56 239 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_57 240 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_58 241 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_59 242 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_60 243 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_61 244 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_62 245 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_63 246 #define BOOST_VMD_DETAIL_IS_ARRAY_NUM_HELPER_64 247 248 #endif /* BOOST_VMD_DETAIL_IS_ARRAY_COMMON_HPP */ 249