Make fold as a single return stmt due to C++11 constexpr.

Signed-off-by: Kohei Takahashi <flast@flast.jp>
This commit is contained in:
Kohei Takahashi
2014-10-17 18:50:43 +09:00
parent badf3f2a47
commit fdb6598194
5 changed files with 340 additions and 263 deletions

View File

@ -57,39 +57,11 @@ namespace boost { namespace fusion
template<typename Result,int N> template<typename Result,int N>
struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME) struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)
{ {
template<typename State, typename It0, typename F> template<typename State3, typename It3, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call_3(State3 const& state3,It3 const& it3,F& f)
{ {
typedef typename
result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<
It0 const
>::type
It1;
It1 it1 = fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it0);
typedef typename
result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<
It1
>::type
It2;
It2 it2 = fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it1);
typedef typename
result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<
It2
>::type
It3;
It3 it3 = fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it2);
typedef typename BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<State,It0,F>::type State1;
State1 const state1=f(state,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0));
typedef typename BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<State1,It1,F>::type State2;
State2 const state2=f(state1,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it1));
typedef typename BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<State2,It2,F>::type State3;
State3 const state3=f(state2,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it2));
return BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)< return BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)<
Result Result
, N-4 , N-4
@ -98,54 +70,95 @@ namespace boost { namespace fusion
fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it3), fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it3),
f); f);
} }
};
template<typename Result> template<typename State2, typename It2, typename F>
struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)<Result,3> BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
{ static Result
call_2(State2 const& state2,It2 const& it2,F& f)
{
return call_3(
f(state2,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it2)),
fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it2),
f);
}
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return call_2(
f(state1,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it1)),
fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it1),
f);
}
template<typename State, typename It0, typename F> template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call(State const& state,It0 const& it0,F f)
{ {
typedef typename return call_1(
result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION< f(state,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0)),
It0 const fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it0),
>::type f);
It1; }
It1 it1 = fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it0); };
typedef typename
result_of::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION<
It1
>::type
It2;
It2 it2 = fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it1);
typedef typename BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<State,It0,F>::type State1;
State1 const state1=f(state,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0));
typedef typename BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<State1,It1,F>::type State2;
State2 const state2=f(state1,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it1));
template<typename Result>
struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)<Result,3>
{
template<typename State2, typename It2, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_2(State2 const& state2,It2 const& it2,F& f)
{
return f(state2,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it2)); return f(state2,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it2));
} }
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return call_2(
f(state1,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it1)),
fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it1),
f);
}
template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call(State const& state,It0 const& it0,F f)
{
return call_1(
f(state,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0)),
fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it0),
f);
}
}; };
template<typename Result> template<typename Result>
struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)<Result,2> struct BOOST_PP_CAT(unrolled_,BOOST_FUSION_FOLD_NAME)<Result,2>
{ {
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return f(state1,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it1));
}
template<typename State, typename It0, typename F> template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call(State const& state,It0 const& it0,F f)
{ {
typedef typename BOOST_PP_CAT(BOOST_FUSION_FOLD_NAME, _lvalue_state)<State,It0,F>::type State1; return call_1(
State1 const state1=f(state,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0)); f(state,BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(it0)),
fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it0),
return f( f);
state1,
BOOST_FUSION_FOLD_IMPL_INVOKE_IT_TRANSFORM(
fusion::BOOST_FUSION_FOLD_IMPL_NEXT_IT_FUNCTION(it0)));
} }
}; };

View File

@ -23,35 +23,11 @@ namespace boost { namespace fusion
template<typename Result,int N> template<typename Result,int N>
struct unrolled_fold struct unrolled_fold
{ {
template<typename State, typename It0, typename F> template<typename State3, typename It3, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call_3(State3 const& state3,It3 const& it3,F& f)
{ {
typedef typename
result_of::next<
It0 const
>::type
It1;
It1 it1 = fusion::next(it0);
typedef typename
result_of::next<
It1
>::type
It2;
It2 it2 = fusion::next(it1);
typedef typename
result_of::next<
It2
>::type
It3;
It3 it3 = fusion::next(it2);
typedef typename fold_lvalue_state<State,It0,F>::type State1;
State1 const state1=f(state,fusion::deref(it0));
typedef typename fold_lvalue_state<State1,It1,F>::type State2;
State2 const state2=f(state1,fusion::deref(it1));
typedef typename fold_lvalue_state<State2,It2,F>::type State3;
State3 const state3=f(state2,fusion::deref(it2));
return unrolled_fold< return unrolled_fold<
Result Result
, N-4 , N-4
@ -60,47 +36,87 @@ namespace boost { namespace fusion
fusion::next(it3), fusion::next(it3),
f); f);
} }
}; template<typename State2, typename It2, typename F>
template<typename Result> BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
struct unrolled_fold<Result,3> static Result
{ call_2(State2 const& state2,It2 const& it2,F& f)
{
return call_3(
f(state2,fusion::deref(it2)),
fusion::next(it2),
f);
}
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return call_2(
f(state1,fusion::deref(it1)),
fusion::next(it1),
f);
}
template<typename State, typename It0, typename F> template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call(State const& state,It0 const& it0,F f)
{ {
typedef typename return call_1(
result_of::next< f(state,fusion::deref(it0)),
It0 const fusion::next(it0),
>::type f);
It1; }
It1 it1 = fusion::next(it0); };
typedef typename template<typename Result>
result_of::next< struct unrolled_fold<Result,3>
It1 {
>::type template<typename State2, typename It2, typename F>
It2; BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
It2 it2 = fusion::next(it1); static Result
typedef typename fold_lvalue_state<State,It0,F>::type State1; call_2(State2 const& state2,It2 const& it2,F& f)
State1 const state1=f(state,fusion::deref(it0)); {
typedef typename fold_lvalue_state<State1,It1,F>::type State2;
State2 const state2=f(state1,fusion::deref(it1));
return f(state2,fusion::deref(it2)); return f(state2,fusion::deref(it2));
} }
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return call_2(
f(state1,fusion::deref(it1)),
fusion::next(it1),
f);
}
template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call(State const& state,It0 const& it0,F f)
{
return call_1(
f(state,fusion::deref(it0)),
fusion::next(it0),
f);
}
}; };
template<typename Result> template<typename Result>
struct unrolled_fold<Result,2> struct unrolled_fold<Result,2>
{ {
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return f(state1,fusion::deref(it1));
}
template<typename State, typename It0, typename F> template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call(State const& state,It0 const& it0,F f)
{ {
typedef typename fold_lvalue_state<State,It0,F>::type State1; return call_1(
State1 const state1=f(state,fusion::deref(it0)); f(state,fusion::deref(it0)),
return f( fusion::next(it0),
state1, f);
fusion::deref( fusion::next(it0)));
} }
}; };
template<typename Result> template<typename Result>

View File

@ -22,35 +22,11 @@ namespace boost { namespace fusion
template<typename Result,int N> template<typename Result,int N>
struct unrolled_iter_fold struct unrolled_iter_fold
{ {
template<typename State, typename It0, typename F> template<typename State3, typename It3, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call_3(State3 const& state3,It3 const& it3,F& f)
{ {
typedef typename
result_of::next<
It0 const
>::type
It1;
It1 it1 = fusion::next(it0);
typedef typename
result_of::next<
It1
>::type
It2;
It2 it2 = fusion::next(it1);
typedef typename
result_of::next<
It2
>::type
It3;
It3 it3 = fusion::next(it2);
typedef typename iter_fold_lvalue_state<State,It0,F>::type State1;
State1 const state1=f(state,it0);
typedef typename iter_fold_lvalue_state<State1,It1,F>::type State2;
State2 const state2=f(state1,it1);
typedef typename iter_fold_lvalue_state<State2,It2,F>::type State3;
State3 const state3=f(state2,it2);
return unrolled_iter_fold< return unrolled_iter_fold<
Result Result
, N-4 , N-4
@ -59,47 +35,87 @@ namespace boost { namespace fusion
fusion::next(it3), fusion::next(it3),
f); f);
} }
}; template<typename State2, typename It2, typename F>
template<typename Result> BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
struct unrolled_iter_fold<Result,3> static Result
{ call_2(State2 const& state2,It2 const& it2,F& f)
{
return call_3(
f(state2,it2),
fusion::next(it2),
f);
}
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return call_2(
f(state1,it1),
fusion::next(it1),
f);
}
template<typename State, typename It0, typename F> template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call(State const& state,It0 const& it0,F f)
{ {
typedef typename return call_1(
result_of::next< f(state,it0),
It0 const fusion::next(it0),
>::type f);
It1; }
It1 it1 = fusion::next(it0); };
typedef typename template<typename Result>
result_of::next< struct unrolled_iter_fold<Result,3>
It1 {
>::type template<typename State2, typename It2, typename F>
It2; BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
It2 it2 = fusion::next(it1); static Result
typedef typename iter_fold_lvalue_state<State,It0,F>::type State1; call_2(State2 const& state2,It2 const& it2,F& f)
State1 const state1=f(state,it0); {
typedef typename iter_fold_lvalue_state<State1,It1,F>::type State2;
State2 const state2=f(state1,it1);
return f(state2,it2); return f(state2,it2);
} }
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return call_2(
f(state1,it1),
fusion::next(it1),
f);
}
template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call(State const& state,It0 const& it0,F f)
{
return call_1(
f(state,it0),
fusion::next(it0),
f);
}
}; };
template<typename Result> template<typename Result>
struct unrolled_iter_fold<Result,2> struct unrolled_iter_fold<Result,2>
{ {
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return f(state1,it1);
}
template<typename State, typename It0, typename F> template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call(State const& state,It0 const& it0,F f)
{ {
typedef typename iter_fold_lvalue_state<State,It0,F>::type State1; return call_1(
State1 const state1=f(state,it0); f(state,it0),
return f( fusion::next(it0),
state1, f);
fusion::next(it0));
} }
}; };
template<typename Result> template<typename Result>

