47 const auto lead {
static_cast<std::uint8_t
>(text[pos])};
49 return {.
cp = lead, .length = 1, .valid =
true};
51 std::size_t length {};
53 std::uint32_t min_cp {};
54 if ((lead & 0xE0U) == 0xC0U) {
59 else if ((lead & 0xF0U) == 0xE0U) {
64 else if ((lead & 0xF8U) == 0xF0U) {
70 return {.cp = 0, .length = 1, .valid =
false};
72 for (std::size_t i = 1; i < length; ++i) {
73 if (pos + i >= text.size()) {
74 return {.cp = 0, .length = i, .valid =
false};
76 const auto byte {
static_cast<std::uint8_t
>(text[pos + i])};
77 if ((
byte & 0xC0U) != 0x80U) {
78 return {.cp = 0, .length = i, .valid =
false};
80 cp = (cp << 6U) | (
byte & 0x3FU);
83 return {.cp = cp, .length = length, .valid =
false};
85 if (cp > 0x10FFFFU || (cp >= 0xD800U && cp <= 0xDFFFU)) {
86 return {.cp = cp, .length = length, .valid =
false};
88 return {.cp = cp, .length = length, .valid =
true};
constexpr std::size_t codepoint_advance(std::string_view text, std::size_t pos)
Number of bytes from pos to the next code-point boundary, for advancing past an empty match during it...