simdutf 8.0.0
Unicode at GB/s.
Loading...
Searching...
No Matches
valid_utf16_to_latin1.h
1#ifndef SIMDUTF_VALID_UTF16_TO_LATIN1_H
2#define SIMDUTF_VALID_UTF16_TO_LATIN1_H
3
4namespace simdutf {
5namespace scalar {
6namespace {
7namespace utf16_to_latin1 {
8
9template <endianness big_endian, class InputIterator, class OutputIterator>
10simdutf_constexpr23 inline size_t
11convert_valid_impl(InputIterator data, size_t len,
12 OutputIterator latin_output) {
13 static_assert(
14 std::is_same<typename std::decay<decltype(*data)>::type, uint16_t>::value,
15 "must decay to uint16_t");
16 size_t pos = 0;
17 const auto start = latin_output;
18 uint16_t word = 0;
19
20 while (pos < len) {
21 word = !match_system(big_endian) ? u16_swap_bytes(data[pos]) : data[pos];
22 *latin_output++ = char(word);
23 pos++;
24 }
25
26 return latin_output - start;
27}
28
29template <endianness big_endian>
30simdutf_really_inline size_t convert_valid(const char16_t *buf, size_t len,
31 char *latin_output) {
32 return convert_valid_impl<big_endian>(reinterpret_cast<const uint16_t *>(buf),
33 len, latin_output);
34}
35} // namespace utf16_to_latin1
36} // unnamed namespace
37} // namespace scalar
38} // namespace simdutf
39
40#endif