11#include <dr/concepts/concepts.hpp>
12#include <dr/detail/ranges_shim.hpp>
16template <std::random_access_iterator Iter, std::copy_constructible F>
19 using value_type = std::invoke_result_t<F, std::iter_value_t<Iter>>;
20 using difference_type = std::iter_difference_t<Iter>;
22 using reference = value_type;
26 using iterator_category = std::random_access_iterator_tag;
35 return iter_ == other.iter_;
39 return iter_ != other.iter_;
42 iterator operator+(difference_type offset)
const noexcept {
43 return iterator(iter_ + offset, fn_);
46 iterator operator-(difference_type offset)
const noexcept {
47 return iterator(iter_ - offset, fn_);
50 difference_type operator-(
iterator other)
const noexcept {
51 return iter_ - other.iter_;
54 bool operator<(
iterator other)
const noexcept {
return iter_ < other.iter_; }
56 bool operator>(
iterator other)
const noexcept {
return iter_ > other.iter_; }
58 bool operator<=(
iterator other)
const noexcept {
59 return iter_ <= other.iter_;
62 bool operator>=(
iterator other)
const noexcept {
63 return iter_ >= other.iter_;
88 iterator &operator+=(difference_type offset)
noexcept {
93 iterator &operator-=(difference_type offset)
noexcept {
98 reference operator*()
const noexcept {
return fn_(*iter_); }
100 reference operator[](difference_type offset)
const noexcept {
101 return *(*
this + offset);
105 return iter.iter_ + n;
111 auto iter = dr::ranges::__detail::local(iter_);
120template <rng::random_access_range V, std::copy_constructible F>
121 requires(std::is_default_constructible_v<F>)
124 template <rng::viewable_range R>
126 : base_(rng::views::all(std::forward<R>(r))), fn_(fn) {}
133 requires(rng::sized_range<V>)
135 return rng::size(base_);
138 auto segments()
const
142 return dr::ranges::segments(base_) |
143 rng::views::transform([fn]<
typename T>(T &&segment) {
145 std::forward<T>(segment), fn);
152 return dr::ranges::rank(base_);
155 V base()
const {
return base_; }
162template <rng::viewable_range R, std::copy_constructible F>
171 template <rng::viewable_range R>
auto operator()(R &&r)
const {
175 template <rng::viewable_range R>
177 return closure(std::forward<R>(r));
186 template <rng::viewable_range R, std::copy_constructible F>
187 auto operator()(R &&r, F &&f)
const {
191 template <std::copy_constructible F>
auto operator()(F &&fn)
const {
204template <rng::random_access_range V, std::copy_constructible F>
205inline constexpr bool rng::enable_borrowed_range<dr::transform_view<V, F>> =
Definition: concepts.hpp:20
Definition: ranges.hpp:242
Definition: concepts.hpp:16