14#ifndef RANGES_V3_NUMERIC_PARTIAL_SUM_HPP
15#define RANGES_V3_NUMERIC_PARTIAL_SUM_HPP
19#include <range/v3/algorithm/result_types.hpp>
31#include <range/v3/utility/static_const.hpp>
33#include <range/v3/detail/prologue.hpp>
47 constexpr T & operator()(T && t)
const noexcept
53 using as_value_type_t = composed<as_lvalue_fn, coerce<iter_value_t<I>>>;
61 template(
typename I,
typename BOp)(
62 concept (indirect_semigroup_)(I, BOp),
63 copyable<iter_value_t<I>> AND
64 indirectly_regular_binary_invocable_<
65 composed<coerce<iter_value_t<I>>, BOp>,
70 template<
typename I,
typename BOp>
71 CPP_concept indirect_semigroup =
72 indirectly_readable<I> &&
77 template(
typename I,
typename O,
typename BOp,
typename P)(
78 concept (partial_sum_constraints_)(I, O, BOp, P),
80 projected<projected<I, detail::as_value_type_t<I>>, P>,
85 projected<projected<I, detail::as_value_type_t<I>>, P>>
const &>
89 template<
typename I,
typename O,
typename BOp = plus,
typename P =
identity>
90 CPP_concept partial_sum_constraints =
95 template<
typename I,
typename O>
96 using partial_sum_result = detail::in_out_result<I, O>;
100 template(
typename I,
typename S1,
typename O,
typename S2,
typename BOp =
plus,
104 partial_sum_result<I, O> operator()(I first,
111 using X = projected<projected<I, detail::as_value_type_t<I>>, P>;
114 if(first != last && result != end_result)
116 auto && cur1 = val_i(*first);
117 iter_value_t<X> t(invoke(proj, cur1));
119 for(++first, ++result; first != last && result != end_result;
122 auto && cur2 = val_i(*first);
123 t = val_x(invoke(bop, t, invoke(proj, cur2)));
127 return {first, result};
130 template(
typename I,
typename S,
typename O,
typename BOp =
plus,
133 partial_sum_result<I, O>
134 operator()(I first, S last, O result, BOp bop = BOp{}, P proj = P{})
const
136 return (*
this)(std::move(first),
144 template(
typename Rng,
typename ORef,
typename BOp =
plus,
typename P =
identity,
147 partial_sum_result<borrowed_iterator_t<Rng>, O>
148 operator()(Rng && rng, ORef && result, BOp bop = BOp{}, P proj = P{})
const
150 return (*
this)(begin(rng),
152 static_cast<ORef &&
>(result),
157 template(
typename Rng,
typename ORng,
typename BOp =
plus,
typename P =
identity,
160 partial_sum_result<borrowed_iterator_t<Rng>, borrowed_iterator_t<ORng>>
161 operator()(Rng && rng, ORng && result, BOp bop = BOp{}, P proj = P{})
const
163 return (*
this)(begin(rng),
176#include <range/v3/detail/epilogue.hpp>
The indirect_semigroup_ concept.
The partial_sum_constraints_ concept.
The partial_sum_constraints concept.
The sentinel_for concept.
decltype(begin(declval(Rng &))) iterator_t
Definition access.hpp:698
Definition arithmetic.hpp:78
Definition identity.hpp:25
Definition partial_sum.hpp:99
Definition arithmetic.hpp:25