From f40c9798103fd6d4d1fb2f4b55d43cb1cc9dbffe Mon Sep 17 00:00:00 2001 From: Markus Scherer Date: Fri, 14 Mar 2025 20:00:16 -0700 Subject: [PATCH] ICU-23004 string_view cp iterator back to sv.begin()/end() CodeUnits.stringView() get the pointer from &*start_ iterator --- icu4c/source/common/unicode/utfiter.h | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/icu4c/source/common/unicode/utfiter.h b/icu4c/source/common/unicode/utfiter.h index 77efcad71a2..9da2954bd45 100644 --- a/icu4c/source/common/unicode/utfiter.h +++ b/icu4c/source/common/unicode/utfiter.h @@ -159,17 +159,24 @@ public: */ uint8_t length() const { return len_; } + // C++17: There is no test for contiguous_iterator, so we just work with pointers + // and with string and string_view iterators. /** * @return a string_view of the minimal Unicode code unit sequence. - * Only enabled if UnitIter is a pointer. + * Only enabled if UnitIter is a pointer, a string_view::iterator, or a string::iterator. * @draft ICU 78 */ template std::enable_if_t< - std::is_pointer_v, + std::is_pointer_v || + std::is_same_v::iterator> || + std::is_same_v::iterator>, std::basic_string_view> stringView() const { - return std::basic_string_view(start_, len_); + // C++20: + // - require https://en.cppreference.com/w/cpp/iterator/contiguous_iterator + // - return string_view(begin(), end()) + return std::basic_string_view(&*start_, len_); } private: @@ -1287,6 +1294,7 @@ namespace U_HEADER_ONLY_NAMESPACE { */ template class UTFStringCodePoints { + using UnitIter = typename std::basic_string_view::iterator; public: /** * Constructs a C++ "range" object over the code points in the string. @@ -1302,14 +1310,12 @@ public: /** @draft ICU 78 */ auto begin() const { - const Unit *limit = s.data() + s.length(); - return UTFIterator(s.data(), s.data(), limit); + return UTFIterator(s.begin(), s.begin(), s.end()); } /** @draft ICU 78 */ auto end() const { - const Unit *limit = s.data() + s.length(); - return UTFIterator(s.data(), limit, limit); + return UTFIterator(s.begin(), s.end(), s.end()); } /** @@ -1826,6 +1832,7 @@ namespace U_HEADER_ONLY_NAMESPACE { */ template class UnsafeUTFStringCodePoints { + using UnitIter = typename std::basic_string_view::iterator; public: /** * Constructs a C++ "range" object over the code points in the string. @@ -1841,12 +1848,12 @@ public: /** @draft ICU 78 */ auto begin() const { - return UnsafeUTFIterator(s.data()); + return UnsafeUTFIterator(s.begin()); } /** @draft ICU 78 */ auto end() const { - return UnsafeUTFIterator(s.data() + s.length()); + return UnsafeUTFIterator(s.end()); } /**