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_TUPLE_HPP) 8 #define BOOST_VMD_DETAIL_TUPLE_HPP 9 10 #include <boost/preprocessor/comparison/equal.hpp> 11 #include <boost/preprocessor/control/iif.hpp> 12 #include <boost/preprocessor/punctuation/is_begin_parens.hpp> 13 #include <boost/preprocessor/tuple/size.hpp> 14 #include <boost/preprocessor/variadic/elem.hpp> 15 #include <boost/vmd/empty.hpp> 16 #include <boost/vmd/is_empty.hpp> 17 #include <boost/vmd/identity.hpp> 18 #include <boost/vmd/detail/empty_result.hpp> 19 #include <boost/vmd/detail/mods.hpp> 20 #include <boost/vmd/detail/parens.hpp> 21 22 #define BOOST_VMD_DETAIL_TUPLE_BST_CS(vseq) \ 23 BOOST_PP_EQUAL(BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_BEGIN_PARENS(vseq)),1) \ 24 /**/ 25 26 #define BOOST_VMD_DETAIL_TUPLE_BST_CS_D(d,vseq) \ 27 BOOST_PP_EQUAL_D(d,BOOST_PP_TUPLE_SIZE(BOOST_VMD_DETAIL_BEGIN_PARENS(vseq)),1) \ 28 /**/ 29 30 #define BOOST_VMD_DETAIL_TUPLE_BST(vseq) \ 31 BOOST_VMD_IDENTITY_RESULT \ 32 ( \ 33 BOOST_PP_IIF \ 34 ( \ 35 BOOST_PP_IS_BEGIN_PARENS(vseq), \ 36 BOOST_VMD_DETAIL_TUPLE_BST_CS, \ 37 BOOST_VMD_IDENTITY(0) \ 38 ) \ 39 (vseq) \ 40 ) \ 41 /**/ 42 43 #define BOOST_VMD_DETAIL_TUPLE_BST_D(d,vseq) \ 44 BOOST_VMD_IDENTITY_RESULT \ 45 ( \ 46 BOOST_PP_IIF \ 47 ( \ 48 BOOST_PP_IS_BEGIN_PARENS(vseq), \ 49 BOOST_VMD_DETAIL_TUPLE_BST_CS_D, \ 50 BOOST_VMD_IDENTITY(0) \ 51 ) \ 52 (d,vseq) \ 53 ) \ 54 /**/ 55 56 #define BOOST_VMD_DETAIL_TUPLE_BSEQ_NXT(vseq) \ 57 BOOST_VMD_DETAIL_TUPLE_BST(BOOST_VMD_DETAIL_AFTER_PARENS_DATA(vseq)) \ 58 /**/ 59 60 #define BOOST_VMD_DETAIL_TUPLE_BSEQ_NXT_D(d,vseq) \ 61 BOOST_VMD_DETAIL_TUPLE_BST_D(d,BOOST_VMD_DETAIL_AFTER_PARENS_DATA(vseq)) \ 62 /**/ 63 64 #define BOOST_VMD_DETAIL_TUPLE_BSEQ(vseq) \ 65 BOOST_VMD_IDENTITY_RESULT \ 66 ( \ 67 BOOST_PP_IIF \ 68 ( \ 69 BOOST_VMD_DETAIL_TUPLE_BST(vseq), \ 70 BOOST_VMD_DETAIL_TUPLE_BSEQ_NXT, \ 71 BOOST_VMD_IDENTITY(0) \ 72 ) \ 73 (vseq) \ 74 ) \ 75 /**/ 76 77 #define BOOST_VMD_DETAIL_TUPLE_BSEQ_D(d,vseq) \ 78 BOOST_VMD_IDENTITY_RESULT \ 79 ( \ 80 BOOST_PP_IIF \ 81 ( \ 82 BOOST_VMD_DETAIL_TUPLE_BST_D(d,vseq), \ 83 BOOST_VMD_DETAIL_TUPLE_BSEQ_NXT_D, \ 84 BOOST_VMD_IDENTITY(0) \ 85 ) \ 86 (d,vseq) \ 87 ) \ 88 /**/ 89 90 #define BOOST_VMD_DETAIL_TUPLE_SPLIT_CHK_SEQ(vseq) \ 91 BOOST_PP_IIF \ 92 ( \ 93 BOOST_VMD_DETAIL_TUPLE_BSEQ(vseq), \ 94 BOOST_VMD_DETAIL_EMPTY_RESULT, \ 95 BOOST_VMD_DETAIL_SPLIT_PARENS \ 96 ) \ 97 (vseq) \ 98 /**/ 99 100 #define BOOST_VMD_DETAIL_TUPLE_SPLIT_CHK_SEQ_D(d,vseq) \ 101 BOOST_PP_IIF \ 102 ( \ 103 BOOST_VMD_DETAIL_TUPLE_BSEQ_D(d,vseq), \ 104 BOOST_VMD_DETAIL_EMPTY_RESULT, \ 105 BOOST_VMD_DETAIL_SPLIT_PARENS \ 106 ) \ 107 (vseq) \ 108 /**/ 109 110 #define BOOST_VMD_DETAIL_TUPLE_SPLIT(vseq) \ 111 BOOST_PP_IIF \ 112 ( \ 113 BOOST_PP_IS_BEGIN_PARENS(vseq), \ 114 BOOST_VMD_DETAIL_TUPLE_SPLIT_CHK_SEQ, \ 115 BOOST_VMD_DETAIL_EMPTY_RESULT \ 116 ) \ 117 (vseq) \ 118 /**/ 119 120 #define BOOST_VMD_DETAIL_TUPLE_SPLIT_D(d,vseq) \ 121 BOOST_PP_IIF \ 122 ( \ 123 BOOST_PP_IS_BEGIN_PARENS(vseq), \ 124 BOOST_VMD_DETAIL_TUPLE_SPLIT_CHK_SEQ_D, \ 125 BOOST_VMD_DETAIL_EMPTY_RESULT \ 126 ) \ 127 (d,vseq) \ 128 /**/ 129 130 #define BOOST_VMD_DETAIL_TUPLE_PROCESS_CHK_SEQ(vseq) \ 131 BOOST_PP_IIF \ 132 ( \ 133 BOOST_VMD_DETAIL_TUPLE_BSEQ(vseq), \ 134 BOOST_VMD_EMPTY, \ 135 BOOST_VMD_DETAIL_BEGIN_PARENS \ 136 ) \ 137 (vseq) \ 138 /**/ 139 140 #define BOOST_VMD_DETAIL_TUPLE_PROCESS_CHK_SEQ_D(d,vseq) \ 141 BOOST_PP_IIF \ 142 ( \ 143 BOOST_VMD_DETAIL_TUPLE_BSEQ_D(d,vseq), \ 144 BOOST_VMD_EMPTY, \ 145 BOOST_VMD_DETAIL_BEGIN_PARENS \ 146 ) \ 147 (vseq) \ 148 /**/ 149 150 #define BOOST_VMD_DETAIL_TUPLE_PROCESS(vseq) \ 151 BOOST_PP_IIF \ 152 ( \ 153 BOOST_PP_IS_BEGIN_PARENS(vseq), \ 154 BOOST_VMD_DETAIL_TUPLE_PROCESS_CHK_SEQ, \ 155 BOOST_VMD_EMPTY \ 156 ) \ 157 (vseq) \ 158 /**/ 159 160 #define BOOST_VMD_DETAIL_TUPLE_PROCESS_D(d,vseq) \ 161 BOOST_PP_IIF \ 162 ( \ 163 BOOST_PP_IS_BEGIN_PARENS(vseq), \ 164 BOOST_VMD_DETAIL_TUPLE_PROCESS_CHK_SEQ_D, \ 165 BOOST_VMD_EMPTY \ 166 ) \ 167 (d,vseq) \ 168 /**/ 169 170 #define BOOST_VMD_DETAIL_TUPLE(...) \ 171 BOOST_PP_IIF \ 172 ( \ 173 BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \ 174 ( \ 175 BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \ 176 ), \ 177 BOOST_VMD_DETAIL_TUPLE_SPLIT, \ 178 BOOST_VMD_DETAIL_TUPLE_PROCESS \ 179 ) \ 180 (BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \ 181 /**/ 182 183 #define BOOST_VMD_DETAIL_TUPLE_D(d,...) \ 184 BOOST_PP_IIF \ 185 ( \ 186 BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \ 187 ( \ 188 BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \ 189 ), \ 190 BOOST_VMD_DETAIL_TUPLE_SPLIT_D, \ 191 BOOST_VMD_DETAIL_TUPLE_PROCESS_D \ 192 ) \ 193 (d,BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \ 194 /**/ 195 196 #endif /* BOOST_VMD_DETAIL_TUPLE_HPP */ 197