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_ARRAY_HPP) 8 #define BOOST_VMD_DETAIL_ARRAY_HPP 9 10 #include <boost/preprocessor/control/expr_iif.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/vmd/empty.hpp> 15 #include <boost/vmd/identity.hpp> 16 #include <boost/vmd/is_empty.hpp> 17 #include <boost/vmd/detail/empty_result.hpp> 18 #include <boost/vmd/detail/is_array_common.hpp> 19 #include <boost/vmd/detail/mods.hpp> 20 #include <boost/vmd/detail/tuple.hpp> 21 22 #define BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY(tuple) \ 23 BOOST_VMD_IDENTITY_RESULT \ 24 ( \ 25 BOOST_PP_IIF \ 26 ( \ 27 BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX \ 28 ( \ 29 BOOST_PP_TUPLE_ELEM \ 30 ( \ 31 0, \ 32 tuple \ 33 ) \ 34 ), \ 35 BOOST_VMD_IDENTITY(tuple), \ 36 BOOST_VMD_DETAIL_EMPTY_RESULT \ 37 ) \ 38 (tuple) \ 39 ) \ 40 /**/ 41 42 #define BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY_D(d,tuple) \ 43 BOOST_VMD_IDENTITY_RESULT \ 44 ( \ 45 BOOST_PP_IIF \ 46 ( \ 47 BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D \ 48 ( \ 49 d, \ 50 BOOST_PP_TUPLE_ELEM \ 51 ( \ 52 0, \ 53 tuple \ 54 ) \ 55 ), \ 56 BOOST_VMD_IDENTITY(tuple), \ 57 BOOST_VMD_DETAIL_EMPTY_RESULT \ 58 ) \ 59 (tuple) \ 60 ) \ 61 /**/ 62 63 #define BOOST_VMD_DETAIL_ARRAY_PROCESS(tuple) \ 64 BOOST_PP_IIF \ 65 ( \ 66 BOOST_VMD_IS_EMPTY \ 67 ( \ 68 BOOST_PP_TUPLE_ELEM \ 69 ( \ 70 0, \ 71 tuple \ 72 ) \ 73 ), \ 74 BOOST_VMD_DETAIL_EMPTY_RESULT, \ 75 BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY \ 76 ) \ 77 (tuple) \ 78 /**/ 79 80 #define BOOST_VMD_DETAIL_ARRAY_PROCESS_D(d,tuple) \ 81 BOOST_PP_IIF \ 82 ( \ 83 BOOST_VMD_IS_EMPTY \ 84 ( \ 85 BOOST_PP_TUPLE_ELEM \ 86 ( \ 87 0, \ 88 tuple \ 89 ) \ 90 ), \ 91 BOOST_VMD_DETAIL_EMPTY_RESULT, \ 92 BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY_D \ 93 ) \ 94 (d,tuple) \ 95 /**/ 96 97 #define BOOST_VMD_DETAIL_ARRAY_SPLIT(param) \ 98 BOOST_VMD_DETAIL_ARRAY_PROCESS \ 99 ( \ 100 BOOST_VMD_DETAIL_TUPLE(param,BOOST_VMD_RETURN_AFTER) \ 101 ) \ 102 /**/ 103 104 #define BOOST_VMD_DETAIL_ARRAY_SPLIT_D(d,param) \ 105 BOOST_VMD_DETAIL_ARRAY_PROCESS_D \ 106 ( \ 107 d, \ 108 BOOST_VMD_DETAIL_TUPLE_D(d,param,BOOST_VMD_RETURN_AFTER) \ 109 ) \ 110 /**/ 111 112 #define BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY(tuple) \ 113 BOOST_PP_EXPR_IIF \ 114 ( \ 115 BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(tuple), \ 116 tuple \ 117 ) \ 118 /**/ 119 120 #define BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY_D(d,tuple) \ 121 BOOST_PP_EXPR_IIF \ 122 ( \ 123 BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,tuple), \ 124 tuple \ 125 ) \ 126 /**/ 127 128 #define BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE(tuple) \ 129 BOOST_PP_IIF \ 130 ( \ 131 BOOST_VMD_IS_EMPTY(tuple), \ 132 BOOST_VMD_EMPTY, \ 133 BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY \ 134 ) \ 135 (tuple) \ 136 /**/ 137 138 #define BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE_D(d,tuple) \ 139 BOOST_PP_IIF \ 140 ( \ 141 BOOST_VMD_IS_EMPTY(tuple), \ 142 BOOST_VMD_EMPTY, \ 143 BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY_D \ 144 ) \ 145 (d,tuple) \ 146 /**/ 147 148 #define BOOST_VMD_DETAIL_ARRAY_BEGIN(param) \ 149 BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE \ 150 ( \ 151 BOOST_VMD_DETAIL_TUPLE(param) \ 152 ) \ 153 /**/ 154 155 #define BOOST_VMD_DETAIL_ARRAY_BEGIN_D(d,param) \ 156 BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE_D \ 157 ( \ 158 d, \ 159 BOOST_VMD_DETAIL_TUPLE_D(d,param) \ 160 ) \ 161 /**/ 162 163 #define BOOST_VMD_DETAIL_ARRAY(...) \ 164 BOOST_PP_IIF \ 165 ( \ 166 BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \ 167 ( \ 168 BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \ 169 ), \ 170 BOOST_VMD_DETAIL_ARRAY_SPLIT, \ 171 BOOST_VMD_DETAIL_ARRAY_BEGIN \ 172 ) \ 173 (BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \ 174 /**/ 175 176 #define BOOST_VMD_DETAIL_ARRAY_D(d,...) \ 177 BOOST_PP_IIF \ 178 ( \ 179 BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \ 180 ( \ 181 BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \ 182 ), \ 183 BOOST_VMD_DETAIL_ARRAY_SPLIT_D, \ 184 BOOST_VMD_DETAIL_ARRAY_BEGIN_D \ 185 ) \ 186 (d,BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \ 187 /**/ 188 189 #endif /* BOOST_VMD_DETAIL_ARRAY_HPP */ 190