Mercurial > hg > vamp-build-and-test
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 |