1
0
Fork 0

Codechange: Use Utf8View in Utf8StringLength.

pull/13960/head
frosch 2025-04-01 18:21:03 +02:00 committed by frosch
parent 83401ad5e2
commit f19e75b606
4 changed files with 17 additions and 19 deletions

View File

@ -389,23 +389,10 @@ bool StrContainsIgnoreCase(const std::string_view str, const std::string_view va
* @param s The string to get the length for. * @param s The string to get the length for.
* @return The length of the string in characters. * @return The length of the string in characters.
*/ */
size_t Utf8StringLength(const char *s) size_t Utf8StringLength(std::string_view str)
{ {
size_t len = 0; Utf8View view(str);
const char *t = s; return std::distance(view.begin(), view.end());
while (Utf8Consume(&t) != 0) len++;
return len;
}
/**
* Get the length of an UTF-8 encoded string in number of characters
* and thus not the number of bytes that the encoded string contains.
* @param s The string to get the length for.
* @return The length of the string in characters.
*/
size_t Utf8StringLength(const std::string &str)
{
return Utf8StringLength(str.c_str());
} }
bool strtolower(std::string &str, std::string::size_type offs) bool strtolower(std::string &str, std::string::size_type offs)

View File

@ -174,8 +174,7 @@ inline std::string::iterator Utf8PrevChar(std::string::iterator &s)
return cur; return cur;
} }
size_t Utf8StringLength(const char *s); size_t Utf8StringLength(std::string_view str);
size_t Utf8StringLength(const std::string &str);
/** /**
* Is the given character a lead surrogate code point? * Is the given character a lead surrogate code point?

View File

@ -95,6 +95,8 @@ TEST_CASE("Utf8View - iterate")
auto it = begin; auto it = begin;
CHECK(it == begin); CHECK(it == begin);
CHECK(it.GetByteOffset() == 0); CHECK(it.GetByteOffset() == 0);
CHECK(std::distance(begin, it) == 0);
CHECK(std::distance(it, end) == 5);
CHECK(*it == 0x1234); CHECK(*it == 0x1234);
CHECK(it == view.GetIterAtByte(0)); CHECK(it == view.GetIterAtByte(0));
CHECK(it == view.GetIterAtByte(1)); CHECK(it == view.GetIterAtByte(1));
@ -103,20 +105,28 @@ TEST_CASE("Utf8View - iterate")
CHECK(begin < it); CHECK(begin < it);
CHECK(it < end); CHECK(it < end);
CHECK(it.GetByteOffset() == 3); CHECK(it.GetByteOffset() == 3);
CHECK(std::distance(begin, it) == 1);
CHECK(std::distance(it, end) == 4);
CHECK(*it == 'a'); CHECK(*it == 'a');
CHECK(it == view.GetIterAtByte(3)); CHECK(it == view.GetIterAtByte(3));
++it; ++it;
CHECK(it.GetByteOffset() == 4); CHECK(it.GetByteOffset() == 4);
CHECK(std::distance(begin, it) == 2);
CHECK(std::distance(it, end) == 3);
CHECK(*it == 0); CHECK(*it == 0);
CHECK(it == view.GetIterAtByte(4)); CHECK(it == view.GetIterAtByte(4));
++it; ++it;
CHECK(it.GetByteOffset() == 5); CHECK(it.GetByteOffset() == 5);
CHECK(std::distance(begin, it) == 3);
CHECK(std::distance(it, end) == 2);
CHECK(*it == 'b'); CHECK(*it == 'b');
CHECK(it == view.GetIterAtByte(5)); CHECK(it == view.GetIterAtByte(5));
++it; ++it;
CHECK(begin < it); CHECK(begin < it);
CHECK(it < end); CHECK(it < end);
CHECK(it.GetByteOffset() == 6); CHECK(it.GetByteOffset() == 6);
CHECK(std::distance(begin, it) == 4);
CHECK(std::distance(it, end) == 1);
CHECK(*it == 0x00012345); CHECK(*it == 0x00012345);
CHECK(it == view.GetIterAtByte(6)); CHECK(it == view.GetIterAtByte(6));
CHECK(it == view.GetIterAtByte(7)); CHECK(it == view.GetIterAtByte(7));
@ -125,6 +135,8 @@ TEST_CASE("Utf8View - iterate")
++it; ++it;
CHECK(begin < it); CHECK(begin < it);
CHECK(it.GetByteOffset() == 10); CHECK(it.GetByteOffset() == 10);
CHECK(std::distance(begin, it) == 5);
CHECK(std::distance(it, end) == 0);
CHECK(it == end); CHECK(it == end);
CHECK(it == view.GetIterAtByte(10)); CHECK(it == view.GetIterAtByte(10));
--it; --it;

View File

@ -444,7 +444,7 @@ void Textbuf::Assign(const std::string_view text)
*/ */
void Textbuf::UpdateSize() void Textbuf::UpdateSize()
{ {
this->chars = static_cast<uint16_t>(Utf8StringLength(this->buf.c_str()) + 1); // terminating zero this->chars = static_cast<uint16_t>(Utf8StringLength(this->buf) + 1); // terminating zero
assert(this->buf.size() < this->max_bytes); assert(this->buf.size() < this->max_bytes);
assert(this->chars <= this->max_chars); assert(this->chars <= this->max_chars);