#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 PYTHONIC_NS_BEGIN namespace builtins { namespace details { template struct tuple_sum { auto operator()(Tuple const &t) -> decltype(std::get(t) + tuple_sum()(t)); }; template struct tuple_sum { auto operator()(Tuple const &t) -> decltype(std::get<0>(t)); }; } template auto sum(Iterable s, T start) -> decltype(std::accumulate( s.begin(), s.end(), static_cast::type>( start))); template auto sum(Iterable s) -> decltype(sum(s, 0L)) { return sum(s, 0L); } template auto sum(std::tuple const &t) -> decltype( details::tuple_sum, sizeof...(Types)-1>()(t)) { return details::tuple_sum, sizeof...(Types)-1>()(t); } template T sum(types::array_base const &t) { return details::tuple_sum, N - 1>()(t); } DEFINE_FUNCTOR(pythonic::builtins, sum); } PYTHONIC_NS_END #endif