Chris@16: /*============================================================================= Chris@16: Copyright (c) 2001-2011 Joel de Guzman Chris@16: Copyright (c) 2006 Dan Marsden Chris@16: Copyright (c) 2009-2010 Christopher Schmidt Chris@16: Chris@16: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@16: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: ==============================================================================*/ Chris@16: #include Chris@16: Chris@16: #ifdef BOOST_FUSION_REVERSE_FOLD Chris@16: # ifdef BOOST_FUSION_ITER_FOLD Chris@16: # define BOOST_FUSION_FOLD_NAME reverse_iter_fold Chris@16: # else Chris@16: # define BOOST_FUSION_FOLD_NAME reverse_fold Chris@16: # endif Chris@16: Chris@16: # define BOOST_FUSION_FOLD_IMPL_FIRST_IT_FUNCTION end Chris@16: # define BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION prior Chris@16: # define BOOST_FUSION_FOLD_IMPL_FIRST_IT_META_TRANSFORM(IT) \ Chris@16: typename fusion::result_of::prior::type Chris@16: # define BOOST_FUSION_FOLD_IMPL_FIRST_IT_TRANSFORM(IT) fusion::prior(IT) Chris@16: #else Chris@16: # ifdef BOOST_FUSION_ITER_FOLD Chris@16: # define BOOST_FUSION_FOLD_NAME iter_fold Chris@16: # else Chris@16: # define BOOST_FUSION_FOLD_NAME fold Chris@16: # endif Chris@16: Chris@16: # define BOOST_FUSION_FOLD_IMPL_FIRST_IT_FUNCTION begin Chris@16: # define BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION next Chris@16: # define BOOST_FUSION_FOLD_IMPL_FIRST_IT_META_TRANSFORM(IT) IT Chris@16: # define BOOST_FUSION_FOLD_IMPL_FIRST_IT_TRANSFORM(IT) IT Chris@16: #endif Chris@16: #ifdef BOOST_FUSION_ITER_FOLD Chris@16: # define BOOST_FUSION_FOLD_IMPL_INVOKE_IT_META_TRANSFORM(IT) IT& Chris@16: # define BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(IT) IT Chris@16: #else Chris@16: # define BOOST_FUSION_FOLD_IMPL_INVOKE_IT_META_TRANSFORM(IT) \ Chris@16: typename fusion::result_of::deref::type Chris@16: # define BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(IT) fusion::deref(IT) Chris@16: #endif Chris@16: Chris@16: namespace boost { namespace fusion Chris@16: { Chris@16: namespace detail Chris@16: { Chris@16: template Chris@16: struct BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state) Chris@101: : fusion::detail::result_of_with_decltype< Chris@16: F( Chris@16: typename add_reference::type>::type, Chris@16: BOOST_FUSION_FOLD_IMPL_INVOKE_IT_META_TRANSFORM(It)) Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME) Chris@16: { Chris@101: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static Result Chris@101: call_3(State3 const& state3,It3 const& it3,F& f) Chris@16: { Chris@16: return BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)< Chris@16: Result Chris@16: , N-4 Chris@16: >::call( Chris@16: f(state3,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it3)), Chris@16: fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it3), Chris@16: f); Chris@16: } Chris@101: Chris@101: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: static Result Chris@101: call_2(State2 const& state2,It2 const& it2,F& f) Chris@101: { Chris@101: return call_3( Chris@101: f(state2,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it2)), Chris@101: fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it2), Chris@101: f); Chris@101: } Chris@101: Chris@101: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: static Result Chris@101: call_1(State1 const& state1,It1 const& it1,F& f) Chris@101: { Chris@101: return call_2( Chris@101: f(state1,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it1)), Chris@101: fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it1), Chris@101: f); Chris@101: } Chris@101: Chris@101: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: static Result Chris@101: call(State const& state,It0 const& it0,F f) Chris@101: { Chris@101: return call_1( Chris@101: f(state,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0)), Chris@101: fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it0), Chris@101: f); Chris@101: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME) Chris@16: { Chris@101: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: static Result Chris@101: call_2(State2 const& state2,It2 const& it2,F& f) Chris@101: { Chris@101: return f(state2,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it2)); Chris@101: } Chris@101: Chris@101: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: static Result Chris@101: call_1(State1 const& state1,It1 const& it1,F& f) Chris@101: { Chris@101: return call_2( Chris@101: f(state1,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it1)), Chris@101: fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it1), Chris@101: f); Chris@101: } Chris@101: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static Result Chris@16: call(State const& state,It0 const& it0,F f) Chris@16: { Chris@101: return call_1( Chris@101: f(state,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0)), Chris@101: fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it0), Chris@101: f); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME) Chris@16: { Chris@101: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@101: static Result Chris@101: call_1(State1 const& state1,It1 const& it1,F& f) Chris@101: { Chris@101: return f(state1,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it1)); Chris@101: } Chris@101: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static Result Chris@16: call(State const& state,It0 const& it0,F f) Chris@16: { Chris@101: return call_1( Chris@101: f(state,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0)), Chris@101: fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it0), Chris@101: f); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME) Chris@16: { Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static Result Chris@16: call(State const& state,It0 const& it0,F f) Chris@16: { Chris@16: return f(state, Chris@16: BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0)); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME) Chris@16: { Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static Result Chris@101: call(State const& state,It0 const&, F) Chris@16: { Chris@16: return static_cast(state); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME) Chris@16: { Chris@16: typedef typename Chris@16: BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)< Chris@16: StateRef Chris@16: , It0 const Chris@16: , F Chris@16: >::type Chris@16: rest1; Chris@16: typedef typename Chris@16: result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION< Chris@16: It0 const Chris@16: >::type Chris@16: it1; Chris@16: typedef typename Chris@16: BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)< Chris@16: rest1 Chris@16: , it1 Chris@16: , F Chris@16: >::type Chris@16: rest2; Chris@16: typedef typename Chris@16: result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION::type Chris@16: it2; Chris@16: typedef typename Chris@16: BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)< Chris@16: rest2 Chris@16: , it2 Chris@16: , F Chris@16: >::type Chris@16: rest3; Chris@16: typedef typename Chris@16: result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION::type Chris@16: it3; Chris@16: Chris@16: typedef typename Chris@16: BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)< Chris@16: typename BOOST_PP_CAT( Chris@16: BOOST_FUSION_FOLD_NAME, _lvalue_state)< Chris@16: rest3 Chris@16: , it3 Chris@16: , F Chris@16: >::type Chris@16: , typename result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION< Chris@16: it3 Chris@16: >::type Chris@16: , F Chris@16: , N-4 Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)< Chris@16: StateRef Chris@16: , It0 Chris@16: , F Chris@16: , 3 Chris@16: > Chris@16: { Chris@16: typedef typename Chris@16: BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)< Chris@16: StateRef Chris@16: , It0 const Chris@16: , F Chris@16: >::type Chris@16: rest1; Chris@16: typedef typename Chris@16: result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION< Chris@16: It0 const Chris@16: >::type Chris@16: it1; Chris@16: Chris@16: typedef typename Chris@16: BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)< Chris@16: typename BOOST_PP_CAT( Chris@16: BOOST_FUSION_FOLD_NAME, _lvalue_state)< Chris@16: rest1 Chris@16: , it1 Chris@16: , F Chris@16: >::type Chris@16: , typename result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION< Chris@16: it1 const Chris@16: >::type const Chris@16: , F Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)< Chris@16: StateRef Chris@16: , It0 Chris@16: , F Chris@16: , 2 Chris@16: > Chris@16: : BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)< Chris@16: typename BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)< Chris@16: StateRef Chris@16: , It0 const Chris@16: , F Chris@16: >::type Chris@16: , typename result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION< Chris@16: It0 const Chris@16: >::type const Chris@16: , F Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)< Chris@16: StateRef Chris@16: , It0 Chris@16: , F Chris@16: , 1 Chris@16: > Chris@16: : BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)< Chris@16: StateRef Chris@16: , It0 const Chris@16: , F Chris@16: > Chris@16: {}; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)< Chris@16: StateRef Chris@16: , It0 Chris@16: , F Chris@16: , 0 Chris@16: > Chris@16: { Chris@16: typedef StateRef type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(result_of_first_unrolled,BOOST_FUSION_FOLD_NAME) Chris@16: { Chris@16: typedef typename Chris@16: BOOST_PP_CAT(result_of_unrolled_,BOOST_FUSION_FOLD_NAME)< Chris@101: typename fusion::detail::result_of_with_decltype< Chris@16: F( Chris@16: StateRef, Chris@16: BOOST_FUSION_FOLD_IMPL_INVOKE_IT_META_TRANSFORM( Chris@16: It0 const) Chris@16: ) Chris@16: >::type Chris@16: , typename result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION< Chris@16: It0 const Chris@16: >::type Chris@16: , F Chris@16: , SeqSize-1 Chris@16: >::type Chris@16: type; Chris@16: }; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME,_impl) Chris@16: { Chris@16: typedef typename Chris@16: BOOST_PP_CAT( Chris@16: result_of_first_unrolled,BOOST_FUSION_FOLD_NAME)< Chris@16: StateRef Chris@16: , BOOST_FUSION_FOLD_IMPL_FIRST_IT_META_TRANSFORM( Chris@16: typename result_of::BOOST_FUSION_FOLD_IMPL_FIRST_IT_FUNCTION::type Chris@16: ) Chris@16: , F Chris@16: , SeqSize Chris@16: >::type Chris@16: type; Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static type Chris@16: call(StateRef state, Seq& seq, F f) Chris@16: { Chris@16: typedef Chris@16: BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)< Chris@16: type Chris@16: , SeqSize Chris@16: > Chris@16: unrolled_impl; Chris@16: Chris@16: return unrolled_impl::call( Chris@16: state, Chris@16: BOOST_FUSION_FOLD_IMPL_FIRST_IT_TRANSFORM( Chris@16: fusion::BOOST_FUSION_FOLD_IMPL_FIRST_IT_FUNCTION(seq)), Chris@16: f); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME,_impl)<0,StateRef,Seq,F> Chris@16: { Chris@16: typedef StateRef type; Chris@16: Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: static StateRef Chris@16: call(StateRef state, Seq&, F) Chris@16: { Chris@16: return static_cast(state); Chris@16: } Chris@16: }; Chris@16: Chris@16: template Chris@16: struct BOOST_PP_CAT(result_of_, BOOST_FUSION_FOLD_NAME) Chris@16: : BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME,_impl)< Chris@16: result_of::size::value Chris@16: , typename add_reference< Chris@16: typename add_const::type Chris@16: >::type Chris@16: , Seq Chris@16: , F Chris@16: > Chris@16: {}; Chris@16: } Chris@16: Chris@16: namespace result_of Chris@16: { Chris@16: template Chris@16: struct BOOST_FUSION_FOLD_NAME Chris@16: : detail::BOOST_PP_CAT(result_of_, BOOST_FUSION_FOLD_NAME)< Chris@16: Seq Chris@16: , State Chris@16: , F Chris@16: , traits::is_segmented::type::value Chris@16: > Chris@16: {}; Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: inline typename result_of::BOOST_FUSION_FOLD_NAME< Chris@16: Seq Chris@16: , State const Chris@16: , F Chris@16: >::type Chris@16: BOOST_FUSION_FOLD_NAME(Seq& seq, State const& state, F f) Chris@16: { Chris@16: return result_of::BOOST_FUSION_FOLD_NAME::call( Chris@16: state, Chris@16: seq, Chris@16: f); Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: inline typename result_of::BOOST_FUSION_FOLD_NAME< Chris@16: Seq const Chris@16: , State const Chris@16: , F Chris@16: >::type Chris@16: BOOST_FUSION_FOLD_NAME(Seq const& seq, State const& state, F f) Chris@16: { Chris@16: return result_of::BOOST_FUSION_FOLD_NAME::call( Chris@16: state, Chris@16: seq, Chris@16: f); Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: inline typename result_of::BOOST_FUSION_FOLD_NAME< Chris@16: Seq Chris@16: , State const Chris@16: , F Chris@16: >::type Chris@16: BOOST_FUSION_FOLD_NAME(Seq& seq, State& state, F f) Chris@16: { Chris@16: return result_of::BOOST_FUSION_FOLD_NAME::call( Chris@16: state, Chris@16: seq, Chris@16: f); Chris@16: } Chris@16: Chris@16: template Chris@101: BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED Chris@16: inline typename result_of::BOOST_FUSION_FOLD_NAME< Chris@16: Seq const Chris@16: , State const Chris@16: , F Chris@16: >::type Chris@16: BOOST_FUSION_FOLD_NAME(Seq const& seq, State& state, F f) Chris@16: { Chris@16: return result_of::BOOST_FUSION_FOLD_NAME::call( Chris@16: state, Chris@16: seq, Chris@16: f); Chris@16: } Chris@16: }} Chris@16: Chris@16: #undef BOOST_FUSION_FOLD_NAME Chris@16: #undef BOOST_FUSION_FOLD_IMPL_FIRST_IT_FUNCTION Chris@16: #undef BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION Chris@16: #undef BOOST_FUSION_FOLD_IMPL_FIRST_IT_META_TRANSFORM Chris@16: #undef BOOST_FUSION_FOLD_IMPL_FIRST_IT_TRANSFORM Chris@16: #undef BOOST_FUSION_FOLD_IMPL_INVOKE_IT_META_TRANSFORM Chris@16: #undef BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM