Chris@16: /*============================================================================= Chris@16: Copyright (c) 2005-2006 Joao Abecasis Chris@16: Copyright (c) 2006-2007 Tobias Schwinger Chris@16: Chris@16: Use modification and distribution are subject to the Boost Software Chris@16: License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at Chris@16: http://www.boost.org/LICENSE_1_0.txt). Chris@16: ==============================================================================*/ Chris@16: Chris@16: #if !defined(BOOST_FUSION_FUNCTIONAL_INVOCATION_INVOKE_PROCEDURE_HPP_INCLUDED) Chris@16: #if !defined(BOOST_PP_IS_ITERATING) Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: #include Chris@101: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: #include Chris@16: Chris@16: namespace boost { namespace fusion Chris@16: { Chris@16: namespace detail Chris@16: { Chris@16: namespace ft = function_types; Chris@16: Chris@16: template< Chris@16: typename Function, class Sequence, Chris@16: int N = result_of::size::value, Chris@16: bool MFP = ft::is_member_function_pointer::value, Chris@16: bool RandomAccess = traits::is_random_access::value Chris@16: > Chris@16: struct invoke_procedure_impl; Chris@16: Chris@16: #define BOOST_PP_FILENAME_1 \ Chris@16: Chris@16: #define BOOST_PP_ITERATION_LIMITS \ Chris@16: (0, BOOST_FUSION_INVOKE_PROCEDURE_MAX_ARITY) Chris@16: #include BOOST_PP_ITERATE() Chris@16: Chris@16: } Chris@16: Chris@101: namespace result_of Chris@101: { Chris@101: template Chris@101: struct invoke_procedure; Chris@101: Chris@101: template Chris@101: struct invoke_procedure::type,Sequence Chris@101: >::result_type Chris@101: >::type> Chris@101: { Chris@101: typedef void type; Chris@101: }; Chris@101: } Chris@101: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: inline typename result_of::invoke_procedure::type Chris@101: invoke_procedure(Function f, Sequence & s) Chris@16: { Chris@16: detail::invoke_procedure_impl< Chris@16: typename boost::remove_reference::type,Sequence Chris@16: >::call(f,s); Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: inline typename result_of::invoke_procedure::type Chris@101: invoke_procedure(Function f, Sequence const & s) Chris@16: { Chris@16: detail::invoke_procedure_impl< Chris@16: typename boost::remove_reference::type,Sequence const Chris@16: >::call(f,s); Chris@16: } Chris@16: Chris@16: }} Chris@16: Chris@16: #define BOOST_FUSION_FUNCTIONAL_INVOCATION_INVOKE_PROCEDURE_HPP_INCLUDED Chris@16: #else // defined(BOOST_PP_IS_ITERATING) Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: // Chris@16: // Preprocessor vertical repetition code Chris@16: // Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: #define N BOOST_PP_ITERATION() Chris@16: Chris@16: #define M(z,j,data) fusion::at_c(s) Chris@16: Chris@16: template Chris@16: struct invoke_procedure_impl Chris@16: { Chris@101: typedef void result_type; Chris@16: Chris@16: #if N > 0 Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static inline void call(Function & f, Sequence & s) Chris@16: { Chris@16: f(BOOST_PP_ENUM(N,M,~)); Chris@16: } Chris@16: Chris@16: #else Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static inline void call(Function & f, Sequence & /*s*/) Chris@16: { Chris@16: f(); Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: }; Chris@16: Chris@16: #if N > 0 Chris@16: template Chris@16: struct invoke_procedure_impl Chris@16: { Chris@101: typedef void result_type; Chris@101: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static inline void call(Function & f, Sequence & s) Chris@16: { Chris@16: (that_ptr >::type Chris@16: >::get(fusion::at_c<0>(s))->*f)(BOOST_PP_ENUM_SHIFTED(N,M,~)); Chris@16: } Chris@16: }; Chris@16: #endif Chris@16: Chris@16: #undef M Chris@16: Chris@16: #define M(z,j,data) \ Chris@16: typedef typename result_of::next< BOOST_PP_CAT(I,BOOST_PP_DEC(j)) \ Chris@16: >::type I ## j ; \ Chris@16: I##j i##j = fusion::next(BOOST_PP_CAT(i,BOOST_PP_DEC(j))); Chris@16: Chris@16: template Chris@16: struct invoke_procedure_impl Chris@16: { Chris@101: typedef void result_type; Chris@16: Chris@16: #if N > 0 Chris@16: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static inline void call(Function & f, Sequence & s) Chris@16: { Chris@16: typedef typename result_of::begin::type I0; Chris@16: I0 i0 = fusion::begin(s); Chris@16: BOOST_PP_REPEAT_FROM_TO(1,N,M,~) Chris@16: f( BOOST_PP_ENUM_PARAMS(N,*i) ); Chris@16: } Chris@16: Chris@16: #else Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static inline void call(Function & f, Sequence & /*s*/) Chris@16: { Chris@16: f(); Chris@16: } Chris@16: Chris@16: #endif Chris@16: Chris@16: }; Chris@16: Chris@16: #if N > 0 Chris@16: template Chris@16: struct invoke_procedure_impl Chris@16: { Chris@101: typedef void result_type; Chris@101: Chris@101: BOOST_CXX14_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static inline void call(Function & f, Sequence & s) Chris@16: { Chris@16: typedef typename result_of::begin::type I0; Chris@16: I0 i0 = fusion::begin(s); Chris@16: BOOST_PP_REPEAT_FROM_TO(1,N,M,~) Chris@16: Chris@16: (that_ptr >::type Chris@16: >::get(*i0)->*f)(BOOST_PP_ENUM_SHIFTED_PARAMS(N,*i)); Chris@16: } Chris@16: }; Chris@16: #endif Chris@16: Chris@16: #undef M Chris@16: Chris@16: #undef N Chris@16: #endif // defined(BOOST_PP_IS_ITERATING) Chris@16: #endif Chris@16: