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_SEQUENCE_TYPE_HPP) 8 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_HPP 9 10 #include <boost/preprocessor/comparison/equal.hpp> 11 #include <boost/preprocessor/control/iif.hpp> 12 #include <boost/preprocessor/tuple/elem.hpp> 13 #include <boost/preprocessor/variadic/elem.hpp> 14 #include <boost/preprocessor/variadic/size.hpp> 15 #include <boost/vmd/identity.hpp> 16 #include <boost/vmd/is_empty.hpp> 17 #include <boost/vmd/detail/equal_type.hpp> 18 #include <boost/vmd/detail/is_array_common.hpp> 19 #include <boost/vmd/detail/is_list.hpp> 20 #include <boost/vmd/detail/modifiers.hpp> 21 #include <boost/vmd/detail/mods.hpp> 22 #include <boost/vmd/detail/sequence_elem.hpp> 23 24 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY(dtuple) \ 25 BOOST_PP_IIF \ 26 ( \ 27 BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(BOOST_PP_TUPLE_ELEM(1,dtuple)), \ 28 BOOST_VMD_TYPE_ARRAY, \ 29 BOOST_VMD_TYPE_TUPLE \ 30 ) \ 31 /**/ 32 33 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY_D(d,dtuple) \ 34 BOOST_PP_IIF \ 35 ( \ 36 BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,BOOST_PP_TUPLE_ELEM(1,dtuple)), \ 37 BOOST_VMD_TYPE_ARRAY, \ 38 BOOST_VMD_TYPE_TUPLE \ 39 ) \ 40 /**/ 41 42 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST(dtuple) \ 43 BOOST_PP_IIF \ 44 ( \ 45 BOOST_VMD_DETAIL_IS_LIST(BOOST_PP_TUPLE_ELEM(1,dtuple)), \ 46 BOOST_VMD_TYPE_LIST, \ 47 BOOST_VMD_TYPE_TUPLE \ 48 ) \ 49 /**/ 50 51 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST_D(d,dtuple) \ 52 BOOST_PP_IIF \ 53 ( \ 54 BOOST_VMD_DETAIL_IS_LIST_D(d,BOOST_PP_TUPLE_ELEM(1,dtuple)), \ 55 BOOST_VMD_TYPE_LIST, \ 56 BOOST_VMD_TYPE_TUPLE \ 57 ) \ 58 /**/ 59 60 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH(dtuple) \ 61 BOOST_VMD_IDENTITY_RESULT \ 62 ( \ 63 BOOST_PP_IIF \ 64 ( \ 65 BOOST_VMD_DETAIL_EQUAL_TYPE \ 66 ( \ 67 BOOST_VMD_TYPE_TUPLE, \ 68 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST(dtuple) \ 69 ), \ 70 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY, \ 71 BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST) \ 72 ) \ 73 (dtuple) \ 74 ) \ 75 /**/ 76 77 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH_D(d,dtuple) \ 78 BOOST_VMD_IDENTITY_RESULT \ 79 ( \ 80 BOOST_PP_IIF \ 81 ( \ 82 BOOST_VMD_DETAIL_EQUAL_TYPE_D \ 83 ( \ 84 d, \ 85 BOOST_VMD_TYPE_TUPLE, \ 86 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST_D(d,dtuple) \ 87 ), \ 88 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY_D, \ 89 BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST) \ 90 ) \ 91 (d,dtuple) \ 92 ) \ 93 /**/ 94 95 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS(dtuple,rtype) \ 96 BOOST_VMD_IDENTITY_RESULT \ 97 ( \ 98 BOOST_PP_IIF \ 99 ( \ 100 BOOST_PP_EQUAL(rtype,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY), \ 101 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY, \ 102 BOOST_PP_IIF \ 103 ( \ 104 BOOST_PP_EQUAL(rtype,BOOST_VMD_DETAIL_MODS_RETURN_LIST), \ 105 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST, \ 106 BOOST_PP_IIF \ 107 ( \ 108 BOOST_PP_EQUAL(rtype,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE), \ 109 BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)), \ 110 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH \ 111 ) \ 112 ) \ 113 ) \ 114 ) \ 115 (dtuple) \ 116 /**/ 117 118 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS_D(d,dtuple,rtype) \ 119 BOOST_VMD_IDENTITY_RESULT \ 120 ( \ 121 BOOST_PP_IIF \ 122 ( \ 123 BOOST_PP_EQUAL_D(d,rtype,BOOST_VMD_DETAIL_MODS_RETURN_ARRAY), \ 124 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_ARRAY_D, \ 125 BOOST_PP_IIF \ 126 ( \ 127 BOOST_PP_EQUAL_D(d,rtype,BOOST_VMD_DETAIL_MODS_RETURN_LIST), \ 128 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_LIST_D, \ 129 BOOST_PP_IIF \ 130 ( \ 131 BOOST_PP_EQUAL_D(d,rtype,BOOST_VMD_DETAIL_MODS_RETURN_TUPLE), \ 132 BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)), \ 133 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_BOTH_D \ 134 ) \ 135 ) \ 136 ) \ 137 ) \ 138 (d,dtuple) \ 139 /**/ 140 141 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE(dtuple,...) \ 142 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS \ 143 ( \ 144 dtuple, \ 145 BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE \ 146 ( \ 147 BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_ALL,__VA_ARGS__) \ 148 ) \ 149 ) \ 150 /**/ 151 152 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE_D(d,dtuple,...) \ 153 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MODS_D \ 154 ( \ 155 d, \ 156 dtuple, \ 157 BOOST_VMD_DETAIL_MODS_RESULT_RETURN_TYPE \ 158 ( \ 159 BOOST_VMD_DETAIL_NEW_MODS_D(d,BOOST_VMD_ALLOW_ALL,__VA_ARGS__) \ 160 ) \ 161 ) \ 162 /**/ 163 164 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY(dtuple,...) \ 165 BOOST_VMD_IDENTITY_RESULT \ 166 ( \ 167 BOOST_PP_IIF \ 168 ( \ 169 BOOST_VMD_DETAIL_EQUAL_TYPE(BOOST_VMD_TYPE_TUPLE,BOOST_PP_TUPLE_ELEM(0,dtuple)), \ 170 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE, \ 171 BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)) \ 172 ) \ 173 (dtuple,__VA_ARGS__) \ 174 ) \ 175 /**/ 176 177 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY_D(d,dtuple,...) \ 178 BOOST_VMD_IDENTITY_RESULT \ 179 ( \ 180 BOOST_PP_IIF \ 181 ( \ 182 BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,BOOST_VMD_TYPE_TUPLE,BOOST_PP_TUPLE_ELEM(0,dtuple)), \ 183 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_MORE_D, \ 184 BOOST_VMD_IDENTITY(BOOST_PP_TUPLE_ELEM(0,dtuple)) \ 185 ) \ 186 (d,dtuple,__VA_ARGS__) \ 187 ) \ 188 /**/ 189 190 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE(tuple,...) \ 191 BOOST_VMD_IDENTITY_RESULT \ 192 ( \ 193 BOOST_PP_IIF \ 194 ( \ 195 BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)), \ 196 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY, \ 197 BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_SEQUENCE) \ 198 ) \ 199 (BOOST_PP_TUPLE_ELEM(0,tuple),__VA_ARGS__) \ 200 ) \ 201 /**/ 202 203 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE_D(d,tuple,...) \ 204 BOOST_VMD_IDENTITY_RESULT \ 205 ( \ 206 BOOST_PP_IIF \ 207 ( \ 208 BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(1,tuple)), \ 209 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_UNARY_D, \ 210 BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_SEQUENCE) \ 211 ) \ 212 (d,BOOST_PP_TUPLE_ELEM(0,tuple),__VA_ARGS__) \ 213 ) \ 214 /**/ 215 216 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE(tuple,...) \ 217 BOOST_VMD_IDENTITY_RESULT \ 218 ( \ 219 BOOST_PP_IIF \ 220 ( \ 221 BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \ 222 BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_EMPTY), \ 223 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE \ 224 ) \ 225 (tuple,__VA_ARGS__) \ 226 ) \ 227 /**/ 228 229 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_D(d,tuple,...) \ 230 BOOST_VMD_IDENTITY_RESULT \ 231 ( \ 232 BOOST_PP_IIF \ 233 ( \ 234 BOOST_VMD_IS_EMPTY(BOOST_PP_TUPLE_ELEM(0,tuple)), \ 235 BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_EMPTY), \ 236 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_SEQUENCE_D \ 237 ) \ 238 (d,tuple,__VA_ARGS__) \ 239 ) \ 240 /**/ 241 242 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE(...) \ 243 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE \ 244 ( \ 245 BOOST_VMD_DETAIL_SEQUENCE_ELEM \ 246 ( \ 247 BOOST_VMD_ALLOW_ALL, \ 248 0, \ 249 BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \ 250 BOOST_VMD_RETURN_AFTER, \ 251 BOOST_VMD_RETURN_TYPE_TUPLE \ 252 ), \ 253 __VA_ARGS__ \ 254 ) \ 255 /**/ 256 257 #define BOOST_VMD_DETAIL_SEQUENCE_TYPE_D(d,...) \ 258 BOOST_VMD_DETAIL_SEQUENCE_TYPE_TUPLE_D \ 259 ( \ 260 d, \ 261 BOOST_VMD_DETAIL_SEQUENCE_ELEM_D \ 262 ( \ 263 d, \ 264 BOOST_VMD_ALLOW_ALL, \ 265 0, \ 266 BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__), \ 267 BOOST_VMD_RETURN_AFTER, \ 268 BOOST_VMD_RETURN_TYPE_TUPLE \ 269 ), \ 270 __VA_ARGS__ \ 271 ) \ 272 /**/ 273 274 #endif /* BOOST_VMD_DETAIL_SEQUENCE_TYPE_HPP */ 275