diff --git a/include/boost/fusion/algorithm/iteration/detail/fold.hpp b/include/boost/fusion/algorithm/iteration/detail/fold.hpp index b2bec5b0..98c78aaf 100644 --- a/include/boost/fusion/algorithm/iteration/detail/fold.hpp +++ b/include/boost/fusion/algorithm/iteration/detail/fold.hpp @@ -81,7 +81,10 @@ namespace detail I2 i2 = fusion::next(i1); typedef typename result_of::next::type I3; I3 i3 = fusion::next(i2); - return f(*i0, f(*i1, f(*i2, unrolled_fold::call(i3, state, f)))); + typedef typename result_of::next::type I4; + I4 i4 = fusion::next(i3); + + return unrolled_fold::call(i4, f(*i3, f(*i2, f(*i1, f(*i0, state)))), f); } }; @@ -96,7 +99,7 @@ namespace detail I1 i1 = fusion::next(i0); typedef typename result_of::next::type I2; I2 i2 = fusion::next(i1); - return f(*i0, f(*i1, f(*i2, state))); + return f(*i2, f(*i1, f(*i0, state))); } }; @@ -109,7 +112,7 @@ namespace detail { typedef typename result_of::next::type I1; I1 i1 = fusion::next(i0); - return f(*i0, f(*i1, state)); + return f(*i1, f(*i0, state)); } }; @@ -168,11 +171,12 @@ namespace detail typedef typename result_of::next::type I2; typedef typename result_of::next::type I3; typedef typename result_of::next::type I4; - typedef typename result_of_unrolled_fold::type Rest; - typedef typename fold_apply::type Rest2; + typedef typename fold_apply::type Rest1; + typedef typename fold_apply::type Rest2; typedef typename fold_apply::type Rest3; - typedef typename fold_apply::type Rest4; - typedef typename fold_apply::type type; + typedef typename fold_apply::type Rest4; + + typedef typename result_of_unrolled_fold::type type; }; template @@ -180,17 +184,17 @@ namespace detail { typedef typename result_of::next::type I1; typedef typename result_of::next::type I2; - typedef typename fold_apply::type Rest; + typedef typename fold_apply::type Rest; typedef typename fold_apply::type Rest2; - typedef typename fold_apply::type type; + typedef typename fold_apply::type type; }; template struct result_of_unrolled_fold { typedef typename result_of::next::type I1; - typedef typename fold_apply::type Rest; - typedef typename fold_apply::type type; + typedef typename fold_apply::type Rest; + typedef typename fold_apply::type type; }; template