1#ifndef SIMDUTF_VALID_UTF32_TO_LATIN1_H
2#define SIMDUTF_VALID_UTF32_TO_LATIN1_H
7namespace utf32_to_latin1 {
9template <
typename ReadPtr,
typename WritePtr>
10simdutf_constexpr23
size_t convert_valid(ReadPtr data,
size_t len,
11 WritePtr latin1_output) {
13 std::is_same<
typename std::decay<
decltype(*data)>::type, uint32_t>::value,
14 "dereferencing the data pointer must result in a uint32_t");
15 auto start = latin1_output;
20 utf32_char = data[pos];
22#if SIMDUTF_CPLUSPLUS23
31 std::memcpy(&v, data + pos,
sizeof(uint64_t));
32 if ((v & 0xFFFFFF00FFFFFF00) == 0) {
33 *latin1_output++ = char(data[pos]);
34 *latin1_output++ = char(data[pos + 1]);
42#if SIMDUTF_CPLUSPLUS23
45 if ((utf32_char & 0xFFFFFF00) == 0) {
46 *latin1_output++ = char(utf32_char);
53 return latin1_output - start;
56simdutf_really_inline
size_t convert_valid(
const char32_t *buf,
size_t len,
57 char *latin1_output) {
58 return convert_valid(
reinterpret_cast<const uint32_t *
>(buf), len,