1#ifndef SIMDUTF_VALID_UTF32_TO_LATIN1_H
2#define SIMDUTF_VALID_UTF32_TO_LATIN1_H
9namespace utf32_to_latin1 {
11template <
typename ReadPtr,
typename WritePtr>
12simdutf_constexpr23
size_t convert_valid(ReadPtr data,
size_t len,
13 WritePtr latin1_output) {
15 std::is_same<
typename std::decay<
decltype(*data)>::type, uint32_t>::value,
16 "dereferencing the data pointer must result in a uint32_t");
17 auto start = latin1_output;
22 utf32_char = data[pos];
24#if SIMDUTF_CPLUSPLUS23
33 std::memcpy(&v, data + pos,
sizeof(uint64_t));
34 if ((v & 0xFFFFFF00FFFFFF00) == 0) {
35 *latin1_output++ = char(data[pos]);
36 *latin1_output++ = char(data[pos + 1]);
44#if SIMDUTF_CPLUSPLUS23
47 if ((utf32_char & 0xFFFFFF00) == 0) {
48 *latin1_output++ = char(utf32_char);
55 return latin1_output - start;
58simdutf_really_inline
size_t convert_valid(
const char32_t *buf,
size_t len,
59 char *latin1_output) {
60 return convert_valid(
reinterpret_cast<const uint32_t *
>(buf), len,
helpers placed in namespace detail are not a part of the public API