summaryrefslogtreecommitdiff
path: root/boost/fusion/algorithm
diff options
context:
space:
mode:
Diffstat (limited to 'boost/fusion/algorithm')
-rw-r--r--boost/fusion/algorithm/auxiliary/copy.hpp13
-rw-r--r--boost/fusion/algorithm/iteration/accumulate.hpp16
-rw-r--r--boost/fusion/algorithm/iteration/accumulate_fwd.hpp15
-rw-r--r--boost/fusion/algorithm/iteration/for_each.hpp16
-rw-r--r--boost/fusion/algorithm/iteration/for_each_fwd.hpp17
-rw-r--r--boost/fusion/algorithm/query/count.hpp9
-rw-r--r--boost/fusion/algorithm/query/count_if.hpp9
-rw-r--r--boost/fusion/algorithm/transformation/erase.hpp35
-rw-r--r--boost/fusion/algorithm/transformation/insert.hpp10
-rw-r--r--boost/fusion/algorithm/transformation/push_back.hpp9
-rw-r--r--boost/fusion/algorithm/transformation/push_front.hpp9
-rw-r--r--boost/fusion/algorithm/transformation/replace.hpp9
-rw-r--r--boost/fusion/algorithm/transformation/replace_if.hpp8
-rw-r--r--boost/fusion/algorithm/transformation/reverse.hpp9
14 files changed, 162 insertions, 22 deletions
diff --git a/boost/fusion/algorithm/auxiliary/copy.hpp b/boost/fusion/algorithm/auxiliary/copy.hpp
index 2720627c40..fd866468eb 100644
--- a/boost/fusion/algorithm/auxiliary/copy.hpp
+++ b/boost/fusion/algorithm/auxiliary/copy.hpp
@@ -11,8 +11,11 @@
#include <boost/fusion/sequence/intrinsic/end.hpp>
#include <boost/fusion/sequence/intrinsic/size.hpp>
#include <boost/fusion/sequence/comparison/detail/equal_to.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
#include <boost/config.hpp>
#include <boost/static_assert.hpp>
+#include <boost/utility/enable_if.hpp>
+#include <boost/type_traits/ice.hpp>
#if defined (BOOST_MSVC)
# pragma warning(push)
@@ -54,7 +57,15 @@ namespace boost { namespace fusion
}
template <typename Seq1, typename Seq2>
- inline void
+ inline
+ typename
+ enable_if_c<
+ type_traits::ice_and<
+ traits::is_sequence<Seq1>::value
+ , traits::is_sequence<Seq2>::value
+ >::value,
+ void
+ >::type
copy(Seq1 const& src, Seq2& dest)
{
BOOST_STATIC_ASSERT(
diff --git a/boost/fusion/algorithm/iteration/accumulate.hpp b/boost/fusion/algorithm/iteration/accumulate.hpp
index a8d6a357a2..4b676dea6a 100644
--- a/boost/fusion/algorithm/iteration/accumulate.hpp
+++ b/boost/fusion/algorithm/iteration/accumulate.hpp
@@ -9,6 +9,8 @@
#include <boost/fusion/algorithm/iteration/accumulate_fwd.hpp>
#include <boost/fusion/algorithm/iteration/fold.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
+#include <boost/utility/enable_if.hpp>
namespace boost { namespace fusion
{
@@ -23,14 +25,24 @@ namespace boost { namespace fusion
}
template <typename Sequence, typename State, typename F>
- inline typename result_of::accumulate<Sequence, State const, F>::type
+ inline
+ typename
+ lazy_enable_if<
+ traits::is_sequence<Sequence>
+ , result_of::accumulate<Sequence, State const, F>
+ >::type
accumulate(Sequence& seq, State const& state, F f)
{
return fusion::fold(seq, state, f);
}
template <typename Sequence, typename State, typename F>
- inline typename result_of::accumulate<Sequence const, State const, F>::type
+ inline
+ typename
+ lazy_enable_if<
+ traits::is_sequence<Sequence>
+ , result_of::accumulate<Sequence const, State const, F>
+ >::type
accumulate(Sequence const& seq, State const& state, F f)
{
return fusion::fold(seq, state, f);
diff --git a/boost/fusion/algorithm/iteration/accumulate_fwd.hpp b/boost/fusion/algorithm/iteration/accumulate_fwd.hpp
index 9c0bd115fb..a4ca316c1e 100644
--- a/boost/fusion/algorithm/iteration/accumulate_fwd.hpp
+++ b/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 <boost/fusion/support/is_sequence.hpp>
+#include <boost/utility/enable_if.hpp>
+
namespace boost { namespace fusion
{
namespace result_of
@@ -16,11 +19,19 @@ namespace boost { namespace fusion
}
template <typename Sequence, typename State, typename F>
- typename result_of::accumulate<Sequence, State const, F>::type
+ typename
+ lazy_enable_if<
+ traits::is_sequence<Sequence>
+ , result_of::accumulate<Sequence, State const, F>
+ >::type
accumulate(Sequence& seq, State const& state, F f);
template <typename Sequence, typename State, typename F>
- typename result_of::accumulate<Sequence const, State const, F>::type
+ typename
+ lazy_enable_if<
+ traits::is_sequence<Sequence>
+ , result_of::accumulate<Sequence const, State const, F>
+ >::type
accumulate(Sequence const& seq, State const& state, F f);
}}
diff --git a/boost/fusion/algorithm/iteration/for_each.hpp b/boost/fusion/algorithm/iteration/for_each.hpp
index ab8b8f0e84..17cde34a4b 100644
--- a/boost/fusion/algorithm/iteration/for_each.hpp
+++ b/boost/fusion/algorithm/iteration/for_each.hpp
@@ -11,6 +11,8 @@
#include <boost/fusion/algorithm/iteration/detail/for_each.hpp>
#include <boost/fusion/algorithm/iteration/detail/segmented_for_each.hpp>
#include <boost/fusion/support/is_segmented.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
+#include <boost/utility/enable_if.hpp>
namespace boost { namespace fusion
{
@@ -24,14 +26,24 @@ namespace boost { namespace fusion
}
template <typename Sequence, typename F>
- inline void
+ inline
+ typename
+ enable_if<
+ traits::is_sequence<Sequence>
+ , void
+ >::type
for_each(Sequence& seq, F const& f)
{
detail::for_each(seq, f, typename traits::is_segmented<Sequence>::type());
}
template <typename Sequence, typename F>
- inline void
+ inline
+ typename
+ enable_if<
+ traits::is_sequence<Sequence>
+ , void
+ >::type
for_each(Sequence const& seq, F const& f)
{
detail::for_each(seq, f, typename traits::is_segmented<Sequence>::type());
diff --git a/boost/fusion/algorithm/iteration/for_each_fwd.hpp b/boost/fusion/algorithm/iteration/for_each_fwd.hpp
index 544915d946..b757873e6e 100644
--- a/boost/fusion/algorithm/iteration/for_each_fwd.hpp
+++ b/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 <boost/fusion/support/is_sequence.hpp>
+#include <boost/utility/enable_if.hpp>
+
namespace boost { namespace fusion
{
namespace result_of
@@ -16,11 +19,21 @@ namespace boost { namespace fusion
}
template <typename Sequence, typename F>
- void
+ inline
+ typename
+ enable_if<
+ traits::is_sequence<Sequence>
+ , void
+ >::type
for_each(Sequence& seq, F const& f);
template <typename Sequence, typename F>
- void
+ inline
+ typename
+ enable_if<
+ traits::is_sequence<Sequence>
+ , void
+ >::type
for_each(Sequence const& seq, F const& f);
}}
diff --git a/boost/fusion/algorithm/query/count.hpp b/boost/fusion/algorithm/query/count.hpp
index ade58671a3..0488716327 100644
--- a/boost/fusion/algorithm/query/count.hpp
+++ b/boost/fusion/algorithm/query/count.hpp
@@ -10,6 +10,8 @@
#include <boost/fusion/algorithm/query/count_if.hpp>
#include <boost/fusion/algorithm/query/detail/count.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
+#include <boost/utility/enable_if.hpp>
namespace boost { namespace fusion
{
@@ -23,7 +25,12 @@ namespace boost { namespace fusion
}
template <typename Sequence, typename T>
- inline int
+ inline
+ typename
+ enable_if<
+ traits::is_sequence<Sequence>
+ , int
+ >::type
count(Sequence const& seq, T const& x)
{
detail::count_compare<T> f(x);
diff --git a/boost/fusion/algorithm/query/count_if.hpp b/boost/fusion/algorithm/query/count_if.hpp
index 51112cf0d9..792979733a 100644
--- a/boost/fusion/algorithm/query/count_if.hpp
+++ b/boost/fusion/algorithm/query/count_if.hpp
@@ -10,6 +10,8 @@
#include <boost/fusion/algorithm/query/detail/count_if.hpp>
#include <boost/fusion/support/category_of.hpp>
+#include <boost/fusion/support/is_sequence.hpp>
+#include <boost/utility/enable_if.hpp>
namespace boost { namespace fusion
{
@@ -23,7 +25,12 @@ namespace boost { namespace fusion
}
template <typename Sequence, typename F>
- inline int
+ inline
+ typename
+ enable_if<
+ traits::is_sequence<Sequence>
+ , int
+ >::type
count_if(Sequence const& seq, F f)
{
return detail::count_if(
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);