10#ifndef ALTERNATING_ITERATOR_HPP
11#define ALTERNATING_ITERATOR_HPP
19template <
typename Titer>
22 using value_type =
typename Titer::value_type;
23 using difference_type = std::ptrdiff_t;
24 using iterator_category = std::forward_iterator_tag;
25 using pointer =
typename Titer::pointer;
26 using reference =
typename Titer::reference;
42 this->
position = begin ? 0 : std::distance(this->first, this->last);
62 return this->position <=> rhs.
position;
65 inline reference operator*()
const
72 size_t size =
static_cast<size_t>(std::distance(this->
first, this->
last));
76 if (this->
position < size) this->Next();
88 inline Titer Base()
const
109 if (this->next_state) {
110 assert(this->after != this->last);
112 this->next_state = this->before == this->
first;
114 assert(this->before != this->first);
116 this->next_state = std::next(this->after) != this->
last;
121template <
typename Titer>
122class AlternatingView :
public std::ranges::view_interface<AlternatingIterator<Titer>> {
Iterator that alternately takes from the "middle" of a range.
Titer last
Initial last iterator.
Titer before
Current iterator before the middle.
bool next_state
Next state for advancing iterator. If true take from after middle, otherwise take from before middle.
size_t position
Position within the entire range.
Titer middle
Initial middle iterator.
AlternatingIterator(Titer first, Titer last, Titer middle, bool begin)
Construct an AlternatingIterator.
Titer first
Initial first iterator.
bool state
Current state for reading iterator. If true take from after middle, otherwise take from before middle...
Titer after
Current iterator after the middle.
Titer middle
Iterator to middle element.
Titer first
Iterator to first element.
Titer last
Iterator to last element.