10#include "../utility/utility.hpp"
25template<
size_t LookaheadCount,
typename It, std::sentinel_for<It> ItEnd = std::default_sentinel_t>
26class lookahead_iterator {
28 static_assert(std::has_single_bit(
LookaheadCount),
"LookaheadCount must be a power of two.");
33 using reference = value_type
const &;
34 using pointer = value_type
const *;
40 using value_type = value_type;
44 constexpr proxy(
proxy const &)
noexcept =
default;
46 constexpr proxy &operator=(
proxy const &)
noexcept =
default;
47 constexpr proxy &operator=(
proxy &&)
noexcept =
default;
50 constexpr reference operator*()
const noexcept
55 constexpr pointer operator->()
const noexcept
72 while (_size != max_size
and _it != last) {
73 add_one_to_lookahead();
100 [[
nodiscard]]
constexpr bool operator==(std::default_sentinel_t)
const noexcept
113 return _lookahead[(_tail + i) % max_size];
150 hi_axiom(_size != 0);
158 hi_axiom(_size != 0);
166 hi_axiom(_size != 0);
169 add_one_to_lookahead();
176 for (
auto i = 0
_uz; i != n; ++i) {
184 auto r = proxy{**
this};
197 constexpr void add_one_to_lookahead()
noexcept
199 hi_axiom(_size < max_size);
202 _lookahead[(_tail + _size) % max_size] = *_it;
209static_assert(std::movable<lookahead_iterator<2, std::string::iterator, std::string::iterator>>);
210static_assert(std::is_same_v<std::iterator_traits<lookahead_iterator<2, std::string::iterator, std::string::iterator>>::value_type,
char>);
211static_assert(std::input_or_output_iterator<lookahead_iterator<2, std::string::iterator, std::string::iterator>>);
212static_assert(std::weakly_incrementable<lookahead_iterator<2, std::string::iterator, std::string::iterator>>);
221template<
size_t LookaheadCount,
typename It, std::sentinel_for<It> ItEnd = std::default_sentinel_t>
222auto make_lookahead_iterator(
It first, ItEnd last = std::default_sentinel)
noexcept
234template<
size_t LookaheadCount, std::ranges::range Range>
@ other
The gui_event does not have associated data.
DOXYGEN BUG.
Definition algorithm.hpp:16
geometry/margins.hpp
Definition lookahead_iterator.hpp:5
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377
Lookahead iterator.
Definition lookahead_iterator.hpp:15
constexpr reference operator*() const noexcept
Get a reference to the value at the iterator.
Definition lookahead_iterator.hpp:148
constexpr lookahead_iterator & operator++() noexcept
Increment the iterator.
Definition lookahead_iterator.hpp:164
constexpr reference at(size_t i) const
Get a reference to an item at or beyond the iterator.
Definition lookahead_iterator.hpp:122
constexpr size_t size() const noexcept
The number of entries can be looked ahead.
Definition lookahead_iterator.hpp:81
lookahead_iterator & operator++() noexcept
Increment the iterator.
Definition lookahead_iterator.hpp:127
constexpr bool empty() const noexcept
Check if the iterator is at end.
Definition lookahead_iterator.hpp:90
constexpr std::optional< value_type > next(size_t i=1) const noexcept
Get a reference to an item at or beyond the iterator.
Definition lookahead_iterator.hpp:137
constexpr reference operator[](size_t i) const noexcept
Get a reference to an item at or beyond the iterator.
Definition lookahead_iterator.hpp:110
constexpr pointer operator->() const noexcept
Get a pointer to the value at the iterator.
Definition lookahead_iterator.hpp:156
Definition lookahead_iterator.hpp:38
Definition concepts.hpp:39
Definition concepts.hpp:42