comparison DEPENDENCIES/generic/include/boost/tti/detail/dtemplate_params.hpp @ 16:2665513ce2d3

Add boost headers
author Chris Cannam
date Tue, 05 Aug 2014 11:11:38 +0100
parents
children c530137014c0
comparison
equal deleted inserted replaced
15:663ca0da4350 16:2665513ce2d3
1
2 // (C) Copyright Edward Diener 2011,2012,2013
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_TTI_DETAIL_TEMPLATE_PARAMS_HPP)
8 #define BOOST_TTI_DETAIL_TEMPLATE_PARAMS_HPP
9
10 #include <boost/config.hpp>
11 #include <boost/mpl/bool.hpp>
12 #include <boost/mpl/has_xxx.hpp>
13 #include <boost/preprocessor/arithmetic/add.hpp>
14 #include <boost/preprocessor/arithmetic/sub.hpp>
15 #include <boost/preprocessor/array/elem.hpp>
16 #include <boost/preprocessor/cat.hpp>
17 #include <boost/preprocessor/punctuation/comma_if.hpp>
18 #include <boost/preprocessor/repetition/repeat.hpp>
19 #include <boost/preprocessor/repetition/enum.hpp>
20 #include <boost/preprocessor/array/enum.hpp>
21 #include <boost/preprocessor/array/size.hpp>
22
23 #if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
24
25 #define BOOST_TTI_DETAIL_TEMPLATE_PARAMETERS(z,n,args) \
26 BOOST_PP_ARRAY_ELEM(BOOST_PP_ADD(4,n),args) \
27 /**/
28
29 #define BOOST_TTI_DETAIL_HAS_MEMBER_IMPLEMENTATION(args,introspect_macro) \
30 template \
31 < \
32 typename BOOST_TTI_DETAIL_TP_T, \
33 typename BOOST_TTI_DETAIL_TP_FALLBACK_ \
34 = boost::mpl::bool_< BOOST_PP_ARRAY_ELEM(3, args) > \
35 > \
36 class BOOST_PP_ARRAY_ELEM(0, args) \
37 { \
38 introspect_macro(args) \
39 public: \
40 static const bool value \
41 = BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args)< BOOST_TTI_DETAIL_TP_T >::value; \
42 typedef typename BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
43 < \
44 BOOST_TTI_DETAIL_TP_T \
45 >::type type; \
46 }; \
47 /**/
48
49 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
50
51 #define BOOST_TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE(z,n,args) \
52 template \
53 < \
54 template \
55 < \
56 BOOST_PP_ENUM_ ## z \
57 ( \
58 BOOST_PP_SUB \
59 ( \
60 BOOST_PP_ARRAY_SIZE(args), \
61 4 \
62 ), \
63 BOOST_TTI_DETAIL_TEMPLATE_PARAMETERS, \
64 args \
65 ) \
66 > \
67 class BOOST_TTI_DETAIL_TM_V \
68 > \
69 struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME(args, n) \
70 { \
71 }; \
72 /**/
73
74 #define BOOST_TTI_DETAIL_HAS_MEMBER_SUBSTITUTE(args) \
75 BOOST_PP_REPEAT \
76 ( \
77 BOOST_PP_ARRAY_ELEM(2, args), \
78 BOOST_TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE, \
79 args \
80 ) \
81 /**/
82
83 #define BOOST_TTI_DETAIL_HAS_MEMBER_INTROSPECT(args) \
84 template< typename U > \
85 struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
86 { \
87 BOOST_TTI_DETAIL_HAS_MEMBER_SUBSTITUTE(args) \
88 BOOST_MPL_HAS_MEMBER_REJECT(args, BOOST_PP_NIL) \
89 BOOST_MPL_HAS_MEMBER_ACCEPT(args, BOOST_PP_NIL) \
90 BOOST_STATIC_CONSTANT \
91 ( \
92 bool, value = BOOST_MPL_HAS_MEMBER_TEST(args) \
93 ); \
94 typedef boost::mpl::bool_< value > type; \
95 }; \
96 /**/
97
98 #define BOOST_TTI_DETAIL_HAS_MEMBER_WITH_FUNCTION_SFINAE(args) \
99 BOOST_TTI_DETAIL_HAS_MEMBER_IMPLEMENTATION \
100 ( \
101 args, \
102 BOOST_TTI_DETAIL_HAS_MEMBER_INTROSPECT \
103 ) \
104 /**/
105
106 #else // !!BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
107
108 #define BOOST_TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE(z,n,args) \
109 template \
110 < \
111 template \
112 < \
113 BOOST_PP_ENUM_ ## z \
114 ( \
115 BOOST_PP_SUB \
116 ( \
117 BOOST_PP_ARRAY_SIZE(args), \
118 4 \
119 ), \
120 BOOST_TTI_DETAIL_TEMPLATE_PARAMETERS, \
121 args \
122 ) \
123 > \
124 class BOOST_TTI_DETAIL_TM_U \
125 > \
126 struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_NAME_WITH_TEMPLATE_SFINAE \
127 ( \
128 args, \
129 n \
130 ) \
131 { \
132 typedef \
133 BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args) \
134 type; \
135 }; \
136 /**/
137
138 #define BOOST_TTI_DETAIL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE(args) \
139 typedef void \
140 BOOST_MPL_HAS_MEMBER_INTROSPECTION_SUBSTITUTE_TAG_NAME(args); \
141 BOOST_PP_REPEAT \
142 ( \
143 BOOST_PP_ARRAY_ELEM(2, args), \
144 BOOST_TTI_DETAIL_HAS_MEMBER_MULTI_SUBSTITUTE_WITH_TEMPLATE_SFINAE, \
145 args \
146 ) \
147 /**/
148
149 #define BOOST_TTI_DETAIL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE(args) \
150 BOOST_MPL_HAS_MEMBER_REJECT_WITH_TEMPLATE_SFINAE(args,BOOST_PP_NIL) \
151 BOOST_MPL_HAS_MEMBER_ACCEPT_WITH_TEMPLATE_SFINAE(args,BOOST_PP_NIL) \
152 template< typename BOOST_TTI_DETAIL_TP_U > \
153 struct BOOST_MPL_HAS_MEMBER_INTROSPECTION_NAME(args) \
154 : BOOST_MPL_HAS_MEMBER_INTROSPECTION_TEST_NAME(args)< BOOST_TTI_DETAIL_TP_U > { \
155 }; \
156 /**/
157
158 #define BOOST_TTI_DETAIL_HAS_MEMBER_WITH_TEMPLATE_SFINAE(args) \
159 BOOST_TTI_DETAIL_HAS_MEMBER_SUBSTITUTE_WITH_TEMPLATE_SFINAE \
160 ( \
161 args \
162 ) \
163 BOOST_TTI_DETAIL_HAS_MEMBER_IMPLEMENTATION \
164 ( \
165 args, \
166 BOOST_TTI_DETAIL_HAS_MEMBER_INTROSPECT_WITH_TEMPLATE_SFINAE \
167 ) \
168 /**/
169
170 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
171
172 #else // defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
173
174 #define BOOST_TTI_DETAIL_SAME(trait,name) \
175 BOOST_MPL_HAS_XXX_TEMPLATE_NAMED_DEF \
176 ( \
177 trait, \
178 name, \
179 false \
180 ) \
181 /**/
182
183 #define BOOST_TTI_DETAIL_TRAIT_CALL_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tp) \
184 BOOST_TTI_DETAIL_SAME(trait,name) \
185 /**/
186
187 #endif // !BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE
188
189 #define BOOST_TTI_DETAIL_TRAIT_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpArray) \
190 BOOST_TTI_DETAIL_TRAIT_CALL_HAS_TEMPLATE_CHECK_PARAMS(BOOST_PP_CAT(trait,_detail),name,tpArray) \
191 template<class BOOST_TTI_DETAIL_TP_T> \
192 struct trait : \
193 BOOST_PP_CAT(trait,_detail)<BOOST_TTI_DETAIL_TP_T> \
194 { \
195 }; \
196 /**/
197
198 #if !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
199 #if !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
200
201 #define BOOST_TTI_DETAIL_TRAIT_CALL_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpArray) \
202 BOOST_TTI_DETAIL_HAS_MEMBER_WITH_FUNCTION_SFINAE \
203 ( \
204 ( BOOST_PP_ADD(BOOST_PP_ARRAY_SIZE(tpArray),4), ( trait, name, 1, false, BOOST_PP_ARRAY_ENUM(tpArray) ) ) \
205 ) \
206 /**/
207
208 #else // BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
209
210 #define BOOST_TTI_DETAIL_TRAIT_CALL_HAS_TEMPLATE_CHECK_PARAMS(trait,name,tpArray) \
211 BOOST_TTI_DETAIL_HAS_MEMBER_WITH_TEMPLATE_SFINAE \
212 ( \
213 ( BOOST_PP_ADD(BOOST_PP_ARRAY_SIZE(tpArray),4), ( trait, name, 1, false, BOOST_PP_ARRAY_ENUM(tpArray) ) ) \
214 ) \
215 /**/
216
217 #endif // !BOOST_WORKAROUND(BOOST_MSVC, <= 1400)
218 #endif // !defined(BOOST_MPL_CFG_NO_HAS_XXX_TEMPLATE)
219
220 #endif // BOOST_TTI_DETAIL_TEMPLATE_PARAMS_HPP