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>
43 viewable_range<Rng> && input_range<Rng> &&
44 copy_constructible<T> &&
45 CPP_concept_ref(ranges::exclusive_scan_constraints_, Rng, T, Fun);
50 template<
typename Rng,
typename T,
typename Fun>
55 CPP_assert(exclusive_scan_constraints<Rng, T, 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>)(
123 requires exclusive_scan_constraints<Rng const, T, Fun const>)
128 auto end_adaptor()
const
130 requires exclusive_scan_constraints<Rng const, T, Fun 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
144 requires sized_range<Rng const>)
149 auto CPP_fun(
size)()(
150 requires sized_range<Rng>)
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>)
167 template(
typename Rng,
typename T,
typename Fun =
plus)(
168 requires exclusive_scan_constraints<Rng, T, Fun>)
170 operator()(Rng && rng, T init, Fun fun = Fun{})
const
172 return {all(
static_cast<Rng &&
>(rng)), std::move(init), std::move(fun)};
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(
195 #include <range/v3/detail/epilogue.hpp>
CPP_concept exclusive_scan_constraints
\concept exclusive_scan_constraints
Definition: exclusive_scan.hpp:42
CPP_concept invocable
\concept invocable
Definition: concepts.hpp:48
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
_t< detail::_if_< list< Args... > >> if_
Select one type or another depending on a compile-time Boolean.
Definition: meta.hpp:1247
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: adaptor.hpp:110
Definition: exclusive_scan.hpp:52
Definition: adaptor.hpp:475
Definition: exclusive_scan.hpp:166
Definition: exclusive_scan.hpp:177