1#ifndef SIMDUTF_VALID_UTF8_TO_LATIN1_H
2#define SIMDUTF_VALID_UTF8_TO_LATIN1_H
7namespace utf8_to_latin1 {
9template <
typename InputPtr>
10#if SIMDUTF_CPLUSPLUS20
11 requires simdutf::detail::indexes_into_byte_like<InputPtr>
13simdutf_constexpr23
size_t convert_valid(InputPtr data,
size_t len,
17 char *start{latin_output};
20#if SIMDUTF_CPLUSPLUS23
25 if (pos + 16 <= len) {
28 ::memcpy(&v1, data + pos,
sizeof(uint64_t));
30 ::memcpy(&v2, data + pos +
sizeof(uint64_t),
sizeof(uint64_t));
34 if ((v & 0x8080808080808080) ==
37 size_t final_pos = pos + 16;
38 while (pos < final_pos) {
39 *latin_output++ = uint8_t(data[pos]);
48 auto leading_byte = uint8_t(data[pos]);
49 if (leading_byte < 0b10000000) {
51 *latin_output++ = char(leading_byte);
53 }
else if ((leading_byte & 0b11100000) ==
59 if ((uint8_t(data[pos + 1]) & 0b11000000) != 0b10000000) {
65 (leading_byte & 0b00011111) << 6 |
66 (uint8_t(data[pos + 1]) &
72 *latin_output++ = char(code_point);
79 return latin_output - start;