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_ADJUST_TUPLE_TYPE_HPP)
8 #define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_HPP
9 
10 #include <boost/preprocessor/control/iif.hpp>
11 #include <boost/vmd/identity.hpp>
12 #include <boost/vmd/detail/equal_type.hpp>
13 #include <boost/vmd/detail/is_array_common.hpp>
14 #include <boost/vmd/detail/is_list.hpp>
15 #include <boost/vmd/detail/type_registration.hpp>
16 
17 #define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_ARRAY(data,type) \
18     BOOST_PP_IIF \
19         ( \
20         BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX(data), \
21         BOOST_VMD_TYPE_ARRAY, \
22         type \
23         ) \
24 /**/
25 
26 #define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_ARRAY_D(d,data,type) \
27     BOOST_PP_IIF \
28         ( \
29         BOOST_VMD_DETAIL_IS_ARRAY_SYNTAX_D(d,data), \
30         BOOST_VMD_TYPE_ARRAY, \
31         type \
32         ) \
33 /**/
34 
35 #define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_LIST(data,type) \
36     BOOST_VMD_IDENTITY_RESULT \
37         ( \
38         BOOST_PP_IIF \
39             ( \
40             BOOST_VMD_DETAIL_IS_LIST_WLOOP(data), \
41             BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST), \
42             BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_ARRAY \
43             ) \
44         (data,type) \
45         ) \
46 /**/
47 
48 #define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_LIST_D(d,data,type) \
49     BOOST_VMD_IDENTITY_RESULT \
50         ( \
51         BOOST_PP_IIF \
52             ( \
53             BOOST_VMD_DETAIL_IS_LIST_WLOOP_D(d,data), \
54             BOOST_VMD_IDENTITY(BOOST_VMD_TYPE_LIST), \
55             BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_ARRAY_D \
56             ) \
57         (d,data,type) \
58         ) \
59 /**/
60 
61 /*
62 
63   Input is any VMD data and a VMD type for that data
64 
65   If the type is a tuple, checks to see if it is a more specific
66   type and, if it is, returns that type,
67   otherwise returns the type passed as a parameter
68 
69 */
70 
71 #define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE(data,type) \
72     BOOST_VMD_IDENTITY_RESULT \
73         ( \
74         BOOST_PP_IIF \
75             ( \
76             BOOST_VMD_DETAIL_EQUAL_TYPE(BOOST_VMD_TYPE_TUPLE,type), \
77             BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_LIST, \
78             BOOST_VMD_IDENTITY(type) \
79             ) \
80         (data,type) \
81         ) \
82 /**/
83 
84 #define BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_D(d,data,type) \
85     BOOST_VMD_IDENTITY_RESULT \
86         ( \
87         BOOST_PP_IIF \
88             ( \
89             BOOST_VMD_DETAIL_EQUAL_TYPE_D(d,BOOST_VMD_TYPE_TUPLE,type), \
90             BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_CHECK_LIST_D, \
91             BOOST_VMD_IDENTITY(type) \
92             ) \
93         (d,data,type) \
94         ) \
95 /**/
96 
97 #endif /* BOOST_VMD_DETAIL_ADJUST_TUPLE_TYPE_HPP */
98