19 : m_current(current), m_head(head), m_tail(tail), m_begin(
begin), m_end(
end), m_at_end(at_end) {}
26 : m_current(other.m_current)
27 , m_head(other.m_head)
28 , m_tail(other.m_tail)
29 , m_begin(other.m_begin)
31 , m_at_end(other.m_at_end) {}
56 if (m_current == m_end - 1) {
61 if (m_current == m_tail) {
67 DI_ASSERT(m_current != m_head || m_at_end);
68 if (m_current == m_begin) {
69 m_current = m_end - 1;
81 auto max_distance = distance_to_tail();
84 if (n == max_distance) {
90 auto distance_to_end = m_end - m_current;
91 if (n < distance_to_end) {
94 m_current = m_begin + (n - distance_to_end);
101 auto distance_to_begin = m_current - m_begin;
102 if (-n <= distance_to_begin) {
105 m_current = m_end + n + distance_to_begin;
115 return a.m_at_end == b.m_at_end && a.m_current == b.m_current;
125 if (a.m_at_end || b.m_at_end) {
126 return a.m_at_end <=> b.m_at_end;
130 if (
auto result = (a.m_current < a.m_head) <=> (b.m_current < b.m_head); result != 0) {
135 return a.m_current <=> b.m_current;
138 constexpr auto distance_to_tail() const ->
isize {
142 if (m_current < m_tail) {
143 return m_tail - m_current;
145 return m_end - m_current + (m_tail - m_begin);
154 return b.distance_to_tail() - a.distance_to_tail();
157 T* m_current {
nullptr };
158 T* m_head {
nullptr };
159 T* m_tail {
nullptr };
160 T* m_begin {
nullptr };
161 T* m_end {
nullptr };
162 bool m_at_end {
true };
#define DI_ASSERT(...)
Definition assert_bool.h:7
constexpr void back_one()
Definition ring_iterator.h:66
constexpr auto operator*() const -> T &
Definition ring_iterator.h:45
constexpr friend auto operator-(RingIterator const &a, RingIterator const &b) -> isize
Definition ring_iterator.h:148
auto operator=(RingIterator const &) -> RingIterator &=default
constexpr RingIterator(RingIterator< meta::RemoveConst< T > > const &other)
Definition ring_iterator.h:24
friend class RingIterator
Definition ring_iterator.h:13
constexpr friend auto operator<=>(RingIterator const &a, RingIterator const &b)
Definition ring_iterator.h:118
constexpr void advance_n(isize n)
Definition ring_iterator.h:76
RingIterator(RingIterator const &)=default
auto operator=(RingIterator &&) -> RingIterator &=default
constexpr auto operator->() const -> T *
Definition ring_iterator.h:49
constexpr RingIterator(T *current, T *head, T *tail, T *begin, T *end, bool at_end)
Definition ring_iterator.h:18
RingIterator(RingIterator &&)=default
constexpr void advance_one()
Definition ring_iterator.h:54
constexpr friend auto operator==(RingIterator const &a, RingIterator const &b) -> bool
Definition ring_iterator.h:110
constexpr auto unconst_unsafe() const
Definition ring_iterator.h:36
constexpr auto end
Definition end.h:47
constexpr auto begin
Definition begin.h:44
ssize_t isize
Definition integers.h:34