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