You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and dots ('.'), can be up to 35 characters long. Letters must be lowercase.
97 lines
2.7 KiB
97 lines
2.7 KiB
// Copyright 2005 Daniel Wallin. |
|
// Copyright 2005 Joel de Guzman. |
|
// Copyright 2005 Dan Marsden. |
|
// |
|
// Use, modification and distribution is subject to the Boost Software |
|
// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at |
|
// http://www.boost.org/LICENSE_1_0.txt) |
|
// |
|
// Modeled after range_ex, Copyright 2004 Eric Niebler |
|
|
|
#ifndef BOOST_PHOENIX_ALGORITHM_ITERATION_HPP |
|
#define BOOST_PHOENIX_ALGORITHM_ITERATION_HPP |
|
|
|
#include <algorithm> |
|
#include <numeric> |
|
|
|
#include <boost/phoenix/stl/algorithm/detail/begin.hpp> |
|
#include <boost/phoenix/stl/algorithm/detail/end.hpp> |
|
|
|
#include <boost/phoenix/function/adapt_callable.hpp> |
|
|
|
namespace boost { namespace phoenix { |
|
namespace impl |
|
{ |
|
struct for_each |
|
{ |
|
template <typename Sig> |
|
struct result; |
|
|
|
template<typename This, class R, class F> |
|
struct result<This(R&, F)> |
|
: result<This(R&, F const &)> |
|
{}; |
|
|
|
template<typename This, class R, class F> |
|
struct result<This(R&, F &)> |
|
{ |
|
typedef F type; |
|
}; |
|
|
|
template<class R, class F> |
|
F const operator()(R& r, F const& fn) const |
|
{ |
|
return std::for_each(detail::begin_(r), detail::end_(r), fn); |
|
} |
|
}; |
|
|
|
struct accumulate |
|
{ |
|
template <typename Sig> |
|
struct result; |
|
|
|
template<typename This, class R, class I> |
|
struct result<This(R&, I)> |
|
: result<This(R&, I const &)> |
|
{}; |
|
|
|
template<typename This, class R, class I> |
|
struct result<This(R&, I &)> |
|
{ |
|
typedef I type; |
|
}; |
|
|
|
template<typename This, class R, class I, class C> |
|
struct result<This(R&, I, C)> |
|
: result<This(R&, I const &, C)> |
|
{}; |
|
|
|
template<typename This, class R, class I, class C> |
|
struct result<This(R&, I &, C)> |
|
{ |
|
typedef I type; |
|
}; |
|
|
|
template<class R, class I> |
|
I |
|
operator()(R& r, I i) const |
|
{ |
|
return std::accumulate(detail::begin_(r), detail::end_(r), i); |
|
} |
|
|
|
template<class R, class I, class C> |
|
I |
|
operator()(R& r, I i, C c) const |
|
{ |
|
return std::accumulate(detail::begin_(r), detail::end_(r), i, c); |
|
} |
|
}; |
|
} |
|
|
|
BOOST_PHOENIX_ADAPT_CALLABLE(for_each, impl::for_each, 2) |
|
BOOST_PHOENIX_ADAPT_CALLABLE(accumulate, impl::accumulate, 2) |
|
BOOST_PHOENIX_ADAPT_CALLABLE(accumulate, impl::accumulate, 3) |
|
|
|
}} |
|
|
|
#endif
|
|
|