Mercurial > hg > vamp-build-and-test
comparison DEPENDENCIES/generic/include/boost/fusion/functional/invocation/invoke.hpp @ 101:c530137014c0
Update Boost headers (1.58.0)
author | Chris Cannam |
---|---|
date | Mon, 07 Sep 2015 11:12:49 +0100 |
parents | 2665513ce2d3 |
children |
comparison
equal
deleted
inserted
replaced
100:793467b5e61c | 101:c530137014c0 |
---|---|
39 #include <boost/function_types/parameter_types.hpp> | 39 #include <boost/function_types/parameter_types.hpp> |
40 | 40 |
41 #include <boost/utility/result_of.hpp> | 41 #include <boost/utility/result_of.hpp> |
42 | 42 |
43 #include <boost/fusion/support/category_of.hpp> | 43 #include <boost/fusion/support/category_of.hpp> |
44 #include <boost/fusion/support/detail/enabler.hpp> | |
44 #include <boost/fusion/sequence/intrinsic/at.hpp> | 45 #include <boost/fusion/sequence/intrinsic/at.hpp> |
45 #include <boost/fusion/sequence/intrinsic/size.hpp> | 46 #include <boost/fusion/sequence/intrinsic/size.hpp> |
46 #include <boost/fusion/sequence/intrinsic/front.hpp> | 47 #include <boost/fusion/sequence/intrinsic/front.hpp> |
47 #include <boost/fusion/sequence/intrinsic/begin.hpp> | 48 #include <boost/fusion/sequence/intrinsic/begin.hpp> |
48 #include <boost/fusion/iterator/next.hpp> | 49 #include <boost/fusion/iterator/next.hpp> |
50 #include <boost/fusion/functional/invocation/limits.hpp> | 51 #include <boost/fusion/functional/invocation/limits.hpp> |
51 #include <boost/fusion/functional/invocation/detail/that_ptr.hpp> | 52 #include <boost/fusion/functional/invocation/detail/that_ptr.hpp> |
52 | 53 |
53 namespace boost { namespace fusion | 54 namespace boost { namespace fusion |
54 { | 55 { |
55 namespace result_of | |
56 { | |
57 template <typename Function, class Sequence> struct invoke; | |
58 } | |
59 | |
60 //~ template <typename Function, class Sequence> | |
61 //~ inline typename result_of::invoke<Function, Sequence>::type | |
62 //~ invoke(Function, Sequence &); | |
63 | |
64 //~ template <typename Function, class Sequence> | |
65 //~ inline typename result_of::invoke<Function, Sequence const>::type | |
66 //~ invoke(Function, Sequence const &); | |
67 | |
68 //----- ---- --- -- - - - - | |
69 | |
70 namespace detail | 56 namespace detail |
71 { | 57 { |
72 namespace ft = function_types; | 58 namespace ft = function_types; |
73 | 59 |
74 template< | 60 template< |
75 typename Function, class Sequence, | 61 typename Function, class Sequence, |
76 int N = result_of::size<Sequence>::value, | 62 int N = result_of::size<Sequence>::value, |
77 bool CBI = ft::is_callable_builtin<Function>::value, | 63 bool CBI = ft::is_callable_builtin<Function>::value, |
78 bool RandomAccess = traits::is_random_access<Sequence>::value | 64 bool RandomAccess = traits::is_random_access<Sequence>::value, |
65 typename Enable = void | |
79 > | 66 > |
80 struct invoke_impl; | 67 struct invoke_impl; |
81 | 68 |
82 template <class Sequence, int N> | 69 template <class Sequence, int N> |
83 struct invoke_param_types; | 70 struct invoke_param_types; |
102 typename mpl::eval_if< ft::is_function<F>, | 89 typename mpl::eval_if< ft::is_function<F>, |
103 boost::add_reference<F>, boost::remove_cv<F> >::type, | 90 boost::add_reference<F>, boost::remove_cv<F> >::type, |
104 Sequence, N, RandomAccess > | 91 Sequence, N, RandomAccess > |
105 { }; | 92 { }; |
106 | 93 |
107 template <typename Function, class Sequence, int N, bool RandomAccess> | 94 template <typename Function, class Sequence, int N, bool RandomAccess, typename Enable> |
108 struct invoke_impl<Function,Sequence,N,true,RandomAccess> | 95 struct invoke_impl<Function,Sequence,N,true,RandomAccess,Enable> |
109 : mpl::if_< ft::is_member_function_pointer<Function>, | 96 : mpl::if_< ft::is_member_function_pointer<Function>, |
110 invoke_mem_fn<Function,Sequence,N,RandomAccess>, | 97 invoke_mem_fn<Function,Sequence,N,RandomAccess>, |
111 invoke_nonmember_builtin<Function,Sequence,N,RandomAccess> | 98 invoke_nonmember_builtin<Function,Sequence,N,RandomAccess> |
112 >::type | 99 >::type |
113 { }; | 100 { }; |
114 | 101 |
115 template <typename Function, class Sequence, bool RandomAccess> | 102 template <typename Function, class Sequence, bool RandomAccess, typename Enable> |
116 struct invoke_impl<Function,Sequence,1,true,RandomAccess> | 103 struct invoke_impl<Function,Sequence,1,true,RandomAccess,Enable> |
117 : mpl::eval_if< ft::is_member_pointer<Function>, | 104 : mpl::eval_if< ft::is_member_pointer<Function>, |
118 mpl::if_< ft::is_member_function_pointer<Function>, | 105 mpl::if_< ft::is_member_function_pointer<Function>, |
119 invoke_mem_fn<Function,Sequence,1,RandomAccess>, | 106 invoke_mem_fn<Function,Sequence,1,RandomAccess>, |
120 invoke_data_member<Function, Sequence> >, | 107 invoke_data_member<Function, Sequence> >, |
121 mpl::identity< invoke_nonmember_builtin< | 108 mpl::identity< invoke_nonmember_builtin< |
143 public: | 130 public: |
144 | 131 |
145 typedef typename boost::add_reference<qualified_type>::type | 132 typedef typename boost::add_reference<qualified_type>::type |
146 result_type; | 133 result_type; |
147 | 134 |
135 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
148 static inline result_type call(T C::* f, Sequence & s) | 136 static inline result_type call(T C::* f, Sequence & s) |
149 { | 137 { |
150 typename result_of::front<Sequence>::type c = fusion::front(s); | 138 typename result_of::front<Sequence>::type c = fusion::front(s); |
151 return that_ptr<qualified_class>::get(c)->*f; | 139 return that_ptr<qualified_class>::get(c)->*f; |
152 } | 140 } |
153 }; | 141 }; |
154 } | 142 } |
155 | 143 |
156 namespace result_of | 144 namespace result_of |
157 { | 145 { |
158 template <typename Function, class Sequence> struct invoke | 146 template <typename Function, class Sequence, typename = void> |
147 struct invoke; | |
148 | |
149 template <typename Function, class Sequence> | |
150 struct invoke<Function, Sequence, | |
151 typename detail::enabler< | |
152 typename detail::invoke_impl< | |
153 typename boost::remove_reference<Function>::type, Sequence | |
154 >::result_type | |
155 >::type> | |
159 { | 156 { |
160 typedef typename detail::invoke_impl< | 157 typedef typename detail::invoke_impl< |
161 typename boost::remove_reference<Function>::type, Sequence | 158 typename boost::remove_reference<Function>::type, Sequence |
162 >::result_type type; | 159 >::result_type type; |
163 }; | 160 }; |
164 } | 161 } |
165 | 162 |
166 template <typename Function, class Sequence> | 163 template <typename Function, class Sequence> |
164 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
167 inline typename result_of::invoke<Function,Sequence>::type | 165 inline typename result_of::invoke<Function,Sequence>::type |
168 invoke(Function f, Sequence & s) | 166 invoke(Function f, Sequence & s) |
169 { | 167 { |
170 return detail::invoke_impl< | 168 return detail::invoke_impl< |
171 typename boost::remove_reference<Function>::type,Sequence | 169 typename boost::remove_reference<Function>::type,Sequence |
172 >::call(f,s); | 170 >::call(f,s); |
173 } | 171 } |
174 | 172 |
175 template <typename Function, class Sequence> | 173 template <typename Function, class Sequence> |
174 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
176 inline typename result_of::invoke<Function,Sequence const>::type | 175 inline typename result_of::invoke<Function,Sequence const>::type |
177 invoke(Function f, Sequence const & s) | 176 invoke(Function f, Sequence const & s) |
178 { | 177 { |
179 return detail::invoke_impl< | 178 return detail::invoke_impl< |
180 typename boost::remove_reference<Function>::type,Sequence const | 179 typename boost::remove_reference<Function>::type,Sequence const |
190 // Preprocessor vertical repetition code | 189 // Preprocessor vertical repetition code |
191 // | 190 // |
192 /////////////////////////////////////////////////////////////////////////////// | 191 /////////////////////////////////////////////////////////////////////////////// |
193 #define N BOOST_PP_ITERATION() | 192 #define N BOOST_PP_ITERATION() |
194 | 193 |
195 template <typename Function, class Sequence> | 194 #define M(z,j,data) typename result_of::at_c<Sequence,j>::type |
196 struct invoke_impl<Function,Sequence,N,false,true> | 195 |
196 template <typename Function, class Sequence> | |
197 struct invoke_impl<Function,Sequence,N,false,true, | |
198 typename enabler< | |
199 typename boost::result_of<Function(BOOST_PP_ENUM(N,M,~)) >::type | |
200 >::type> | |
197 { | 201 { |
198 public: | 202 public: |
199 | 203 |
200 typedef typename boost::result_of< | 204 typedef typename boost::result_of< |
201 #define M(z,j,data) typename result_of::at_c<Sequence,j>::type | |
202 Function(BOOST_PP_ENUM(N,M,~)) >::type result_type; | 205 Function(BOOST_PP_ENUM(N,M,~)) >::type result_type; |
203 #undef M | 206 #undef M |
204 | 207 |
205 #if N > 0 | 208 #if N > 0 |
206 | 209 |
207 template <typename F> | 210 template <typename F> |
211 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
208 static inline result_type | 212 static inline result_type |
209 call(F & f, Sequence & s) | 213 call(F & f, Sequence & s) |
210 { | 214 { |
211 #define M(z,j,data) fusion::at_c<j>(s) | 215 #define M(z,j,data) fusion::at_c<j>(s) |
212 return f( BOOST_PP_ENUM(N,M,~) ); | 216 return f( BOOST_PP_ENUM(N,M,~) ); |
213 } | 217 } |
214 | 218 |
215 #else | 219 #else |
216 template <typename F> | 220 template <typename F> |
221 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
217 static inline result_type | 222 static inline result_type |
218 call(F & f, Sequence & /*s*/) | 223 call(F & f, Sequence & /*s*/) |
219 { | 224 { |
220 return f(); | 225 return f(); |
221 } | 226 } |
232 typedef typename ft::result_type<Function>::type result_type; | 237 typedef typename ft::result_type<Function>::type result_type; |
233 | 238 |
234 #if N > 0 | 239 #if N > 0 |
235 | 240 |
236 template <typename F> | 241 template <typename F> |
242 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
237 static inline result_type | 243 static inline result_type |
238 call(F & f, Sequence & s) | 244 call(F & f, Sequence & s) |
239 { | 245 { |
240 #define M(z,j,data) fusion::at_c<j>(s) | 246 #define M(z,j,data) fusion::at_c<j>(s) |
241 return f( BOOST_PP_ENUM(N,M,~) ); | 247 return f( BOOST_PP_ENUM(N,M,~) ); |
242 } | 248 } |
243 | 249 |
244 #else | 250 #else |
245 template <typename F> | 251 template <typename F> |
252 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
246 static inline result_type | 253 static inline result_type |
247 call(F & f, Sequence & /*s*/) | 254 call(F & f, Sequence & /*s*/) |
248 { | 255 { |
249 return f(); | 256 return f(); |
250 } | 257 } |
261 public: | 268 public: |
262 | 269 |
263 typedef typename ft::result_type<Function>::type result_type; | 270 typedef typename ft::result_type<Function>::type result_type; |
264 | 271 |
265 template <typename F> | 272 template <typename F> |
273 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
266 static inline result_type | 274 static inline result_type |
267 call(F & f, Sequence & s) | 275 call(F & f, Sequence & s) |
268 { | 276 { |
269 return (that_ptr<typename mpl::front< | 277 return (that_ptr<typename mpl::front< |
270 ft::parameter_types<Function> >::type | 278 ft::parameter_types<Function> >::type |
278 #define M(z,j,data) \ | 286 #define M(z,j,data) \ |
279 typename seq::I##j i##j = \ | 287 typename seq::I##j i##j = \ |
280 fusion::next(BOOST_PP_CAT(i,BOOST_PP_DEC(j))); | 288 fusion::next(BOOST_PP_CAT(i,BOOST_PP_DEC(j))); |
281 | 289 |
282 template <typename Function, class Sequence> | 290 template <typename Function, class Sequence> |
283 struct invoke_impl<Function,Sequence,N,false,false> | 291 struct invoke_impl<Function,Sequence,N,false,false, |
292 typename enabler< | |
293 #define L(z,j,data) typename invoke_param_types<Sequence,N>::BOOST_PP_CAT(T, j) | |
294 typename boost::result_of<Function(BOOST_PP_ENUM(N,L,~))>::type | |
295 >::type> | |
296 #undef L | |
284 { | 297 { |
285 private: | 298 private: |
286 typedef invoke_param_types<Sequence,N> seq; | 299 typedef invoke_param_types<Sequence,N> seq; |
287 public: | 300 public: |
288 | 301 |
291 >::type result_type; | 304 >::type result_type; |
292 | 305 |
293 #if N > 0 | 306 #if N > 0 |
294 | 307 |
295 template <typename F> | 308 template <typename F> |
309 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
296 static inline result_type | 310 static inline result_type |
297 call(F & f, Sequence & s) | 311 call(F & f, Sequence & s) |
298 { | 312 { |
299 typename seq::I0 i0 = fusion::begin(s); | 313 typename seq::I0 i0 = fusion::begin(s); |
300 BOOST_PP_REPEAT_FROM_TO(1,N,M,~) | 314 BOOST_PP_REPEAT_FROM_TO(1,N,M,~) |
302 } | 316 } |
303 | 317 |
304 #else | 318 #else |
305 | 319 |
306 template <typename F> | 320 template <typename F> |
321 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
307 static inline result_type | 322 static inline result_type |
308 call(F & f, Sequence & /*s*/) | 323 call(F & f, Sequence & /*s*/) |
309 { | 324 { |
310 return f(); | 325 return f(); |
311 } | 326 } |
324 typedef typename ft::result_type<Function>::type result_type; | 339 typedef typename ft::result_type<Function>::type result_type; |
325 | 340 |
326 #if N > 0 | 341 #if N > 0 |
327 | 342 |
328 template <typename F> | 343 template <typename F> |
344 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
329 static inline result_type | 345 static inline result_type |
330 call(F & f, Sequence & s) | 346 call(F & f, Sequence & s) |
331 { | 347 { |
332 typename seq::I0 i0 = fusion::begin(s); | 348 typename seq::I0 i0 = fusion::begin(s); |
333 BOOST_PP_REPEAT_FROM_TO(1,N,M,~) | 349 BOOST_PP_REPEAT_FROM_TO(1,N,M,~) |
335 } | 351 } |
336 | 352 |
337 #else | 353 #else |
338 | 354 |
339 template <typename F> | 355 template <typename F> |
356 BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
340 static inline result_type | 357 static inline result_type |
341 call(F & f, Sequence & /*s*/) | 358 call(F & f, Sequence & /*s*/) |
342 { | 359 { |
343 return f(); | 360 return f(); |
344 } | 361 } |
356 public: | 373 public: |
357 | 374 |
358 typedef typename ft::result_type<Function>::type result_type; | 375 typedef typename ft::result_type<Function>::type result_type; |
359 | 376 |
360 template <typename F> | 377 template <typename F> |
378 BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED | |
361 static inline result_type | 379 static inline result_type |
362 call(F & f, Sequence & s) | 380 call(F & f, Sequence & s) |
363 { | 381 { |
364 typename seq::I0 i0 = fusion::begin(s); | 382 typename seq::I0 i0 = fusion::begin(s); |
365 BOOST_PP_REPEAT_FROM_TO(1,N,M,~) | 383 BOOST_PP_REPEAT_FROM_TO(1,N,M,~) |