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).
7 #if !defined(BOOST_VMD_DETAIL_ARRAY_HPP)
8 #define BOOST_VMD_DETAIL_ARRAY_HPP
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>
22 #define BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY(tuple) \
23 BOOST_VMD_IDENTITY_RESULT \
27 BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX \
35 BOOST_VMD_IDENTITY(tuple), \
36 BOOST_VMD_DETAIL_EMPTY_RESULT \
42 #define BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY_D(d,tuple) \
43 BOOST_VMD_IDENTITY_RESULT \
47 BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D \
56 BOOST_VMD_IDENTITY(tuple), \
57 BOOST_VMD_DETAIL_EMPTY_RESULT \
63 #define BOOST_VMD_DETAIL_ARRAY_PROCESS(tuple) \
74 BOOST_VMD_DETAIL_EMPTY_RESULT, \
75 BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY \
80 #define BOOST_VMD_DETAIL_ARRAY_PROCESS_D(d,tuple) \
91 BOOST_VMD_DETAIL_EMPTY_RESULT, \
92 BOOST_VMD_DETAIL_ARRAY_CHECK_FOR_ARRAY_D \
97 #define BOOST_VMD_DETAIL_ARRAY_SPLIT(param) \
98 BOOST_VMD_DETAIL_ARRAY_PROCESS \
100 BOOST_VMD_DETAIL_TUPLE(param,BOOST_VMD_RETURN_AFTER) \
104 #define BOOST_VMD_DETAIL_ARRAY_SPLIT_D(d,param) \
105 BOOST_VMD_DETAIL_ARRAY_PROCESS_D \
108 BOOST_VMD_DETAIL_TUPLE_D(d,param,BOOST_VMD_RETURN_AFTER) \
112 #define BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY(tuple) \
115 BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(tuple), \
120 #define BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY_D(d,tuple) \
123 BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,tuple), \
128 #define BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE(tuple) \
131 BOOST_VMD_IS_EMPTY(tuple), \
133 BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY \
138 #define BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE_D(d,tuple) \
141 BOOST_VMD_IS_EMPTY(tuple), \
143 BOOST_VMD_DETAIL_ARRAY_BEGIN_CHECK_FOR_ARRAY_D \
148 #define BOOST_VMD_DETAIL_ARRAY_BEGIN(param) \
149 BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE \
151 BOOST_VMD_DETAIL_TUPLE(param) \
155 #define BOOST_VMD_DETAIL_ARRAY_BEGIN_D(d,param) \
156 BOOST_VMD_DETAIL_ARRAY_BEGIN_TUPLE_D \
159 BOOST_VMD_DETAIL_TUPLE_D(d,param) \
163 #define BOOST_VMD_DETAIL_ARRAY(...) \
166 BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
168 BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
170 BOOST_VMD_DETAIL_ARRAY_SPLIT, \
171 BOOST_VMD_DETAIL_ARRAY_BEGIN \
173 (BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
176 #define BOOST_VMD_DETAIL_ARRAY_D(d,...) \
179 BOOST_VMD_DETAIL_MODS_IS_RESULT_AFTER \
181 BOOST_VMD_DETAIL_NEW_MODS(BOOST_VMD_ALLOW_AFTER,__VA_ARGS__) \
183 BOOST_VMD_DETAIL_ARRAY_SPLIT_D, \
184 BOOST_VMD_DETAIL_ARRAY_BEGIN_D \
186 (d,BOOST_PP_VARIADIC_ELEM(0,__VA_ARGS__)) \
189 #endif /* BOOST_VMD_DETAIL_ARRAY_HPP */