41 using value_type = char32_t;
42 using difference_type = std::ptrdiff_t;
43 using iterator_category = std::bidirectional_iterator_tag;
45 using reference = void;
48 iterator(std::string_view src,
size_t position) : src(src), position(position) {}
50 size_t GetByteOffset()
const
52 return this->position;
55 bool operator==(
const iterator &rhs)
const
57 assert(this->src.data() == rhs.src.data());
58 return this->position == rhs.position;
61 std::strong_ordering operator<=>(
const iterator &rhs)
const
63 assert(this->src.data() == rhs.src.data());
64 return this->position <=> rhs.position;
67 char32_t operator*()
const
69 assert(this->position < this->src.size());
70 auto [len, c] =
DecodeUtf8(this->src.substr(this->position));
71 return len > 0 ? c :
'?';
76 auto size = this->src.size();
77 assert(this->position < size);
80 }
while (this->position < size && IsUtf8Part(this->src[this->position]));
93 assert(this->position > 0);
96 }
while (this->position > 0 && IsUtf8Part(this->src[this->position]));