From b63c8214d73dab3d2c9c92a9bfbd43b6de5f49a7 Mon Sep 17 00:00:00 2001 From: Joel de Guzman Date: Mon, 14 May 2012 00:37:21 +0000 Subject: [PATCH] Patches from Nathan Ridge using SFINAE to disable the Fusion algorithms for non-{Fusion sequence} types [SVN r78463] --- .../boost/fusion/algorithm/auxiliary/copy.hpp | 13 ++++++- .../fusion/algorithm/iteration/accumulate.hpp | 16 +++++++-- .../algorithm/iteration/accumulate_fwd.hpp | 15 ++++++-- .../fusion/algorithm/iteration/for_each.hpp | 16 +++++++-- .../algorithm/iteration/for_each_fwd.hpp | 17 +++++++-- .../boost/fusion/algorithm/query/count.hpp | 9 ++++- .../boost/fusion/algorithm/query/count_if.hpp | 9 ++++- .../fusion/algorithm/transformation/erase.hpp | 35 ++++++++++++++++--- .../algorithm/transformation/insert.hpp | 10 ++++-- .../algorithm/transformation/push_back.hpp | 9 ++++- .../algorithm/transformation/push_front.hpp | 9 ++++- .../algorithm/transformation/replace.hpp | 9 ++++- .../algorithm/transformation/replace_if.hpp | 8 ++++- .../algorithm/transformation/reverse.hpp | 9 ++++- .../detail/segmented_iterator_range.hpp | 14 ++++++-- 15 files changed, 174 insertions(+), 24 deletions(-) diff --git a/include/boost/fusion/algorithm/auxiliary/copy.hpp b/include/boost/fusion/algorithm/auxiliary/copy.hpp index 2720627c..fd866468 100644 --- a/include/boost/fusion/algorithm/auxiliary/copy.hpp +++ b/include/boost/fusion/algorithm/auxiliary/copy.hpp @@ -11,8 +11,11 @@ #include #include #include +#include #include #include +#include +#include #if defined (BOOST_MSVC) # pragma warning(push) @@ -54,7 +57,15 @@ namespace boost { namespace fusion } template - inline void + inline + typename + enable_if_c< + type_traits::ice_and< + traits::is_sequence::value + , traits::is_sequence::value + >::value, + void + >::type copy(Seq1 const& src, Seq2& dest) { BOOST_STATIC_ASSERT( diff --git a/include/boost/fusion/algorithm/iteration/accumulate.hpp b/include/boost/fusion/algorithm/iteration/accumulate.hpp index a8d6a357..4b676dea 100644 --- a/include/boost/fusion/algorithm/iteration/accumulate.hpp +++ b/include/boost/fusion/algorithm/iteration/accumulate.hpp @@ -9,6 +9,8 @@ #include #include +#include +#include namespace boost { namespace fusion { @@ -23,14 +25,24 @@ namespace boost { namespace fusion } template - inline typename result_of::accumulate::type + inline + typename + lazy_enable_if< + traits::is_sequence + , result_of::accumulate + >::type accumulate(Sequence& seq, State const& state, F f) { return fusion::fold(seq, state, f); } template - inline typename result_of::accumulate::type + inline + typename + lazy_enable_if< + traits::is_sequence + , result_of::accumulate + >::type accumulate(Sequence const& seq, State const& state, F f) { return fusion::fold(seq, state, f); diff --git a/include/boost/fusion/algorithm/iteration/accumulate_fwd.hpp b/include/boost/fusion/algorithm/iteration/accumulate_fwd.hpp index 9c0bd115..a4ca316c 100644 --- a/include/boost/fusion/algorithm/iteration/accumulate_fwd.hpp +++ b/include/boost/fusion/algorithm/iteration/accumulate_fwd.hpp @@ -7,6 +7,9 @@ #if !defined(BOOST_FUSION_ACCUMULATE_FWD_HPP_INCLUDED) #define BOOST_FUSION_ACCUMULATE_FWD_HPP_INCLUDED +#include +#include + namespace boost { namespace fusion { namespace result_of @@ -16,11 +19,19 @@ namespace boost { namespace fusion } template - typename result_of::accumulate::type + typename + lazy_enable_if< + traits::is_sequence + , result_of::accumulate + >::type accumulate(Sequence& seq, State const& state, F f); template - typename result_of::accumulate::type + typename + lazy_enable_if< + traits::is_sequence + , result_of::accumulate + >::type accumulate(Sequence const& seq, State const& state, F f); }} diff --git a/include/boost/fusion/algorithm/iteration/for_each.hpp b/include/boost/fusion/algorithm/iteration/for_each.hpp index ab8b8f0e..17cde34a 100644 --- a/include/boost/fusion/algorithm/iteration/for_each.hpp +++ b/include/boost/fusion/algorithm/iteration/for_each.hpp @@ -11,6 +11,8 @@ #include #include #include +#include +#include namespace boost { namespace fusion { @@ -24,14 +26,24 @@ namespace boost { namespace fusion } template - inline void + inline + typename + enable_if< + traits::is_sequence + , void + >::type for_each(Sequence& seq, F const& f) { detail::for_each(seq, f, typename traits::is_segmented::type()); } template - inline void + inline + typename + enable_if< + traits::is_sequence + , void + >::type for_each(Sequence const& seq, F const& f) { detail::for_each(seq, f, typename traits::is_segmented::type()); diff --git a/include/boost/fusion/algorithm/iteration/for_each_fwd.hpp b/include/boost/fusion/algorithm/iteration/for_each_fwd.hpp index 544915d9..b757873e 100644 --- a/include/boost/fusion/algorithm/iteration/for_each_fwd.hpp +++ b/include/boost/fusion/algorithm/iteration/for_each_fwd.hpp @@ -7,6 +7,9 @@ #if !defined(BOOST_FUSION_FOR_EACH_FWD_HPP_INCLUDED) #define BOOST_FUSION_FOR_EACH_FWD_HPP_INCLUDED +#include +#include + namespace boost { namespace fusion { namespace result_of @@ -16,11 +19,21 @@ namespace boost { namespace fusion } template - void + inline + typename + enable_if< + traits::is_sequence + , void + >::type for_each(Sequence& seq, F const& f); template - void + inline + typename + enable_if< + traits::is_sequence + , void + >::type for_each(Sequence const& seq, F const& f); }} diff --git a/include/boost/fusion/algorithm/query/count.hpp b/include/boost/fusion/algorithm/query/count.hpp index ade58671..04887163 100644 --- a/include/boost/fusion/algorithm/query/count.hpp +++ b/include/boost/fusion/algorithm/query/count.hpp @@ -10,6 +10,8 @@ #include #include +#include +#include namespace boost { namespace fusion { @@ -23,7 +25,12 @@ namespace boost { namespace fusion } template - inline int + inline + typename + enable_if< + traits::is_sequence + , int + >::type count(Sequence const& seq, T const& x) { detail::count_compare f(x); diff --git a/include/boost/fusion/algorithm/query/count_if.hpp b/include/boost/fusion/algorithm/query/count_if.hpp index 51112cf0..79297973 100644 --- a/include/boost/fusion/algorithm/query/count_if.hpp +++ b/include/boost/fusion/algorithm/query/count_if.hpp @@ -10,6 +10,8 @@ #include #include +#include +#include namespace boost { namespace fusion { @@ -23,7 +25,12 @@ namespace boost { namespace fusion } template - inline int + inline + typename + enable_if< + traits::is_sequence + , int + >::type count_if(Sequence const& seq, F f) { return detail::count_if( diff --git a/include/boost/fusion/algorithm/transformation/erase.hpp b/include/boost/fusion/algorithm/transformation/erase.hpp index 304ed4c5..6ad737fd 100644 --- a/include/boost/fusion/algorithm/transformation/erase.hpp +++ b/include/boost/fusion/algorithm/transformation/erase.hpp @@ -16,6 +16,9 @@ #include #include #include +#include +#include +#include namespace boost { namespace fusion { @@ -53,18 +56,38 @@ namespace boost { namespace fusion } }; + struct use_default; + + template + struct fusion_default_help + : mpl::if_< + is_same + , Default + , T + > + { + }; + template < typename Sequence , typename First - , typename Last = typename compute_erase_last::type> + , typename Last = use_default> struct erase { typedef typename result_of::begin::type seq_first_type; typedef typename result_of::end::type seq_last_type; BOOST_STATIC_ASSERT((!result_of::equal_to::value)); - typedef typename convert_iterator::type first_type; - typedef typename convert_iterator::type last_type; + typedef First FirstType; + typedef typename + fusion_default_help< + Last + , typename compute_erase_last::type + >::type + LastType; + + typedef typename convert_iterator::type first_type; + typedef typename convert_iterator::type last_type; typedef iterator_range left_type; typedef iterator_range right_type; typedef joint_view type; @@ -72,7 +95,11 @@ namespace boost { namespace fusion } template - typename result_of::erase::type + typename + lazy_enable_if< + traits::is_sequence + , typename result_of::erase + >::type erase(Sequence const& seq, First const& first) { typedef result_of::erase result_of; diff --git a/include/boost/fusion/algorithm/transformation/insert.hpp b/include/boost/fusion/algorithm/transformation/insert.hpp index ac5bca38..2052fc01 100644 --- a/include/boost/fusion/algorithm/transformation/insert.hpp +++ b/include/boost/fusion/algorithm/transformation/insert.hpp @@ -16,6 +16,8 @@ #include #include #include +#include +#include namespace boost { namespace fusion { @@ -38,8 +40,12 @@ namespace boost { namespace fusion } template - inline typename result_of::insert< - Sequence const, Position, T>::type + inline + typename + lazy_enable_if< + traits::is_sequence + , result_of::insert + >::type insert(Sequence const& seq, Position const& pos, T const& x) { typedef result_of::insert< diff --git a/include/boost/fusion/algorithm/transformation/push_back.hpp b/include/boost/fusion/algorithm/transformation/push_back.hpp index 00a01a80..9afe538a 100644 --- a/include/boost/fusion/algorithm/transformation/push_back.hpp +++ b/include/boost/fusion/algorithm/transformation/push_back.hpp @@ -10,6 +10,8 @@ #include #include #include +#include +#include namespace boost { namespace fusion { @@ -24,7 +26,12 @@ namespace boost { namespace fusion } template - inline typename result_of::push_back::type + inline + typename + lazy_enable_if< + traits::is_sequence + , result_of::push_back + >::type push_back(Sequence const& seq, T const& x) { typedef typename result_of::push_back push_back; diff --git a/include/boost/fusion/algorithm/transformation/push_front.hpp b/include/boost/fusion/algorithm/transformation/push_front.hpp index d08ad279..abe7faad 100644 --- a/include/boost/fusion/algorithm/transformation/push_front.hpp +++ b/include/boost/fusion/algorithm/transformation/push_front.hpp @@ -10,6 +10,8 @@ #include #include #include +#include +#include namespace boost { namespace fusion { @@ -24,7 +26,12 @@ namespace boost { namespace fusion } template - inline typename result_of::push_front::type + inline + typename + lazy_enable_if< + traits::is_sequence + , result_of::push_front + >::type push_front(Sequence const& seq, T const& x) { typedef typename result_of::push_front push_front; diff --git a/include/boost/fusion/algorithm/transformation/replace.hpp b/include/boost/fusion/algorithm/transformation/replace.hpp index bfe186e5..a92e6e37 100644 --- a/include/boost/fusion/algorithm/transformation/replace.hpp +++ b/include/boost/fusion/algorithm/transformation/replace.hpp @@ -9,6 +9,8 @@ #include #include +#include +#include namespace boost { namespace fusion { @@ -22,7 +24,12 @@ namespace boost { namespace fusion } template - inline typename result_of::replace::type + inline + typename + enable_if< + traits::is_sequence + , typename result_of::replace::type + >::type replace(Sequence const& seq, T const& old_value, T const& new_value) { typedef typename result_of::replace::type result; diff --git a/include/boost/fusion/algorithm/transformation/replace_if.hpp b/include/boost/fusion/algorithm/transformation/replace_if.hpp index 29913436..39b9009a 100644 --- a/include/boost/fusion/algorithm/transformation/replace_if.hpp +++ b/include/boost/fusion/algorithm/transformation/replace_if.hpp @@ -9,6 +9,7 @@ #include #include +#include #include #include @@ -24,7 +25,12 @@ namespace boost { namespace fusion } template - inline typename result_of::replace_if::type + inline + typename + enable_if< + traits::is_sequence + , typename result_of::replace_if::type + >::type replace_if(Sequence const& seq, F pred, T const& new_value) { typedef typename result_of::replace_if::type result; diff --git a/include/boost/fusion/algorithm/transformation/reverse.hpp b/include/boost/fusion/algorithm/transformation/reverse.hpp index 23c4fe65..923b90fc 100644 --- a/include/boost/fusion/algorithm/transformation/reverse.hpp +++ b/include/boost/fusion/algorithm/transformation/reverse.hpp @@ -8,6 +8,8 @@ #define FUSION_REVERSE_07212005_1230 #include +#include +#include namespace boost { namespace fusion { @@ -21,7 +23,12 @@ namespace boost { namespace fusion } template - inline reverse_view + inline + typename + enable_if< + traits::is_sequence + , reverse_view + >::type reverse(Sequence const& view) { return reverse_view(view); diff --git a/include/boost/fusion/view/iterator_range/detail/segmented_iterator_range.hpp b/include/boost/fusion/view/iterator_range/detail/segmented_iterator_range.hpp index 489d9553..9bf459c4 100644 --- a/include/boost/fusion/view/iterator_range/detail/segmented_iterator_range.hpp +++ b/include/boost/fusion/view/iterator_range/detail/segmented_iterator_range.hpp @@ -21,6 +21,8 @@ #include #include #include +#include +#include // Invariants: // - Each segmented iterator has a stack @@ -45,11 +47,19 @@ namespace boost { namespace fusion } template - typename result_of::push_back::type + typename + lazy_enable_if< + traits::is_sequence + , result_of::push_back + >::type push_back(Sequence const& seq, T const& x); template - typename result_of::push_front::type + typename + lazy_enable_if< + traits::is_sequence + , result_of::push_front + >::type push_front(Sequence const& seq, T const& x); }}