Mercurial > hg > vamp-build-and-test
diff 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 |
line wrap: on
line diff
--- a/DEPENDENCIES/generic/include/boost/fusion/functional/invocation/invoke.hpp Fri Sep 04 12:01:02 2015 +0100 +++ b/DEPENDENCIES/generic/include/boost/fusion/functional/invocation/invoke.hpp Mon Sep 07 11:12:49 2015 +0100 @@ -41,6 +41,7 @@ #include <boost/utility/result_of.hpp> #include <boost/fusion/support/category_of.hpp> +#include <boost/fusion/support/detail/enabler.hpp> #include <boost/fusion/sequence/intrinsic/at.hpp> #include <boost/fusion/sequence/intrinsic/size.hpp> #include <boost/fusion/sequence/intrinsic/front.hpp> @@ -52,21 +53,6 @@ namespace boost { namespace fusion { - namespace result_of - { - template <typename Function, class Sequence> struct invoke; - } - - //~ template <typename Function, class Sequence> - //~ inline typename result_of::invoke<Function, Sequence>::type - //~ invoke(Function, Sequence &); - - //~ template <typename Function, class Sequence> - //~ inline typename result_of::invoke<Function, Sequence const>::type - //~ invoke(Function, Sequence const &); - - //----- ---- --- -- - - - - - namespace detail { namespace ft = function_types; @@ -75,7 +61,8 @@ typename Function, class Sequence, int N = result_of::size<Sequence>::value, bool CBI = ft::is_callable_builtin<Function>::value, - bool RandomAccess = traits::is_random_access<Sequence>::value + bool RandomAccess = traits::is_random_access<Sequence>::value, + typename Enable = void > struct invoke_impl; @@ -104,16 +91,16 @@ Sequence, N, RandomAccess > { }; - template <typename Function, class Sequence, int N, bool RandomAccess> - struct invoke_impl<Function,Sequence,N,true,RandomAccess> + template <typename Function, class Sequence, int N, bool RandomAccess, typename Enable> + struct invoke_impl<Function,Sequence,N,true,RandomAccess,Enable> : mpl::if_< ft::is_member_function_pointer<Function>, invoke_mem_fn<Function,Sequence,N,RandomAccess>, invoke_nonmember_builtin<Function,Sequence,N,RandomAccess> >::type { }; - template <typename Function, class Sequence, bool RandomAccess> - struct invoke_impl<Function,Sequence,1,true,RandomAccess> + template <typename Function, class Sequence, bool RandomAccess, typename Enable> + struct invoke_impl<Function,Sequence,1,true,RandomAccess,Enable> : mpl::eval_if< ft::is_member_pointer<Function>, mpl::if_< ft::is_member_function_pointer<Function>, invoke_mem_fn<Function,Sequence,1,RandomAccess>, @@ -145,6 +132,7 @@ typedef typename boost::add_reference<qualified_type>::type result_type; + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(T C::* f, Sequence & s) { typename result_of::front<Sequence>::type c = fusion::front(s); @@ -155,15 +143,25 @@ namespace result_of { - template <typename Function, class Sequence> struct invoke + template <typename Function, class Sequence, typename = void> + struct invoke; + + template <typename Function, class Sequence> + struct invoke<Function, Sequence, + typename detail::enabler< + typename detail::invoke_impl< + typename boost::remove_reference<Function>::type, Sequence + >::result_type + >::type> { typedef typename detail::invoke_impl< typename boost::remove_reference<Function>::type, Sequence - >::result_type type; + >::result_type type; }; } template <typename Function, class Sequence> + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED inline typename result_of::invoke<Function,Sequence>::type invoke(Function f, Sequence & s) { @@ -173,6 +171,7 @@ } template <typename Function, class Sequence> + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED inline typename result_of::invoke<Function,Sequence const>::type invoke(Function f, Sequence const & s) { @@ -192,19 +191,24 @@ /////////////////////////////////////////////////////////////////////////////// #define N BOOST_PP_ITERATION() +#define M(z,j,data) typename result_of::at_c<Sequence,j>::type + template <typename Function, class Sequence> - struct invoke_impl<Function,Sequence,N,false,true> + struct invoke_impl<Function,Sequence,N,false,true, + typename enabler< + typename boost::result_of<Function(BOOST_PP_ENUM(N,M,~)) >::type + >::type> { public: typedef typename boost::result_of< -#define M(z,j,data) typename result_of::at_c<Sequence,j>::type Function(BOOST_PP_ENUM(N,M,~)) >::type result_type; #undef M #if N > 0 template <typename F> + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & s) { @@ -214,6 +218,7 @@ #else template <typename F> + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & /*s*/) { @@ -234,6 +239,7 @@ #if N > 0 template <typename F> + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & s) { @@ -243,6 +249,7 @@ #else template <typename F> + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & /*s*/) { @@ -263,6 +270,7 @@ typedef typename ft::result_type<Function>::type result_type; template <typename F> + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & s) { @@ -280,7 +288,12 @@ fusion::next(BOOST_PP_CAT(i,BOOST_PP_DEC(j))); template <typename Function, class Sequence> - struct invoke_impl<Function,Sequence,N,false,false> + struct invoke_impl<Function,Sequence,N,false,false, + typename enabler< +#define L(z,j,data) typename invoke_param_types<Sequence,N>::BOOST_PP_CAT(T, j) + typename boost::result_of<Function(BOOST_PP_ENUM(N,L,~))>::type + >::type> +#undef L { private: typedef invoke_param_types<Sequence,N> seq; @@ -293,6 +306,7 @@ #if N > 0 template <typename F> + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & s) { @@ -304,6 +318,7 @@ #else template <typename F> + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & /*s*/) { @@ -326,6 +341,7 @@ #if N > 0 template <typename F> + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & s) { @@ -337,6 +353,7 @@ #else template <typename F> + BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & /*s*/) { @@ -358,6 +375,7 @@ typedef typename ft::result_type<Function>::type result_type; template <typename F> + BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED static inline result_type call(F & f, Sequence & s) {