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,~)