%PDF- %PDF-
| Direktori : /proc/thread-self/root/usr/lib/python3/dist-packages/pythran/pythonic/include/builtins/ |
| Current File : //proc/thread-self/root/usr/lib/python3/dist-packages/pythran/pythonic/include/builtins/sum.hpp |
#ifndef PYTHONIC_INCLUDE_BUILTIN_SUM_HPP
#define PYTHONIC_INCLUDE_BUILTIN_SUM_HPP
#include "pythonic/include/types/assignable.hpp"
#include "pythonic/include/types/tuple.hpp"
#include "pythonic/include/utils/int_.hpp"
#include "pythonic/include/utils/functor.hpp"
#include <numeric>
PYTHONIC_NS_BEGIN
namespace builtins
{
namespace details
{
template <class Tuple, size_t N>
struct tuple_sum {
auto operator()(Tuple const &t)
-> decltype(std::get<N>(t) + tuple_sum<Tuple, N - 1>()(t));
};
template <class Tuple>
struct tuple_sum<Tuple, 0> {
auto operator()(Tuple const &t) -> decltype(std::get<0>(t));
};
}
template <class Iterable, class T>
auto sum(Iterable s, T start) -> decltype(std::accumulate(
s.begin(), s.end(),
static_cast<typename assignable<decltype(start + *s.begin())>::type>(
start)));
template <class Iterable>
auto sum(Iterable s) -> decltype(sum(s, 0L))
{
return sum(s, 0L);
}
template <class... Types>
auto sum(std::tuple<Types...> const &t) -> decltype(
details::tuple_sum<std::tuple<Types...>, sizeof...(Types)-1>()(t))
{
return details::tuple_sum<std::tuple<Types...>, sizeof...(Types)-1>()(t);
}
template <class T, size_t N, class V>
T sum(types::array_base<T, N, V> const &t)
{
return details::tuple_sum<types::array_base<T, N, V>, N - 1>()(t);
}
DEFINE_FUNCTOR(pythonic::builtins, sum);
}
PYTHONIC_NS_END
#endif