14#ifndef RANGES_V3_VIEW_PARTIAL_SUM_HPP
15#define RANGES_V3_VIEW_PARTIAL_SUM_HPP
31#include <range/v3/utility/addressof.hpp>
33#include <range/v3/utility/static_const.hpp>
38#include <range/v3/detail/prologue.hpp>
48 template(
typename Rng,
typename Fun)(
49 concept (partial_sum_view_constraints_)(Rng, Fun),
50 copy_constructible<range_value_t<Rng>> AND
51 constructible_from<range_value_t<Rng>, range_reference_t<Rng>> AND
52 assignable_from<range_value_t<Rng> &, range_reference_t<Rng>> AND
53 indirectly_binary_invocable_<Fun &, iterator_t<Rng>, iterator_t<Rng>> AND
56 indirect_result_t<Fun &, iterator_t<Rng>, iterator_t<Rng>>>
60 template<
typename Rng,
typename Fun>
61 CPP_concept partial_sum_view_constraints =
63 copy_constructible<Fun> &&
64 CPP_concept_ref(detail::partial_sum_view_constraints_, Rng, Fun);
71 template<
typename Rng,
typename Fun>
78 CPP_assert(detail::partial_sum_view_constraints<Rng, Fun>);
80 RANGES_NO_UNIQUE_ADDRESS Rng base_{};
81 RANGES_NO_UNIQUE_ADDRESS semiregular_box_t<Fun> fun_;
83 template<
bool IsConst>
89 using Parent = meta::const_if_c<IsConst, partial_sum_view>;
90 using Base = meta::const_if_c<IsConst, Rng>;
92 Parent * parent_ =
nullptr;
94 RANGES_NO_UNIQUE_ADDRESS semiregular_box_t<range_value_t<Rng>> sum_;
100 constexpr explicit cursor(Parent * rng)
102 , current_(ranges::begin(rng->base_))
104 if(current_ != ranges::end(rng->base_))
107 template(
bool Other)(
108 requires IsConst AND CPP_NOT(Other) AND
109 convertible_to<iterator_t<Rng>
const &,
111 constexpr cursor(cursor<Other>
const & that)
112 : parent_{that.parent_}
113 , current_(that.current_)
116 constexpr range_value_t<Rng> read()
const
118 RANGES_EXPECT(current_ != ranges::end(parent_->base_));
121 constexpr void next()
123 auto last = ranges::end(parent_->base_);
124 RANGES_EXPECT(current_ != last);
125 if(++current_ != last)
127 auto & sum =
static_cast<range_value_t<Rng> &
>(sum_);
128 using F = meta::const_if_c<IsConst, Fun>;
129 auto & f =
static_cast<F &
>(parent_->fun_);
130 sum =
invoke(f, sum, *current_);
135 return current_ == ranges::end(parent_->base_);
138 constexpr bool CPP_fun(equal)(cursor
const & that)(
const
141 RANGES_EXPECT(parent_ == that.parent_);
142 return current_ == that.current_;
146 constexpr cursor<false> begin_cursor()
148 return cursor<false>{
this};
150 template(
typename CRng = Rng
const)(
151 requires detail::partial_sum_view_constraints<CRng, Fun const>)
152 constexpr cursor<true> begin_cursor()
const
154 return cursor<true>{
this};
160 std::is_nothrow_move_constructible<Rng>::value &&
161 std::is_nothrow_move_constructible<Fun>::value)
162 : base_(std::move(rng))
163 , fun_(std::move(fun))
166 constexpr auto CPP_fun(
size)()(
172 constexpr auto CPP_fun(
size)()(
const
179#if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17
180 template(
typename Rng,
typename Fun)(
181 requires copy_constructible<Fun>)
190 template(
typename Rng,
typename Fun =
plus)(
191 requires detail::partial_sum_view_constraints<all_t<Rng>, Fun>)
193 operator()(Rng && rng, Fun fun = {})
const
195 return {all(
static_cast<Rng &&
>(rng)), std::move(fun)};
201 using partial_sum_base_fn::operator();
203 template(
typename Fun)(
205 constexpr auto operator()(Fun && fun)
const
207 return make_view_closure(
210 template<
typename Fun = plus>
212 "Use \"ranges::views::partial_sum\" instead of "
213 "\"ranges::views::partial_sum()\".")
228#include <range/v3/detail/epilogue.hpp>
230#include <range/v3/detail/satisfy_boost_range.hpp>
decltype(begin(declval(Rng &))) iterator_t
Definition: access.hpp:698
RANGES_INLINE_VARIABLE(detail::to_container_fn< detail::from_range< std::vector > >, to_vector) template< template< typename... > class ContT > auto to(RANGES_HIDDEN_DETAIL(detail
For initializing a container of the specified type with the elements of an Range.
Definition: conversion.hpp:399
std::integral_constant< bool, B > bool_
An integral constant wrapper for bool.
Definition: meta.hpp:168
typename Fn::template invoke< Args... > invoke
Evaluate the invocable Fn with the arguments Args.
Definition: meta.hpp:541
defer< bind_back, Fn, Ts... > bind_back
Definition: meta.hpp:994
meta::size_t< L::size()> size
An integral constant wrapper that is the size of the meta::list L.
Definition: meta.hpp:1696
std::integral_constant< decltype(T::type::value+U::type::value), T::type::value+U::type::value > plus
An integral constant wrapper around the result of adding the two wrapped integers T::type::value and ...
Definition: meta.hpp:197
Definition: default_sentinel.hpp:26
Definition: partial_sum.hpp:74
Definition: traits.hpp:128
A utility for constructing a view from a (derived) type that implements begin and end cursors.
Definition: facade.hpp:66
Definition: partial_sum.hpp:189
Definition: partial_sum.hpp:200