11#include <dr/concepts/concepts.hpp>
12#include <dr/detail/ranges_shim.hpp>
14namespace dr::__detail {
18 using value_type = std::iter_value_t<Iter>;
19 using difference_type =
long long;
21 using reference = value_type;
25 using iterator_category = std::random_access_iterator_tag;
28 : iter_(iter), len_(len), pos_(pos) {}
35 return iter_ == other.iter_ && pos_ == other.pos_ && len_ == other.len_;
39 return iter_ != other.iter_ || pos_ != other.pos_ || len_ != other.len_;
42 iterator operator+(difference_type offset)
const noexcept {
43 return iterator(iter_, len_, pos_ + offset);
46 iterator operator-(difference_type offset)
const noexcept {
47 return iterator(iter_, len_, pos_ + offset);
50 difference_type operator-(
iterator other)
const noexcept {
51 return pos_ - other.pos_;
54 bool operator<(
iterator other)
const noexcept {
return pos_ < other.pos_; }
56 bool operator>(
iterator other)
const noexcept {
return pos_ > other.pos_; }
58 bool operator<=(
iterator other)
const noexcept {
return pos_ <= other.pos_; }
60 bool operator>=(
iterator other)
const noexcept {
return pos_ >= other.pos_; }
84 iterator &operator+=(difference_type offset)
noexcept {
89 iterator &operator-=(difference_type offset)
noexcept {
94 reference operator*()
const noexcept {
return *(iter_ + (pos_ % len_)); }
96 reference operator[](difference_type offset)
const noexcept {
97 return *(*
this + offset);
101 return iter.pos_ + n;
107 auto iter = dr::ranges::__detail::local(iter_);
117template <rng::random_access_range V>
118 requires(rng::sized_range<V>)
121 template <rng::viewable_range R>
123 : base_(rng::views::all(std::forward<R>(r))), n_(n) {}
134 auto size()
const {
return rng::size(base_); }
141template <rng::viewable_range R>
Definition: multiply_view.hpp:16
Definition: multiply_view.hpp:119
Definition: ranges.hpp:242