From 6cf5eb008beb4ee8d413242c3112b86f69763cbd Mon Sep 17 00:00:00 2001 From: lisyarus Date: Sun, 13 Apr 2025 12:42:51 +0300 Subject: [PATCH] Support operator--() for util::utf8_iterator --- libs/util/include/psemek/util/unicode.hpp | 6 +++++- libs/util/source/unicode.cpp | 15 +++++++++++++++ 2 files changed, 20 insertions(+), 1 deletion(-) diff --git a/libs/util/include/psemek/util/unicode.hpp b/libs/util/include/psemek/util/unicode.hpp index 31a2dc94..8cbb914c 100644 --- a/libs/util/include/psemek/util/unicode.hpp +++ b/libs/util/include/psemek/util/unicode.hpp @@ -17,12 +17,16 @@ namespace psemek::util using pointer = void; using reference = void; using difference_type = std::ptrdiff_t; - using iterator_category = std::input_iterator_tag; + using iterator_category = std::bidirectional_iterator_tag; char const * ptr; utf8_iterator & operator ++(); utf8_iterator operator ++(int); + + utf8_iterator & operator --(); + utf8_iterator operator --(int); + char32_t operator *() const; }; diff --git a/libs/util/source/unicode.cpp b/libs/util/source/unicode.cpp index 2b44ec43..e7fa9ef0 100644 --- a/libs/util/source/unicode.cpp +++ b/libs/util/source/unicode.cpp @@ -82,6 +82,21 @@ namespace psemek::util return copy; } + utf8_iterator & utf8_iterator::operator --() + { + --ptr; + while (is_middle_byte(*ptr)) + --ptr; + return *this; + } + + utf8_iterator utf8_iterator::operator --(int) + { + utf8_iterator copy(*this); + --(*this); + return copy; + } + char32_t utf8_iterator::operator *() const { if (is_1_byte(ptr[0]))