5 # ifndef VCCC_NUMERIC_SUM_HPP
6 # define VCCC_NUMERIC_SUM_HPP
28 template<
typename Arg1,
typename Arg2>
29 constexpr
inline auto sumImpl(
const Arg1& arg1,
const Arg2& arg2) -> decltype(arg1 + arg2) {
33 template<
typename Arg,
typename ...Args>
34 constexpr
auto sumImpl(
const Arg& arg,
const Args&... args) -> decltype(arg +
sumImpl(args...)) {
38 template<
typename T, std::enable_if_t<std::is_
class<std::decay_t<T>>::value,
int> = 0>
40 return std::decay_t<T>();
43 template<
typename T, std::enable_if_t<!std::is_
class<std::decay_t<T>>::value,
int> = 0>
45 return static_cast<std::decay_t<T>
>(0);
57 constexpr
auto sum(InputIterator
first, InputIterator last) {
58 auto s = impl::default_value<decltype(*first)>();
73 constexpr
auto sum(InputIterator
first, InputIterator last, UnaryOperation unary_op) {
74 auto s = impl::default_value<decltype(unary_op(*first))>();
76 s += unary_op(*
first);
86 template<
typename ...Args, std::enable_if_t<negation<disjunction<is_iterable<Args>...>>
::value,
int> = 0>
87 constexpr
inline auto sum(
const Args&... args) {
98 template<
typename UnaryOperation,
typename Arg>
99 constexpr
inline auto sum_custom(
const UnaryOperation& unary_op,
const Arg& arg) {
100 return unary_op(arg);
103 template<
typename UnaryOperation,
typename Arg,
typename ...Args>
104 constexpr
inline auto sum_custom(
const UnaryOperation& unary_op,
const Arg& arg,
const Args&... args) {
105 return unary_op(arg) +
sum_custom(unary_op, args...);
133 return sum(
first, last, [](
const auto& val){
return square(val); });
136 template<
typename Arg>
141 template<
typename Arg1,
typename Arg2,
149 constexpr
auto square_sum(
const Arg1& arg1,
const Arg2& arg2) {
159 constexpr
auto square_sum(
const Arg& arg,
const Args&... args) {
constexpr auto square_sum(InputIterator first, InputIterator last)
square sum of iterator [first, last)
Definition: sum.hpp:132
constexpr auto sum(InputIterator first, InputIterator last)
sum of iterator [first, last)
Definition: sum.hpp:57
constexpr auto sum_custom(const UnaryOperation &unary_op, const Arg &arg)
sum of variadic with custom operator
Definition: sum.hpp:99
constexpr T square(const T &val)
get squared value
Definition: sum.hpp:116
constexpr T sumImpl(const T &arg)
Definition: sum.hpp:24
constexpr std::decay_t< T > default_value()
Definition: sum.hpp:39
Definition: directory.h:12
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 0 > first
Definition: key_value.hpp:34
constexpr VCCC_INLINE_OR_STATIC detail::element_niebloid< 1 > value
Definition: key_value.hpp:35