// -- numeric.hpp -- Boost Lambda Library ----------------------------------- | |
// Copyright (C) 2002 Jaakko Jarvi (jaakko.jarvi@cs.utu.fi) | |
// Copyright (C) 2002 Gary Powell (gwpowell@hotmail.com) | |
// | |
// Distributed under 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) | |
// | |
// For more information, see http://www.boost.org | |
#ifndef BOOST_LAMBDA_NUMERIC_HPP | |
#define BOOST_LAMBDA_NUMERIC_HPP | |
#include "boost/lambda/core.hpp" | |
#include <numeric> | |
namespace boost { | |
namespace lambda { | |
namespace ll { | |
// accumulate --------------------------------- | |
struct accumulate { | |
template <class Args> | |
struct sig { | |
typedef typename boost::remove_const< | |
typename boost::tuples::element<3, Args>::type | |
>::type type; | |
}; | |
template <class A, class B, class C> | |
C | |
operator()(A a, B b, C c) const | |
{ return ::std::accumulate(a, b, c); } | |
template <class A, class B, class C, class D> | |
C | |
operator()(A a, B b, C c, D d) const | |
{ return ::std::accumulate(a, b, c, d); } | |
}; | |
// inner_product --------------------------------- | |
struct inner_product { | |
template <class Args> | |
struct sig { | |
typedef typename boost::remove_const< | |
typename boost::tuples::element<4, Args>::type | |
>::type type; | |
}; | |
template <class A, class B, class C, class D> | |
D | |
operator()(A a, B b, C c, D d) const | |
{ return ::std::inner_product(a, b, c, d); } | |
template <class A, class B, class C, class D, class E, class F> | |
D | |
operator()(A a, B b, C c, D d, E e, F f) const | |
{ return ::std::inner_product(a, b, c, d, e, f); } | |
}; | |
// partial_sum --------------------------------- | |
struct partial_sum { | |
template <class Args> | |
struct sig { | |
typedef typename boost::remove_const< | |
typename boost::tuples::element<3, Args>::type | |
>::type type; | |
}; | |
template <class A, class B, class C> | |
C | |
operator()(A a, B b, C c) const | |
{ return ::std::partial_sum(a, b, c); } | |
template <class A, class B, class C, class D> | |
C | |
operator()(A a, B b, C c, D d) const | |
{ return ::std::partial_sum(a, b, c, d); } | |
}; | |
// adjacent_difference --------------------------------- | |
struct adjacent_difference { | |
template <class Args> | |
struct sig { | |
typedef typename boost::remove_const< | |
typename boost::tuples::element<3, Args>::type | |
>::type type; | |
}; | |
template <class A, class B, class C> | |
C | |
operator()(A a, B b, C c) const | |
{ return ::std::adjacent_difference(a, b, c); } | |
template <class A, class B, class C, class D> | |
C | |
operator()(A a, B b, C c, D d) const | |
{ return ::std::adjacent_difference(a, b, c, d); } | |
}; | |
} // end of ll namespace | |
} // end of lambda namespace | |
} // end of boost namespace | |
#endif |