diff --git a/include/boost/fusion/algorithm/iteration/ext_/fold_s.hpp b/include/boost/fusion/algorithm/iteration/ext_/fold_s.hpp index 9e9c3456..ce0f7434 100644 --- a/include/boost/fusion/algorithm/iteration/ext_/fold_s.hpp +++ b/include/boost/fusion/algorithm/iteration/ext_/fold_s.hpp @@ -15,34 +15,24 @@ namespace boost { namespace fusion { namespace detail template struct segmented_fold_fun { - template - struct result; - - template - struct result - { - typedef - fusion::result< - typename result_of::fold::type, - continue_ - > - type; - }; - explicit segmented_fold_fun(Fun const& f) : fun(f) {} - template - typename result::type - operator()(Sequence& seq, State const& state, Context const&) const - { - return fusion::fold(seq, state, fun); - } - Fun const& fun; - }; + template + struct apply + { + typedef typename result_of::fold::type type; + typedef mpl::true_ continue_type; + + static type call(Sequence& seq, State const& state, Context const&, segmented_fold_fun const& fun) + { + return fusion::fold(seq, state, fun.fun); + } + }; + }; }}} namespace boost { namespace fusion diff --git a/include/boost/fusion/algorithm/iteration/ext_/for_each_s.hpp b/include/boost/fusion/algorithm/iteration/ext_/for_each_s.hpp index 8158a986..4ea4b141 100644 --- a/include/boost/fusion/algorithm/iteration/ext_/for_each_s.hpp +++ b/include/boost/fusion/algorithm/iteration/ext_/for_each_s.hpp @@ -16,22 +16,25 @@ namespace boost { namespace fusion { namespace detail template struct segmented_for_each_fun { - typedef result result_type; - explicit segmented_for_each_fun(Fun const& f) : fun(f) {} - template - result_type operator()(Sequence& seq, State const&, Context const&) const - { - fusion::for_each(seq, fun); - return void_(); - } - Fun const& fun; - }; + template + struct apply + { + typedef void_ type; + typedef mpl::true_ continue_type; + + static type call(Sequence& seq, State const&, Context const&, segmented_for_each_fun const& fun) + { + fusion::for_each(seq, fun.fun); + return void_(); + } + }; + }; }}} namespace boost { namespace fusion diff --git a/include/boost/fusion/algorithm/query/detail/segmented_find.hpp b/include/boost/fusion/algorithm/query/detail/segmented_find.hpp index 8429022e..ead57834 100644 --- a/include/boost/fusion/algorithm/query/detail/segmented_find.hpp +++ b/include/boost/fusion/algorithm/query/detail/segmented_find.hpp @@ -7,7 +7,8 @@ #if !defined(BOOST_FUSION_SEGMENTED_FIND_HPP_INCLUDED) #define BOOST_FUSION_SEGMENTED_FIND_HPP_INCLUDED -#include +#include +#include #include #include #include @@ -18,63 +19,46 @@ namespace boost { namespace fusion { namespace detail template struct segmented_find_fun { - template - struct result; - - template - struct result + template + struct apply { typedef typename result_of::find::type iterator_type; - typedef - typename result_of::make_segmented_iterator< - iterator_type - , typename remove_const::type - >::type - segmented_iterator_type; - - typedef - typename mpl::if_< - result_of::equal_to< - iterator_type - , typename result_of::end::type - > - , fusion::result::type, continue_>, // NOT FOUND - fusion::result // FOUND - >::type - type; - }; - - template - typename result::type - operator()(Sequence& seq, State const&state, Context const& context) const - { typedef typename result_of::equal_to< - typename result_of::find::type + iterator_type , typename result_of::end::type >::type - not_found; + continue_type; - return call(seq, state, context, not_found()); - } + typedef + typename mpl::eval_if< + continue_type + , mpl::identity + , result_of::make_segmented_iterator< + iterator_type + , Context + > + >::type + type; - private: - template - typename result::type - call(Sequence&, State const&state, Context const&, mpl::true_) const - { - return state; - } + static type call(Sequence& seq, State const&state, Context const& context, segmented_find_fun) + { + return call_impl(seq, state, context, continue_type()); + } - template - typename result::type - call(Sequence& seq, State const&, Context const& context, mpl::false_) const - { - return fusion::make_segmented_iterator(fusion::find(seq), context); - } + static type call_impl(Sequence&, State const&state, Context const&, mpl::true_) + { + return state; + } + + static type call_impl(Sequence& seq, State const&, Context const& context, mpl::false_) + { + return fusion::make_segmented_iterator(fusion::find(seq), context); + } + }; }; template diff --git a/include/boost/fusion/algorithm/query/detail/segmented_find_if.hpp b/include/boost/fusion/algorithm/query/detail/segmented_find_if.hpp index bdbbcfbc..745edd2f 100644 --- a/include/boost/fusion/algorithm/query/detail/segmented_find_if.hpp +++ b/include/boost/fusion/algorithm/query/detail/segmented_find_if.hpp @@ -7,9 +7,8 @@ #if !defined(BOOST_FUSION_SEGMENTED_FIND_IF_HPP_INCLUDED) #define BOOST_FUSION_SEGMENTED_FIND_IF_HPP_INCLUDED -#include -#include -#include +#include +#include #include #include #include @@ -20,63 +19,46 @@ namespace boost { namespace fusion { namespace detail template struct segmented_find_if_fun { - template - struct result; - - template - struct result + template + struct apply { typedef typename result_of::find_if::type iterator_type; - typedef - typename result_of::make_segmented_iterator< - iterator_type - , typename remove_const::type - >::type - segmented_iterator_type; - - typedef - typename mpl::if_< - result_of::equal_to< - iterator_type - , typename result_of::end::type - > - , fusion::result::type, continue_>, // NOT FOUND - fusion::result // FOUND - >::type - type; - }; - - template - typename result::type - operator()(Sequence& seq, State const& state, Context const& context) const - { typedef typename result_of::equal_to< - typename result_of::find_if::type + iterator_type , typename result_of::end::type >::type - not_found; + continue_type; - return call(seq, state, context, not_found()); - } + typedef + typename mpl::eval_if< + continue_type + , mpl::identity + , result_of::make_segmented_iterator< + iterator_type + , Context + > + >::type + type; - private: - template - typename result::type - call(Sequence&, State const& state, Context const&, mpl::true_) const - { - return state; - } + static type call(Sequence& seq, State const&state, Context const& context, segmented_find_if_fun) + { + return call_impl(seq, state, context, continue_type()); + } - template - typename result::type - call(Sequence& seq, State const&, Context const& context, mpl::false_) const - { - return fusion::make_segmented_iterator(fusion::find_if(seq), context); - } + static type call_impl(Sequence&, State const&state, Context const&, mpl::true_) + { + return state; + } + + static type call_impl(Sequence& seq, State const&, Context const& context, mpl::false_) + { + return fusion::make_segmented_iterator(fusion::find_if(seq), context); + } + }; }; template diff --git a/include/boost/fusion/sequence/intrinsic/detail/segmented_begin_impl.hpp b/include/boost/fusion/sequence/intrinsic/detail/segmented_begin_impl.hpp index 5968cd12..50694327 100644 --- a/include/boost/fusion/sequence/intrinsic/detail/segmented_begin_impl.hpp +++ b/include/boost/fusion/sequence/intrinsic/detail/segmented_begin_impl.hpp @@ -24,30 +24,8 @@ namespace boost { namespace fusion { namespace detail { struct segmented_begin_fun { - template - struct result; - - template - struct result - { - typedef - iterator_range< - typename fusion::result_of::begin::type - , typename fusion::result_of::end::type - > - range_type; - - typedef - fusion::result< - cons::type> - , fusion::break_ - > - type; - }; - template - typename result::type - operator()(Sequence& seq, State const&, Context const& context) const + struct apply { typedef iterator_range< @@ -56,8 +34,14 @@ namespace boost { namespace fusion { namespace detail > range_type; - return cons(range_type(fusion::begin(seq), fusion::end(seq)), context); - } + typedef cons type; + typedef mpl::false_ continue_type; + + static type call(Sequence& seq, State const&, Context const& context, segmented_begin_fun) + { + return type(range_type(fusion::begin(seq), fusion::end(seq)), context); + } + }; }; template ::type::value> @@ -70,17 +54,17 @@ namespace boost { namespace fusion { namespace detail typedef segmented_fold_until_impl< Sequence - , result + , typename end_impl::type , Stack , segmented_begin_fun > fold_impl; - typedef typename fold_impl::type::value_type type; + typedef typename fold_impl::type type; static type call(Sequence& seq, Stack const& stack) { - return fold_impl::call(seq, end_impl::call(seq, stack), stack, segmented_begin_fun()).value; + return fold_impl::call(seq, end_impl::call(seq, stack), stack, segmented_begin_fun()); } }; diff --git a/include/boost/fusion/support/detail/segmented_fold_until_impl.hpp b/include/boost/fusion/support/detail/segmented_fold_until_impl.hpp index 38d68fc0..344db69a 100644 --- a/include/boost/fusion/support/detail/segmented_fold_until_impl.hpp +++ b/include/boost/fusion/support/detail/segmented_fold_until_impl.hpp @@ -75,46 +75,6 @@ namespace boost { namespace fusion return type(cons(range_type(cur, fusion::end(*context.car.first)), context)); } - typedef mpl::true_ continue_; - typedef mpl::false_ break_; - - template - struct result - { - typedef Value value_type; - typedef Continue continue_type; - - result(Value const& val) - : value(val) - {} - - value_type value; - }; - - template - struct result - { - typedef void_ value_type; - typedef Continue continue_type; - - result(void_ const&) - {} - - value_type value; - }; - - template - result make_result_continue(Value const& val) - { - return result(val); - } - - template - result make_result_break(Value const& val) - { - return result(val); - } - namespace detail { template < @@ -125,7 +85,8 @@ namespace boost { namespace fusion , typename Fun , bool IsEmpty = result_of::empty< typename result_of::value_of::type - >::type::value> + >::type::value + > struct segmented_fold_until_iterate_skip_empty; template < @@ -134,7 +95,8 @@ namespace boost { namespace fusion , typename State , typename Context , typename Fun - , bool IsDone = result_of::equal_to::type::value> + , bool IsDone = result_of::equal_to::type::value + > struct segmented_fold_until_iterate; template < @@ -142,7 +104,8 @@ namespace boost { namespace fusion , typename State , typename Context , typename Fun - , bool IsSegmented = traits::is_segmented::type::value> + , bool IsSegmented = traits::is_segmented::type::value + > struct segmented_fold_until_impl; template @@ -187,7 +150,8 @@ namespace boost { namespace fusion , typename State , typename Context , typename Fun - , bool IsSegmented> + , bool IsSegmented + > struct segmented_fold_until_impl { typedef @@ -204,6 +168,7 @@ namespace boost { namespace fusion impl; typedef typename impl::type type; + typedef typename impl::continue_type continue_type; static type call(Sequence& seq, State const& state, Context const& context, Fun const& fun) { @@ -215,20 +180,20 @@ namespace boost { namespace fusion typename Sequence , typename State , typename Context - , typename Fun> + , typename Fun + > struct segmented_fold_until_impl { typedef - typename boost::result_of::type>::type - , Context const& - )>::type - type; - + typename Fun::template apply + apply_type; + + typedef typename apply_type::type type; + typedef typename apply_type::continue_type continue_type; + static type call(Sequence& seq, State const& state, Context const& context, Fun const& fun) { - return fun(seq, state.value, context); + return apply_type::call(seq, state, context, fun); } }; @@ -246,6 +211,12 @@ namespace boost { namespace fusion // } //} + template + struct continue_wrap + { + typedef typename Apply::continue_type type; + }; + template struct segmented_fold_until_iterate_skip_empty { @@ -287,16 +258,24 @@ namespace boost { namespace fusion typedef typename mpl::eval_if< - typename next_state_type::continue_type + typename fold_recurse_impl::continue_type , next_iteration_impl , mpl::identity >::type type; + typedef + typename mpl::eval_if< + typename fold_recurse_impl::continue_type + , continue_wrap + , mpl::identity + >::type + continue_type; + static type call(Begin const& beg, End const& end, State const& state , Context const& context, Fun const& fun) { - return call(beg, end, state, context, fun, typename next_state_type::continue_type()); + return call(beg, end, state, context, fun, typename fold_recurse_impl::continue_type()); } static type call(Begin const& beg, End const& end, State const& state @@ -339,6 +318,7 @@ namespace boost { namespace fusion impl; typedef typename impl::type type; + typedef typename impl::continue_type continue_type; static type call(Begin const& beg, End const& end, State const& state , Context const& context, Fun const& fun) @@ -355,6 +335,7 @@ namespace boost { namespace fusion impl; typedef typename impl::type type; + typedef typename impl::continue_type continue_type; static type call(Begin const& beg, End const& end, State const& state , Context const& context, Fun const& fun) @@ -367,6 +348,7 @@ namespace boost { namespace fusion struct segmented_fold_until_iterate { typedef State type; + typedef mpl::true_ continue_type; static type call(Begin const&, End const&, State const& state , Context const&, Fun const&) @@ -389,6 +371,7 @@ namespace boost { namespace fusion impl; typedef typename impl::type type; + typedef typename impl::continue_type continue_type; static type call(Segments& segs, State const& state, Context const& context, Fun const& fun) { diff --git a/include/boost/fusion/support/segmented_fold_until.hpp b/include/boost/fusion/support/segmented_fold_until.hpp index 15f51707..6ea58ac6 100644 --- a/include/boost/fusion/support/segmented_fold_until.hpp +++ b/include/boost/fusion/support/segmented_fold_until.hpp @@ -31,14 +31,14 @@ namespace boost { namespace fusion typedef detail::segmented_fold_until_impl< Sequence - , result + , State , fusion::nil , Fun > filter; typedef - typename filter::type::value_type + typename filter::type type; }; } @@ -55,7 +55,7 @@ namespace boost { namespace fusion typename result_of::segmented_fold_until::filter filter; - return filter::call(seq, state, fusion::nil(), fun).value; + return filter::call(seq, state, fusion::nil(), fun); } template @@ -66,7 +66,7 @@ namespace boost { namespace fusion typename result_of::segmented_fold_until::filter filter; - return filter::call(seq, state, fusion::nil(), fun).value; + return filter::call(seq, state, fusion::nil(), fun); } }}