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