15template<concepts::ForwardContainer View>
16requires(concepts::View<View>)
19 template<
bool is_const>
22 template<
bool is_const>
25 template<
bool is_const>
28 template<
bool is_const>
31 template<
bool is_const>
34 template<
bool is_const>
37 meta::Conditional<concepts::RandomAccessIterator<Iter<is_const>>, RandomAccessIteratorTag,
38 meta::Conditional<concepts::BidirectionalIterator<Iter<is_const>>,
39 BidirectionalIteratorTag, ForwardIteratorTag>>,
40 Value<is_const>, SSizeType<is_const>> {
44 constexpr explicit Iterator(Parent<is_const>* parent, Iter<is_const>
base)
45 : m_parent(parent), m_base(util::move(
base)) {}
47 constexpr auto get_end() {
51 if (!m_parent->m_end_cache) {
54 return m_parent->m_end_cache.value.value();
61 template<
bool other_is_const = !is_const>
62 constexpr Iterator(Iterator<other_is_const> other)
64 : m_parent(other.m_parent), m_base(util::move(other.m_base)), m_cycle_number(other.m_cycle_number) {}
66 constexpr auto base()
const& {
return m_base; }
67 constexpr auto base() && {
return util::move(m_base); }
69 constexpr auto operator*()
const ->
decltype(
auto) {
return *m_base; }
71 constexpr void advance_one() {
72 if (++m_base == get_end()) {
78 constexpr void back_one()
88 constexpr void advance_n(SSizeType<is_const> n)
94 auto offset = m_base - start;
95 auto new_offset = (offset + n) %
size;
100 m_base = start + new_offset;
101 m_cycle_number += (offset + n) /
size;
106 friend class Iterator;
108 constexpr friend auto operator==(Iterator
const& a, Iterator
const& b) ->
bool {
109 return a.m_cycle_number == b.m_cycle_number && a.m_base == b.m_base;
112 constexpr friend auto operator<=>(Iterator
const& a, Iterator
const& b)
116 if (
auto result = a.m_cycle_number <=> b.m_cycle_number; result != 0) {
117 return static_cast<Result>(result);
119 return a.m_base <=> b.m_base;
122 constexpr friend auto operator-(Iterator
const& a, Iterator
const& b) -> SSizeType<is_const>
128 return (a.m_cycle_number - b.m_cycle_number) *
size + (a.m_base - b.m_base);
131 Parent<is_const>* m_parent {
nullptr };
132 Iter<is_const> m_base {};
152 return util::move(m_base);
178template<
typename Con>
Definition cycle_view.h:17
constexpr auto begin()
Definition cycle_view.h:158
constexpr auto base() &&-> View requires(concepts::CopyConstructible< View >)
Definition cycle_view.h:149
constexpr CycleView(View view)
Definition cycle_view.h:141
constexpr auto end() const
Definition cycle_view.h:170
constexpr auto base_ref() const -> View const &
Definition cycle_view.h:156
constexpr auto begin() const
Definition cycle_view.h:164
constexpr auto base() const &-> View requires(concepts::CopyConstructible< View >)
Definition cycle_view.h:143
constexpr auto base_ref() -> View &
Definition cycle_view.h:155
Definition view_interface.h:26
constexpr auto size()
Definition view_interface.h:86
Definition bidirectional_iterator.h:8
Definition common_container.h:10
Definition operations.h:99
Definition operations.h:34
Definition operations.h:27
Definition random_access_iterator.h:12
Definition simple_view.h:11
Definition any_storable.h:9
constexpr auto next
Definition next.h:35
constexpr auto operator<=>(MoveIterator< Iter > const &a, MoveIterator< U > const &b)
Definition move_iterator.h:90
constexpr auto operator-(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> decltype(a.base() - b.base())
Definition move_iterator.h:95
constexpr auto move
Definition move.h:38
CycleView(Con &&) -> CycleView< meta::AsView< Con > >
constexpr auto unreachable_sentinel
Definition unreachable_sentinel.h:11
constexpr auto operator==(MoveIterator< Iter > const &a, MoveIterator< U > const &b) -> bool
Definition move_iterator.h:85
constexpr auto distance
Definition distance.h:44
constexpr auto end
Definition end.h:47
constexpr auto begin
Definition begin.h:44
ptrdiff_t ssize_t
Definition ssize_t.h:6
Expected< T, Error > Result
Definition result.h:8
Definition iterator_base.h:14