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)()(
169 return ranges::size(base_);
172 constexpr auto CPP_fun(size)()(
const
175 return ranges::size(base_);