14#ifndef RANGES_V3_VIEW_EXCLUSIVE_SCAN_HPP
15#define RANGES_V3_VIEW_EXCLUSIVE_SCAN_HPP
27#include <range/v3/detail/prologue.hpp>
34 template(
typename Rng,
typename T,
typename Fun)(
35 concept (exclusive_scan_constraints_)(Rng, T, Fun),
36 invocable<Fun &, T, range_reference_t<Rng>> AND
37 assignable_from<T &, invoke_result_t<Fun &, T, range_reference_t<Rng>>>
41 template<
typename Rng,
typename T,
typename Fun>
42 CPP_concept exclusive_scan_constraints =
43 viewable_range<Rng> && input_range<Rng> &&
44 copy_constructible<T> &&
50 template<
typename Rng,
typename T,
typename Fun>
57 semiregular_box_t<T> init_;
58 semiregular_box_t<Fun> fun_;
62 template<
bool IsConst>
66 friend struct adaptor<!IsConst>;
67 using exclusive_scan_view_t = meta::const_if_c<IsConst, exclusive_scan_view>;
68 using CRng = meta::const_if_c<IsConst, Rng>;
69 semiregular_box_t<T> sum_;
70 exclusive_scan_view_t * rng_;
73 auto CPP_auto_fun(move_or_copy_init)(std::false_type)
79 auto CPP_auto_fun(move_or_copy_init)(std::true_type)
81 return std::move(rng_->init_)
84 public :
using single_pass = exclusive_scan_view::single_pass;
86 adaptor(exclusive_scan_view_t * rng)
90 requires IsConst AND CPP_NOT(Other))
91 adaptor(adaptor<Other> that)
96 sum_ = move_or_copy_init(single_pass{});
97 return ranges::begin(rng_->base());
105 RANGES_EXPECT(it != ranges::end(rng_->base()));
106 sum_ = invoke(rng_->fun_,
static_cast<T &&
>(std::move(sum_)), *it);
109 void prev() =
delete;
112 adaptor<false> begin_adaptor()
121 auto begin_adaptor()
const
122 -> CPP_ret(adaptor<true>)(
128 auto end_adaptor()
const
138 : exclusive_scan_view::view_adaptor{std::move(rng)}
139 , init_(std::move(init))
140 , fun_(std::move(fun))
143 auto CPP_fun(size)()(
const
146 return ranges::size(this->base());
149 auto CPP_fun(size)()(
152 return ranges::size(this->base());
156#if RANGES_CXX_DEDUCTION_GUIDES >= RANGES_CXX_DEDUCTION_GUIDES_17
157 template(
typename Rng,
typename T,
typename Fun)(
158 requires copy_constructible<T> AND copy_constructible<Fun>)
165 struct exclusive_scan_base_fn
167 template(
typename Rng,
typename T,
typename Fun =
plus)(
170 operator()(Rng && rng, T init, Fun fun = Fun{})
const
172 return {all(
static_cast<Rng &&
>(rng)), std::move(init), std::move(fun)};
176 struct exclusive_scan_fn : exclusive_scan_base_fn
178 using exclusive_scan_base_fn::operator();
180 template<
typename T,
typename Fun = plus>
181 constexpr auto operator()(T init, Fun fun = {})
const
183 return make_view_closure(
184 bind_back(exclusive_scan_base_fn{}, std::move(init), std::move(fun)));
190 RANGES_INLINE_VARIABLE(exclusive_scan_fn, exclusive_scan)
195#include <range/v3/detail/epilogue.hpp>
The exclusive_scan_constraints_ concept.
The exclusive_scan_constraints concept.
decltype(begin(declval(Rng &))) iterator_t
Definition access.hpp:698
std::integral_constant< bool, B > bool_
An integral constant wrapper for bool.
Definition meta.hpp:168
defer< bind_back, Fn, Ts... > bind_back
Definition meta.hpp:994
_t< detail::_if_< list< Args... > > > if_
Select one type or another depending on a compile-time Boolean.
Definition meta.hpp:1247
Definition adaptor.hpp:110
Definition exclusive_scan.hpp:52
Definition arithmetic.hpp:25
Definition adaptor.hpp:475