diff options
Diffstat (limited to 'boost/fusion/algorithm/transformation')
7 files changed, 78 insertions, 11 deletions
diff --git a/boost/fusion/algorithm/transformation/erase.hpp b/boost/fusion/algorithm/transformation/erase.hpp index 304ed4c51e..6ad737fd18 100644 --- a/boost/fusion/algorithm/transformation/erase.hpp +++ b/boost/fusion/algorithm/transformation/erase.hpp @@ -16,6 +16,9 @@ #include <boost/fusion/sequence/intrinsic/begin.hpp> #include <boost/fusion/sequence/intrinsic/end.hpp> #include <boost/fusion/adapted/mpl/mpl_iterator.hpp> +#include <boost/fusion/support/is_sequence.hpp> +#include <boost/utility/enable_if.hpp> +#include <boost/mpl/if.hpp> namespace boost { namespace fusion { @@ -53,18 +56,38 @@ namespace boost { namespace fusion } }; + struct use_default; + + template <class T, class Default> + struct fusion_default_help + : mpl::if_< + is_same<T, use_default> + , Default + , T + > + { + }; + template < typename Sequence , typename First - , typename Last = typename compute_erase_last<Sequence, First>::type> + , typename Last = use_default> struct erase { typedef typename result_of::begin<Sequence>::type seq_first_type; typedef typename result_of::end<Sequence>::type seq_last_type; BOOST_STATIC_ASSERT((!result_of::equal_to<seq_first_type, seq_last_type>::value)); - typedef typename convert_iterator<First>::type first_type; - typedef typename convert_iterator<Last>::type last_type; + typedef First FirstType; + typedef typename + fusion_default_help< + Last + , typename compute_erase_last<Sequence, First>::type + >::type + LastType; + + typedef typename convert_iterator<FirstType>::type first_type; + typedef typename convert_iterator<LastType>::type last_type; typedef iterator_range<seq_first_type, first_type> left_type; typedef iterator_range<last_type, seq_last_type> right_type; typedef joint_view<left_type, right_type> type; @@ -72,7 +95,11 @@ namespace boost { namespace fusion } template <typename Sequence, typename First> - typename result_of::erase<Sequence const, First>::type + typename + lazy_enable_if< + traits::is_sequence<Sequence> + , typename result_of::erase<Sequence const, First> + >::type erase(Sequence const& seq, First const& first) { typedef result_of::erase<Sequence const, First> result_of; diff --git a/boost/fusion/algorithm/transformation/insert.hpp b/boost/fusion/algorithm/transformation/insert.hpp index ac5bca38a7..2052fc01aa 100644 --- a/boost/fusion/algorithm/transformation/insert.hpp +++ b/boost/fusion/algorithm/transformation/insert.hpp @@ -16,6 +16,8 @@ #include <boost/fusion/sequence/intrinsic/begin.hpp> #include <boost/fusion/sequence/intrinsic/end.hpp> #include <boost/fusion/adapted/mpl/mpl_iterator.hpp> +#include <boost/fusion/support/is_sequence.hpp> +#include <boost/utility/enable_if.hpp> namespace boost { namespace fusion { @@ -38,8 +40,12 @@ namespace boost { namespace fusion } template <typename Sequence, typename Position, typename T> - inline typename result_of::insert< - Sequence const, Position, T>::type + inline + typename + lazy_enable_if< + traits::is_sequence<Sequence> + , result_of::insert<Sequence const, Position, T> + >::type insert(Sequence const& seq, Position const& pos, T const& x) { typedef result_of::insert< diff --git a/boost/fusion/algorithm/transformation/push_back.hpp b/boost/fusion/algorithm/transformation/push_back.hpp index 00a01a806f..9afe538ab2 100644 --- a/boost/fusion/algorithm/transformation/push_back.hpp +++ b/boost/fusion/algorithm/transformation/push_back.hpp @@ -10,6 +10,8 @@ #include <boost/fusion/support/detail/as_fusion_element.hpp> #include <boost/fusion/view/joint_view/joint_view.hpp> #include <boost/fusion/view/single_view/single_view.hpp> +#include <boost/fusion/support/is_sequence.hpp> +#include <boost/utility/enable_if.hpp> namespace boost { namespace fusion { @@ -24,7 +26,12 @@ namespace boost { namespace fusion } template <typename Sequence, typename T> - inline typename result_of::push_back<Sequence const, T>::type + inline + typename + lazy_enable_if< + traits::is_sequence<Sequence> + , result_of::push_back<Sequence const, T> + >::type push_back(Sequence const& seq, T const& x) { typedef typename result_of::push_back<Sequence const, T> push_back; diff --git a/boost/fusion/algorithm/transformation/push_front.hpp b/boost/fusion/algorithm/transformation/push_front.hpp index d08ad27987..abe7faadea 100644 --- a/boost/fusion/algorithm/transformation/push_front.hpp +++ b/boost/fusion/algorithm/transformation/push_front.hpp @@ -10,6 +10,8 @@ #include <boost/fusion/support/detail/as_fusion_element.hpp> #include <boost/fusion/view/joint_view/joint_view.hpp> #include <boost/fusion/view/single_view/single_view.hpp> +#include <boost/fusion/support/is_sequence.hpp> +#include <boost/utility/enable_if.hpp> namespace boost { namespace fusion { @@ -24,7 +26,12 @@ namespace boost { namespace fusion } template <typename Sequence, typename T> - inline typename result_of::push_front<Sequence const, T>::type + inline + typename + lazy_enable_if< + traits::is_sequence<Sequence> + , result_of::push_front<Sequence const, T> + >::type push_front(Sequence const& seq, T const& x) { typedef typename result_of::push_front<Sequence const, T> push_front; diff --git a/boost/fusion/algorithm/transformation/replace.hpp b/boost/fusion/algorithm/transformation/replace.hpp index bfe186e5af..a92e6e3738 100644 --- a/boost/fusion/algorithm/transformation/replace.hpp +++ b/boost/fusion/algorithm/transformation/replace.hpp @@ -9,6 +9,8 @@ #include <boost/fusion/view/transform_view/transform_view.hpp> #include <boost/fusion/algorithm/transformation/detail/replace.hpp> +#include <boost/fusion/support/is_sequence.hpp> +#include <boost/utility/enable_if.hpp> namespace boost { namespace fusion { @@ -22,7 +24,12 @@ namespace boost { namespace fusion } template <typename Sequence, typename T> - inline typename result_of::replace<Sequence const, T>::type + inline + typename + enable_if< + traits::is_sequence<Sequence> + , typename result_of::replace<Sequence const, T>::type + >::type replace(Sequence const& seq, T const& old_value, T const& new_value) { typedef typename result_of::replace<Sequence const, T>::type result; diff --git a/boost/fusion/algorithm/transformation/replace_if.hpp b/boost/fusion/algorithm/transformation/replace_if.hpp index 29913436e3..39b9009a79 100644 --- a/boost/fusion/algorithm/transformation/replace_if.hpp +++ b/boost/fusion/algorithm/transformation/replace_if.hpp @@ -9,6 +9,7 @@ #include <boost/fusion/view/transform_view/transform_view.hpp> #include <boost/fusion/algorithm/transformation/detail/replace_if.hpp> +#include <boost/fusion/support/is_sequence.hpp> #include <boost/utility/enable_if.hpp> #include <boost/type_traits/is_same.hpp> @@ -24,7 +25,12 @@ namespace boost { namespace fusion } template <typename Sequence, typename F, typename T> - inline typename result_of::replace_if<Sequence const, F, T>::type + inline + typename + enable_if< + traits::is_sequence<Sequence> + , typename result_of::replace_if<Sequence const, F, T>::type + >::type replace_if(Sequence const& seq, F pred, T const& new_value) { typedef typename result_of::replace_if<Sequence const, F, T>::type result; diff --git a/boost/fusion/algorithm/transformation/reverse.hpp b/boost/fusion/algorithm/transformation/reverse.hpp index 23c4fe6531..923b90fc6a 100644 --- a/boost/fusion/algorithm/transformation/reverse.hpp +++ b/boost/fusion/algorithm/transformation/reverse.hpp @@ -8,6 +8,8 @@ #define FUSION_REVERSE_07212005_1230 #include <boost/fusion/view/reverse_view/reverse_view.hpp> +#include <boost/fusion/support/is_sequence.hpp> +#include <boost/utility/enable_if.hpp> namespace boost { namespace fusion { @@ -21,7 +23,12 @@ namespace boost { namespace fusion } template <typename Sequence> - inline reverse_view<Sequence const> + inline + typename + enable_if< + traits::is_sequence<Sequence> + , reverse_view<Sequence const> + >::type reverse(Sequence const& view) { return reverse_view<Sequence const>(view); |