View File

@ -22,35 +22,11 @@ namespace boost { namespace fusion
template<typename Result,int N> template<typename Result,int N>
struct unrolled_reverse_fold struct unrolled_reverse_fold
{ {
template<typename State, typename It0, typename F> template<typename State3, typename It3, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call_3(State3 const& state3,It3 const& it3,F& f)
{ {
typedef typename
result_of::prior<
It0 const
>::type
It1;
It1 it1 = fusion::prior(it0);
typedef typename
result_of::prior<
It1
>::type
It2;
It2 it2 = fusion::prior(it1);
typedef typename
result_of::prior<
It2
>::type
It3;
It3 it3 = fusion::prior(it2);
typedef typename reverse_fold_lvalue_state<State,It0,F>::type State1;
State1 const state1=f(state,fusion::deref(it0));
typedef typename reverse_fold_lvalue_state<State1,It1,F>::type State2;
State2 const state2=f(state1,fusion::deref(it1));
typedef typename reverse_fold_lvalue_state<State2,It2,F>::type State3;
State3 const state3=f(state2,fusion::deref(it2));
return unrolled_reverse_fold< return unrolled_reverse_fold<
Result Result
, N-4 , N-4
@ -59,47 +35,87 @@ namespace boost { namespace fusion
fusion::prior(it3), fusion::prior(it3),
f); f);
} }
}; template<typename State2, typename It2, typename F>
template<typename Result> BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
struct unrolled_reverse_fold<Result,3> static Result
{ call_2(State2 const& state2,It2 const& it2,F& f)
{
return call_3(
f(state2,fusion::deref(it2)),
fusion::prior(it2),
f);
}
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return call_2(
f(state1,fusion::deref(it1)),
fusion::prior(it1),
f);
}
template<typename State, typename It0, typename F> template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call(State const& state,It0 const& it0,F f)
{ {
typedef typename return call_1(
result_of::prior< f(state,fusion::deref(it0)),
It0 const fusion::prior(it0),
>::type f);
It1; }
It1 it1 = fusion::prior(it0); };
typedef typename template<typename Result>
result_of::prior< struct unrolled_reverse_fold<Result,3>
It1 {
>::type template<typename State2, typename It2, typename F>
It2; BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
It2 it2 = fusion::prior(it1); static Result
typedef typename reverse_fold_lvalue_state<State,It0,F>::type State1; call_2(State2 const& state2,It2 const& it2,F& f)
State1 const state1=f(state,fusion::deref(it0)); {
typedef typename reverse_fold_lvalue_state<State1,It1,F>::type State2;
State2 const state2=f(state1,fusion::deref(it1));
return f(state2,fusion::deref(it2)); return f(state2,fusion::deref(it2));
} }
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return call_2(
f(state1,fusion::deref(it1)),
fusion::prior(it1),
f);
}
template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call(State const& state,It0 const& it0,F f)
{
return call_1(
f(state,fusion::deref(it0)),
fusion::prior(it0),
f);
}
}; };
template<typename Result> template<typename Result>
struct unrolled_reverse_fold<Result,2> struct unrolled_reverse_fold<Result,2>
{ {
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return f(state1,fusion::deref(it1));
}
template<typename State, typename It0, typename F> template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call(State const& state,It0 const& it0,F f)
{ {
typedef typename reverse_fold_lvalue_state<State,It0,F>::type State1; return call_1(
State1 const state1=f(state,fusion::deref(it0)); f(state,fusion::deref(it0)),
return f( fusion::prior(it0),
state1, f);
fusion::deref( fusion::prior(it0)));
} }
}; };
template<typename Result> template<typename Result>

