45 using value_type = char32_t;
46 using difference_type = std::ptrdiff_t;
47 using iterator_category = std::bidirectional_iterator_tag;
49 using reference = void;
52 iterator(std::string_view src,
size_t position) : src(src), position(position) {}
54 size_t GetByteOffset()
const
56 return this->position;
59 bool operator==(
const iterator &rhs)
const
61 assert(this->src.data() == rhs.src.data());
62 return this->position == rhs.position;
65 std::strong_ordering operator<=>(
const iterator &rhs)
const
67 assert(this->src.data() == rhs.src.data());
68 return this->position <=> rhs.position;
71 char32_t operator*()
const
73 assert(this->position < this->src.size());
74 auto [len, c] =
DecodeUtf8(this->src.substr(this->position));
75 return len > 0 ? c :
'?';
78 iterator& operator++()
80 auto size = this->src.size();
81 assert(this->position < size);
84 }
while (this->position < size && IsUtf8Part(this->src[this->position]));
88 iterator operator++(
int)
90 iterator result = *
this;
95 iterator& operator--()
97 assert(this->position > 0);
100 }
while (this->position > 0 && IsUtf8Part(this->src[this->position]));
104 iterator operator--(
int)
106 iterator result = *
this;