View File

@ -22,35 +22,11 @@ namespace boost { namespace fusion
template<typename Result,int N> template<typename Result,int N>
struct unrolled_reverse_iter_fold struct unrolled_reverse_iter_fold
{ {
template<typename State, typename It0, typename F> template<typename State3, typename It3, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call_3(State3 const& state3,It3 const& it3,F& f)
{ {
typedef typename
result_of::prior<
It0 const
>::type
It1;
It1 it1 = fusion::prior(it0);
typedef typename
result_of::prior<
It1
>::type
It2;
It2 it2 = fusion::prior(it1);
typedef typename
result_of::prior<
It2
>::type
It3;
It3 it3 = fusion::prior(it2);
typedef typename reverse_iter_fold_lvalue_state<State,It0,F>::type State1;
State1 const state1=f(state,it0);
typedef typename reverse_iter_fold_lvalue_state<State1,It1,F>::type State2;
State2 const state2=f(state1,it1);
typedef typename reverse_iter_fold_lvalue_state<State2,It2,F>::type State3;
State3 const state3=f(state2,it2);
return unrolled_reverse_iter_fold< return unrolled_reverse_iter_fold<
Result Result
, N-4 , N-4
@ -59,47 +35,87 @@ namespace boost { namespace fusion
fusion::prior(it3), fusion::prior(it3),
f); f);
} }
}; template<typename State2, typename It2, typename F>
template<typename Result> BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
struct unrolled_reverse_iter_fold<Result,3> static Result
{ call_2(State2 const& state2,It2 const& it2,F& f)
{
return call_3(
f(state2,it2),
fusion::prior(it2),
f);
}
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return call_2(
f(state1,it1),
fusion::prior(it1),
f);
}
template<typename State, typename It0, typename F> template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call(State const& state,It0 const& it0,F f)
{ {
typedef typename return call_1(
result_of::prior< f(state,it0),
It0 const fusion::prior(it0),
>::type f);
It1; }
It1 it1 = fusion::prior(it0); };
typedef typename template<typename Result>
result_of::prior< struct unrolled_reverse_iter_fold<Result,3>
It1 {
>::type template<typename State2, typename It2, typename F>
It2; BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
It2 it2 = fusion::prior(it1); static Result
typedef typename reverse_iter_fold_lvalue_state<State,It0,F>::type State1; call_2(State2 const& state2,It2 const& it2,F& f)
State1 const state1=f(state,it0); {
typedef typename reverse_iter_fold_lvalue_state<State1,It1,F>::type State2;
State2 const state2=f(state1,it1);
return f(state2,it2); return f(state2,it2);
} }
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return call_2(
f(state1,it1),
fusion::prior(it1),
f);
}
template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call(State const& state,It0 const& it0,F f)
{
return call_1(
f(state,it0),
fusion::prior(it0),
f);
}
}; };
template<typename Result> template<typename Result>
struct unrolled_reverse_iter_fold<Result,2> struct unrolled_reverse_iter_fold<Result,2>
{ {
template<typename State1, typename It1, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result
call_1(State1 const& state1,It1 const& it1,F& f)
{
return f(state1,it1);
}
template<typename State, typename It0, typename F> template<typename State, typename It0, typename F>
BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED BOOST_CONSTEXPR BOOST_FUSION_GPU_ENABLED
static Result static Result
call(State const& state,It0 const& it0,F f) call(State const& state,It0 const& it0,F f)
{ {
typedef typename reverse_iter_fold_lvalue_state<State,It0,F>::type State1; return call_1(
State1 const state1=f(state,it0); f(state,it0),
return f( fusion::prior(it0),
state1, f);
fusion::prior(it0));
} }
}; };
template<typename Result> template<typename Result>