1#ifndef SIMDUTF_IMPLEMENTATION_H
2#define SIMDUTF_IMPLEMENTATION_H
3#if !defined(SIMDUTF_NO_THREADS)
6#ifdef SIMDUTF_INTERNAL_TESTS
9#include "simdutf/common_defs.h"
10#include "simdutf/compiler_check.h"
11#include "simdutf/encoding_types.h"
12#include "simdutf/error.h"
13#include "simdutf/internal/isadetection.h"
18 #include <type_traits>
32#ifndef SIMDUTF_FEATURE_DETECT_ENCODING
33 #define SIMDUTF_FEATURE_DETECT_ENCODING 1
35#ifndef SIMDUTF_FEATURE_ASCII
36 #define SIMDUTF_FEATURE_ASCII 1
38#ifndef SIMDUTF_FEATURE_LATIN1
39 #define SIMDUTF_FEATURE_LATIN1 1
41#ifndef SIMDUTF_FEATURE_UTF8
42 #define SIMDUTF_FEATURE_UTF8 1
44#ifndef SIMDUTF_FEATURE_UTF16
45 #define SIMDUTF_FEATURE_UTF16 1
47#ifndef SIMDUTF_FEATURE_UTF32
48 #define SIMDUTF_FEATURE_UTF32 1
50#ifndef SIMDUTF_FEATURE_BASE64
51 #define SIMDUTF_FEATURE_BASE64 1
59constexpr std::size_t min(std::size_t a, std::size_t b) {
62template <
typename T,
typename U>
63constexpr std::size_t min(
const T &a,
const U &b) =
delete;
68#if SIMDUTF_CPLUSPLUS23
69 #include <simdutf/constexpr_ptr.h>
81concept byte_like = std::is_same_v<T, std::byte> ||
82 std::is_same_v<T, char> ||
83 std::is_same_v<T, signed char> ||
84 std::is_same_v<T, unsigned char> ||
85 std::is_same_v<T, char8_t>;
88concept is_byte_like = byte_like<std::remove_cvref_t<T>>;
91concept is_pointer = std::is_pointer_v<T>;
99concept input_span_of_byte_like =
requires(
const T &t) {
100 { t.size() }
noexcept -> std::convertible_to<std::size_t>;
101 { t.data() }
noexcept -> is_pointer;
102 { *t.data() }
noexcept -> is_byte_like;
106concept is_mutable = !std::is_const_v<std::remove_reference_t<T>>;
112concept output_span_of_byte_like =
requires(T &t) {
113 { t.size() }
noexcept -> std::convertible_to<std::size_t>;
114 { t.data() }
noexcept -> is_pointer;
115 { *t.data() }
noexcept -> is_byte_like;
116 { *t.data() }
noexcept -> is_mutable;
119 #if SIMDUTF_CPLUSPLUS23
121template <
typename F>
constexpr auto with_char_input(
const auto &input, F &&f) {
122 using T = std::remove_cvref_t<
decltype(*input.data())>;
123 if constexpr (std::is_same_v<T, char>) {
124 return f(input.data());
126 char *copy =
new char[input.size()];
127 for (std::size_t i = 0; i < input.size(); i++) {
128 copy[i] =
static_cast<char>(input.data()[i]);
130 auto r = f(
static_cast<const char *
>(copy));
137template <
typename F,
typename W>
138constexpr auto with_char_output(
auto &&output, F &&f, W &&written) {
139 using T = std::remove_cvref_t<
decltype(*output.data())>;
140 if constexpr (std::is_same_v<T, char>) {
141 return f(output.data());
143 char *copy =
new char[output.size()];
145 const std::size_t n = written(r);
146 for (std::size_t i = 0; i < n; i++) {
147 output.data()[i] =
static_cast<T
>(copy[i]);
160template <
class InputPtr>
161concept indexes_into_byte_like =
requires(InputPtr p) {
162 { std::decay_t<
decltype(p[0])>{} } -> simdutf::detail::byte_like;
164template <
class InputPtr>
165concept indexes_into_utf16 =
requires(InputPtr p) {
166 { std::decay_t<
decltype(p[0])>{} } -> std::same_as<char16_t>;
168template <
class InputPtr>
169concept indexes_into_utf32 =
requires(InputPtr p) {
170 { std::decay_t<
decltype(p[0])>{} } -> std::same_as<char32_t>;
173template <
class InputPtr>
174concept index_assignable_from_char =
requires(InputPtr p,
char s) {
182template <
class InputPtr>
183concept indexes_into_uint32 =
requires(InputPtr p) {
184 { std::decay_t<
decltype(p[0])>{} } -> std::same_as<std::uint32_t>;
192#include <simdutf/scalar/swap_bytes.h>
193#include <simdutf/scalar/ascii.h>
194#include <simdutf/scalar/atomic_util.h>
195#include <simdutf/scalar/latin1.h>
196#include <simdutf/scalar/latin1_to_utf16/latin1_to_utf16.h>
197#include <simdutf/scalar/latin1_to_utf32/latin1_to_utf32.h>
198#include <simdutf/scalar/latin1_to_utf8/latin1_to_utf8.h>
199#include <simdutf/scalar/utf16.h>
200#include <simdutf/scalar/utf16_to_latin1/utf16_to_latin1.h>
201#include <simdutf/scalar/utf16_to_latin1/valid_utf16_to_latin1.h>
202#include <simdutf/scalar/utf16_to_utf32/utf16_to_utf32.h>
203#include <simdutf/scalar/utf16_to_utf32/valid_utf16_to_utf32.h>
204#include <simdutf/scalar/utf16_to_utf8/utf16_to_utf8.h>
205#include <simdutf/scalar/utf16_to_utf8/valid_utf16_to_utf8.h>
206#include <simdutf/scalar/utf32.h>
207#include <simdutf/scalar/utf32_to_latin1/utf32_to_latin1.h>
208#include <simdutf/scalar/utf32_to_latin1/valid_utf32_to_latin1.h>
209#include <simdutf/scalar/utf32_to_utf16/utf32_to_utf16.h>
210#include <simdutf/scalar/utf32_to_utf16/valid_utf32_to_utf16.h>
211#include <simdutf/scalar/utf32_to_utf8/utf32_to_utf8.h>
212#include <simdutf/scalar/utf32_to_utf8/valid_utf32_to_utf8.h>
213#include <simdutf/scalar/utf8.h>
214#include <simdutf/scalar/utf8_to_latin1/utf8_to_latin1.h>
215#include <simdutf/scalar/utf8_to_latin1/valid_utf8_to_latin1.h>
216#include <simdutf/scalar/utf8_to_utf16/utf8_to_utf16.h>
217#include <simdutf/scalar/utf8_to_utf16/utf8_to_utf16_with_replacement.h>
218#include <simdutf/scalar/utf8_to_utf16/valid_utf8_to_utf16.h>
219#include <simdutf/scalar/utf8_to_utf32/utf8_to_utf32.h>
220#include <simdutf/scalar/utf8_to_utf32/valid_utf8_to_utf32.h>
227#if SIMDUTF_FEATURE_DETECT_ENCODING
238simdutf_warn_unused simdutf::encoding_type
240simdutf_really_inline simdutf_warn_unused simdutf::encoding_type
256simdutf_really_inline simdutf_warn_unused simdutf::encoding_type
258 const detail::input_span_of_byte_like
auto &input)
noexcept {
276 size_t length)
noexcept;
277simdutf_really_inline simdutf_warn_unused
int
282simdutf_really_inline simdutf_warn_unused
int
283detect_encodings(
const detail::input_span_of_byte_like
auto &input)
noexcept {
290#if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
302simdutf_warn_unused
bool validate_utf8(
const char *buf,
size_t len)
noexcept;
304simdutf_constexpr23 simdutf_really_inline simdutf_warn_unused
bool
305validate_utf8(
const detail::input_span_of_byte_like
auto &input)
noexcept {
306 #if SIMDUTF_CPLUSPLUS23
308 return scalar::utf8::validate(
309 detail::constexpr_cast_ptr<uint8_t>(input.data()), input.size());
313 return validate_utf8(
reinterpret_cast<const char *
>(input.data()),
320#if SIMDUTF_FEATURE_UTF8
334 size_t len)
noexcept;
336simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
result
338 const detail::input_span_of_byte_like
auto &input)
noexcept {
339 #if SIMDUTF_CPLUSPLUS23
341 return scalar::utf8::validate_with_errors(
342 detail::constexpr_cast_ptr<uint8_t>(input.data()), input.size());
347 reinterpret_cast<const char *
>(input.data()), input.size());
353#if SIMDUTF_FEATURE_UTF8
373 size_t len)
noexcept;
375simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
utf8_result
377 const detail::input_span_of_byte_like
auto &input)
noexcept {
378 #if SIMDUTF_CPLUSPLUS23
380 return scalar::utf8::validate_with_counts(
381 detail::constexpr_cast_ptr<uint8_t>(input.data()), input.size());
386 reinterpret_cast<const char *
>(input.data()), input.size());
392#if SIMDUTF_FEATURE_ASCII
404simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
405validate_ascii(
const detail::input_span_of_byte_like
auto &input)
noexcept {
406 #if SIMDUTF_CPLUSPLUS23
408 return scalar::ascii::validate(
409 detail::constexpr_cast_ptr<std::uint8_t>(input.data()), input.size());
413 return validate_ascii(
reinterpret_cast<const char *
>(input.data()),
433 size_t len)
noexcept;
435simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
437 const detail::input_span_of_byte_like
auto &input)
noexcept {
438 #if SIMDUTF_CPLUSPLUS23
440 return scalar::ascii::validate_with_errors(
441 detail::constexpr_cast_ptr<std::uint8_t>(input.data()), input.size());
446 reinterpret_cast<const char *
>(input.data()), input.size());
452#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_ASCII
465 size_t len)
noexcept;
467simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
469 #if SIMDUTF_CPLUSPLUS23
471 return scalar::utf16::validate_as_ascii<endianness::NATIVE>(input.data(),
493 size_t len)
noexcept;
495simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
497 #if SIMDUTF_CPLUSPLUS23
499 return scalar::utf16::validate_as_ascii<endianness::BIG>(input.data(),
521 size_t len)
noexcept;
523simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
525 #if SIMDUTF_CPLUSPLUS23
527 return scalar::utf16::validate_as_ascii<endianness::LITTLE>(input.data(),
538#if SIMDUTF_FEATURE_UTF16
554 size_t len)
noexcept;
556simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
558 #if SIMDUTF_CPLUSPLUS23
560 return scalar::utf16::validate<endianness::NATIVE>(input.data(),
571#if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
587 size_t len)
noexcept;
589simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
bool
591 #if SIMDUTF_CPLUSPLUS23
593 return scalar::utf16::validate<endianness::LITTLE>(input.data(),
604#if SIMDUTF_FEATURE_UTF16
620 size_t len)
noexcept;
622simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
624 #if SIMDUTF_CPLUSPLUS23
626 return scalar::utf16::validate<endianness::BIG>(input.data(), input.size());
653 size_t len)
noexcept;
655simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
657 #if SIMDUTF_CPLUSPLUS23
659 return scalar::utf16::validate_with_errors<endianness::NATIVE>(
660 input.data(), input.size());
686 size_t len)
noexcept;
688simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
690 #if SIMDUTF_CPLUSPLUS23
692 return scalar::utf16::validate_with_errors<endianness::LITTLE>(
693 input.data(), input.size());
719 size_t len)
noexcept;
721simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
723 #if SIMDUTF_CPLUSPLUS23
725 return scalar::utf16::validate_with_errors<endianness::BIG>(input.data(),
748 char16_t *output)
noexcept;
750simdutf_really_inline simdutf_constexpr23
void
752 std::span<char16_t> output)
noexcept {
753 #if SIMDUTF_CPLUSPLUS23
755 scalar::utf16::to_well_formed_utf16<endianness::LITTLE>(
756 input.data(), input.size(), output.data());
778 char16_t *output)
noexcept;
780simdutf_really_inline simdutf_constexpr23
void
782 std::span<char16_t> output)
noexcept {
783 #if SIMDUTF_CPLUSPLUS23
785 scalar::utf16::to_well_formed_utf16<endianness::BIG>(
786 input.data(), input.size(), output.data());
808 char16_t *output)
noexcept;
810simdutf_really_inline simdutf_constexpr23
void
812 std::span<char16_t> output)
noexcept {
813 #if SIMDUTF_CPLUSPLUS23
815 scalar::utf16::to_well_formed_utf16<endianness::NATIVE>(
816 input.data(), input.size(), output.data());
827#if SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
843 size_t len)
noexcept;
845simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
847 #if SIMDUTF_CPLUSPLUS23
849 return scalar::utf32::validate(
850 detail::constexpr_cast_ptr<std::uint32_t>(input.data()), input.size());
860#if SIMDUTF_FEATURE_UTF32
878 size_t len)
noexcept;
880simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
882 #if SIMDUTF_CPLUSPLUS23
884 return scalar::utf32::validate_with_errors(
885 detail::constexpr_cast_ptr<std::uint32_t>(input.data()), input.size());
895#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
908 char *utf8_output)
noexcept;
910simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
912 const detail::input_span_of_byte_like
auto &latin1_input,
913 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
914 #if SIMDUTF_CPLUSPLUS23
916 return scalar::latin1_to_utf8::convert(
917 detail::constexpr_cast_ptr<char>(latin1_input.data()),
919 detail::constexpr_cast_writeptr<char>(utf8_output.data()));
924 reinterpret_cast<const char *
>(latin1_input.data()),
925 latin1_input.size(),
reinterpret_cast<char *
>(utf8_output.data()));
949simdutf_warn_unused
size_t
951 size_t utf8_len)
noexcept;
953simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
955 const detail::input_span_of_byte_like
auto &input,
956 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
963 #if SIMDUTF_CPLUSPLUS23
965 return scalar::latin1_to_utf8::convert_safe_constexpr(
966 input.data(), input.size(), utf8_output.data(), utf8_output.size());
971 reinterpret_cast<const char *
>(input.data()), input.size(),
972 reinterpret_cast<char *
>(utf8_output.data()), utf8_output.size());
991 const char *input,
size_t length,
char *utf8_output,
992 size_t utf8_len)
noexcept;
994simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
full_result
996 const detail::input_span_of_byte_like
auto &input,
997 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
998 #if SIMDUTF_CPLUSPLUS23
1000 return scalar::latin1_to_utf8::convert_safe_with_details_constexpr(
1001 input.data(), input.size(), utf8_output.data(), utf8_output.size());
1006 reinterpret_cast<const char *
>(input.data()), input.size(),
1007 reinterpret_cast<char *
>(utf8_output.data()), utf8_output.size());
1013#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
1025 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1027simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1029 const detail::input_span_of_byte_like
auto &latin1_input,
1030 std::span<char16_t> utf16_output)
noexcept {
1031 #if SIMDUTF_CPLUSPLUS23
1033 return scalar::latin1_to_utf16::convert<endianness::LITTLE>(
1034 latin1_input.data(), latin1_input.size(), utf16_output.data());
1039 reinterpret_cast<const char *
>(latin1_input.data()),
1040 latin1_input.size(), utf16_output.data());
1056 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1058simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1060 std::span<char16_t> output)
noexcept {
1061 #if SIMDUTF_CPLUSPLUS23
1063 return scalar::latin1_to_utf16::convert<endianness::BIG>(
1064 input.data(), input.size(), output.data());
1069 reinterpret_cast<const char *
>(input.data()), input.size(),
1082simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1095simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1101#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
1113 const char *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
1115simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1117 const detail::input_span_of_byte_like
auto &latin1_input,
1118 std::span<char32_t> utf32_output)
noexcept {
1119 #if SIMDUTF_CPLUSPLUS23
1121 return scalar::latin1_to_utf32::convert(
1122 latin1_input.data(), latin1_input.size(), utf32_output.data());
1127 reinterpret_cast<const char *
>(latin1_input.data()),
1128 latin1_input.size(), utf32_output.data());
1134#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1149 char *latin1_output)
noexcept;
1151simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1153 const detail::input_span_of_byte_like
auto &input,
1154 detail::output_span_of_byte_like
auto &&output)
noexcept {
1155 #if SIMDUTF_CPLUSPLUS23
1157 return scalar::utf8_to_latin1::convert(input.data(), input.size(),
1164 reinterpret_cast<char *
>(output.data()));
1170#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1185 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1187simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1189 std::span<char16_t> output)
noexcept {
1190 #if SIMDUTF_CPLUSPLUS23
1192 return scalar::utf8_to_utf16::convert<endianness::NATIVE>(
1193 input.data(), input.size(), output.data());
1198 input.size(), output.data());
1221 const char16_t *input,
size_t length)
noexcept;
1223simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
result
1225 std::span<const char16_t> valid_utf16_input)
noexcept {
1226 #if SIMDUTF_CPLUSPLUS23
1228 return scalar::utf16::utf8_length_from_utf16_with_replacement<
1229 endianness::LITTLE>(valid_utf16_input.data(), valid_utf16_input.size());
1234 valid_utf16_input.size());
1257 const char16_t *input,
size_t length)
noexcept;
1259simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
1261 std::span<const char16_t> valid_utf16_input)
noexcept {
1262 #if SIMDUTF_CPLUSPLUS23
1264 return scalar::utf16::utf8_length_from_utf16_with_replacement<
1265 endianness::BIG>(valid_utf16_input.data(), valid_utf16_input.size());
1270 valid_utf16_input.size());
1277#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
1287 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1289simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1291 std::span<char16_t> output)
noexcept {
1292 #if SIMDUTF_CPLUSPLUS23
1294 return scalar::latin1_to_utf16::convert<endianness::NATIVE>(
1295 input.data(), input.size(), output.data());
1300 input.size(), output.data());
1306#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1320 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1322simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1324 std::span<char16_t> utf16_output)
noexcept {
1325 #if SIMDUTF_CPLUSPLUS23
1327 return scalar::utf8_to_utf16::convert<endianness::LITTLE>(
1328 utf8_input.data(), utf8_input.size(), utf16_output.data());
1333 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1334 utf16_output.data());
1352 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1354simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1356 std::span<char16_t> utf16_output)
noexcept {
1358 #if SIMDUTF_CPLUSPLUS23
1360 return scalar::utf8_to_utf16::convert<endianness::BIG>(
1361 utf8_input.data(), utf8_input.size(), utf16_output.data());
1366 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1367 utf16_output.data());
1373#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1391 const char *input,
size_t length,
char *latin1_output)
noexcept;
1393simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
1395 const detail::input_span_of_byte_like
auto &utf8_input,
1396 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1397 #if SIMDUTF_CPLUSPLUS23
1399 return scalar::utf8_to_latin1::convert_with_errors(
1400 utf8_input.data(), utf8_input.size(), latin1_output.data());
1405 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1406 reinterpret_cast<char *
>(latin1_output.data()));
1412#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1429 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1431simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
1433 const detail::input_span_of_byte_like
auto &utf8_input,
1434 std::span<char16_t> utf16_output)
noexcept {
1435 #if SIMDUTF_CPLUSPLUS23
1437 return scalar::utf8_to_utf16::convert_with_errors<endianness::NATIVE>(
1438 utf8_input.data(), utf8_input.size(), utf16_output.data());
1443 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1444 utf16_output.data());
1464 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1466simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
1468 const detail::input_span_of_byte_like
auto &utf8_input,
1469 std::span<char16_t> utf16_output)
noexcept {
1470 #if SIMDUTF_CPLUSPLUS23
1472 return scalar::utf8_to_utf16::convert_with_errors<endianness::LITTLE>(
1473 utf8_input.data(), utf8_input.size(), utf16_output.data());
1478 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1479 utf16_output.data());
1499 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1501simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
1503 const detail::input_span_of_byte_like
auto &utf8_input,
1504 std::span<char16_t> utf16_output)
noexcept {
1505 #if SIMDUTF_CPLUSPLUS23
1507 return scalar::utf8_to_utf16::convert_with_errors<endianness::BIG>(
1508 utf8_input.data(), utf8_input.size(), utf16_output.data());
1513 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1514 utf16_output.data());
1539 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1541simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1543 const detail::input_span_of_byte_like
auto &utf8_input,
1544 std::span<char16_t> utf16_output)
noexcept {
1545 #if SIMDUTF_CPLUSPLUS23
1547 return scalar::utf8_to_utf16::convert_with_replacement<endianness::NATIVE>(
1548 utf8_input.data(), utf8_input.size(), utf16_output.data());
1553 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1554 utf16_output.data());
1580 const char *input,
size_t length,
char16_t *utf16_output,
1583simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1585 const detail::input_span_of_byte_like
auto &utf8_input,
1586 std::span<char16_t> utf16_output,
1588 #if SIMDUTF_CPLUSPLUS23
1591 return scalar::utf8_to_utf16::convert_with_replacement<endianness::NATIVE>(
1592 utf8_input.data(), utf8_input.size(), utf16_output.data());
1597 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1598 utf16_output.data(), locations);
1623 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1625simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1627 const detail::input_span_of_byte_like
auto &utf8_input,
1628 std::span<char16_t> utf16_output)
noexcept {
1629 #if SIMDUTF_CPLUSPLUS23
1631 return scalar::utf8_to_utf16::convert_with_replacement<endianness::LITTLE>(
1632 utf8_input.data(), utf8_input.size(), utf16_output.data());
1637 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1638 utf16_output.data());
1656 const char *input,
size_t length,
char16_t *utf16_output,
1659simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1661 const detail::input_span_of_byte_like
auto &utf8_input,
1662 std::span<char16_t> utf16_output,
1664 #if SIMDUTF_CPLUSPLUS23
1667 return scalar::utf8_to_utf16::convert_with_replacement<endianness::LITTLE>(
1668 utf8_input.data(), utf8_input.size(), utf16_output.data());
1673 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1674 utf16_output.data(), locations);
1699 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1701simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1703 const detail::input_span_of_byte_like
auto &utf8_input,
1704 std::span<char16_t> utf16_output)
noexcept {
1705 #if SIMDUTF_CPLUSPLUS23
1707 return scalar::utf8_to_utf16::convert_with_replacement<endianness::BIG>(
1708 utf8_input.data(), utf8_input.size(), utf16_output.data());
1713 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1714 utf16_output.data());
1732 const char *input,
size_t length,
char16_t *utf16_output,
1735simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1737 const detail::input_span_of_byte_like
auto &utf8_input,
1738 std::span<char16_t> utf16_output,
1740 #if SIMDUTF_CPLUSPLUS23
1743 return scalar::utf8_to_utf16::convert_with_replacement<endianness::BIG>(
1744 utf8_input.data(), utf8_input.size(), utf16_output.data());
1749 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1750 utf16_output.data(), locations);
1756#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1770 const char *input,
size_t length,
char32_t *utf32_output)
noexcept;
1772simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1774 std::span<char32_t> utf32_output)
noexcept {
1775 #if SIMDUTF_CPLUSPLUS23
1777 return scalar::utf8_to_utf32::convert(utf8_input.data(), utf8_input.size(),
1778 utf32_output.data());
1783 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1784 utf32_output.data());
1804 const char *input,
size_t length,
char32_t *utf32_output)
noexcept;
1806simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
1808 const detail::input_span_of_byte_like
auto &utf8_input,
1809 std::span<char32_t> utf32_output)
noexcept {
1810 #if SIMDUTF_CPLUSPLUS23
1812 return scalar::utf8_to_utf32::convert_with_errors(
1813 utf8_input.data(), utf8_input.size(), utf32_output.data());
1818 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1819 utf32_output.data());
1825#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1846 const char *input,
size_t length,
char *latin1_output)
noexcept;
1848simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1850 const detail::input_span_of_byte_like
auto &valid_utf8_input,
1851 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1852 #if SIMDUTF_CPLUSPLUS23
1854 return scalar::utf8_to_latin1::convert_valid(
1855 valid_utf8_input.data(), valid_utf8_input.size(), latin1_output.data());
1860 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1861 valid_utf8_input.size(), latin1_output.data());
1867#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1879 const char *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
1881simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1883 const detail::input_span_of_byte_like
auto &valid_utf8_input,
1884 std::span<char16_t> utf16_output)
noexcept {
1885 #if SIMDUTF_CPLUSPLUS23
1887 return scalar::utf8_to_utf16::convert_valid<endianness::NATIVE>(
1888 valid_utf8_input.data(), valid_utf8_input.size(), utf16_output.data());
1893 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1894 valid_utf8_input.size(), utf16_output.data());
1910 const char *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
1912simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1914 const detail::input_span_of_byte_like
auto &valid_utf8_input,
1915 std::span<char16_t> utf16_output)
noexcept {
1917 #if SIMDUTF_CPLUSPLUS23
1919 return scalar::utf8_to_utf16::convert_valid<endianness::LITTLE>(
1920 valid_utf8_input.data(), valid_utf8_input.size(), utf16_output.data());
1925 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1926 valid_utf8_input.size(), utf16_output.data());
1942 const char *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
1944simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1946 const detail::input_span_of_byte_like
auto &valid_utf8_input,
1947 std::span<char16_t> utf16_output)
noexcept {
1948 #if SIMDUTF_CPLUSPLUS23
1950 return scalar::utf8_to_utf16::convert_valid<endianness::BIG>(
1951 valid_utf8_input.data(), valid_utf8_input.size(), utf16_output.data());
1956 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1957 valid_utf8_input.size(), utf16_output.data());
1963#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1975 const char *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
1977simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1979 const detail::input_span_of_byte_like
auto &valid_utf8_input,
1980 std::span<char32_t> utf32_output)
noexcept {
1981 #if SIMDUTF_CPLUSPLUS23
1983 return scalar::utf8_to_utf32::convert_valid(
1984 valid_utf8_input.data(), valid_utf8_input.size(), utf32_output.data());
1989 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1990 valid_utf8_input.size(), utf32_output.data());
1996#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
2006 size_t length)
noexcept;
2008simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2010 const detail::input_span_of_byte_like
auto &latin1_input)
noexcept {
2011 #if SIMDUTF_CPLUSPLUS23
2013 return scalar::latin1_to_utf8::utf8_length_from_latin1(latin1_input.data(),
2014 latin1_input.size());
2019 reinterpret_cast<const char *
>(latin1_input.data()),
2020 latin1_input.size());
2039 size_t length)
noexcept;
2041simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2043 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
2044 #if SIMDUTF_CPLUSPLUS23
2046 return scalar::utf8::count_code_points(valid_utf8_input.data(),
2047 valid_utf8_input.size());
2052 reinterpret_cast<const char *
>(valid_utf8_input.data()),
2053 valid_utf8_input.size());
2059#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
2075 size_t length)
noexcept;
2077simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2079 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
2080 #if SIMDUTF_CPLUSPLUS23
2082 return scalar::utf8::utf16_length_from_utf8(valid_utf8_input.data(),
2083 valid_utf8_input.size());
2088 reinterpret_cast<const char *
>(valid_utf8_input.data()),
2089 valid_utf8_input.size());
2124simdutf_warn_unused utf8_to_utf16_result
2126 size_t length)
noexcept;
2128simdutf_really_inline
2131 const detail::input_span_of_byte_like
auto &utf8_input)
noexcept {
2132 #if SIMDUTF_CPLUSPLUS23
2134 return scalar::utf8_to_utf16::utf16_length_from_utf8_with_replacement(
2135 utf8_input.data(), utf8_input.size());
2140 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size());
2146#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
2164 size_t length)
noexcept;
2166simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2168 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
2170 #if SIMDUTF_CPLUSPLUS23
2172 return scalar::utf8::count_code_points(valid_utf8_input.data(),
2173 valid_utf8_input.size());
2178 reinterpret_cast<const char *
>(valid_utf8_input.data()),
2179 valid_utf8_input.size());
2185#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
2203 char *utf8_buffer)
noexcept;
2205simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2207 std::span<const char16_t> utf16_input,
2208 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2209 #if SIMDUTF_CPLUSPLUS23
2211 return scalar::utf16_to_utf8::convert<endianness::NATIVE>(
2212 utf16_input.data(), utf16_input.size(), utf8_output.data());
2217 reinterpret_cast<char *
>(utf8_output.data()));
2248 size_t utf8_len)
noexcept;
2250simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2252 std::span<const char16_t> utf16_input,
2253 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2260 #if SIMDUTF_CPLUSPLUS23
2263 scalar::utf16_to_utf8::convert_with_errors<endianness::NATIVE, true>(
2264 utf16_input.data(), utf16_input.size(), utf8_output.data(),
2265 utf8_output.size());
2266 if (r.error != error_code::SUCCESS &&
2267 r.error != error_code::OUTPUT_BUFFER_TOO_SMALL) {
2270 return r.output_count;
2275 utf16_input.data(), utf16_input.size(),
2276 reinterpret_cast<char *
>(utf8_output.data()), utf8_output.size());
2297 const char16_t *input,
size_t length,
char *utf8_output,
2298 size_t utf8_len)
noexcept;
2300simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
full_result
2302 std::span<const char16_t> utf16_input,
2303 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2304 #if SIMDUTF_CPLUSPLUS23
2306 if (utf16_input.empty()) {
2309 return scalar::utf16_to_utf8::convert_with_errors<endianness::NATIVE, true>(
2310 utf16_input.data(), utf16_input.size(), utf8_output.data(),
2311 utf8_output.size());
2316 utf16_input.data(), utf16_input.size(),
2317 reinterpret_cast<char *
>(utf8_output.data()), utf8_output.size());
2323#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
2340 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2342simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2344 std::span<const char16_t> utf16_input,
2345 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2346 #if SIMDUTF_CPLUSPLUS23
2348 return scalar::utf16_to_latin1::convert<endianness::NATIVE>(
2349 utf16_input.data(), utf16_input.size(), latin1_output.data());
2354 utf16_input.data(), utf16_input.size(),
2355 reinterpret_cast<char *
>(latin1_output.data()));
2377 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2379simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2381 std::span<const char16_t> utf16_input,
2382 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2383 #if SIMDUTF_CPLUSPLUS23
2385 return scalar::utf16_to_latin1::convert<endianness::LITTLE>(
2386 utf16_input.data(), utf16_input.size(), latin1_output.data());
2391 utf16_input.data(), utf16_input.size(),
2392 reinterpret_cast<char *
>(latin1_output.data()));
2412 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2414simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2416 std::span<const char16_t> utf16_input,
2417 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2418 #if SIMDUTF_CPLUSPLUS23
2420 return scalar::utf16_to_latin1::convert<endianness::BIG>(
2421 utf16_input.data(), utf16_input.size(), latin1_output.data());
2426 utf16_input.data(), utf16_input.size(),
2427 reinterpret_cast<char *
>(latin1_output.data()));
2433#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
2450 char *utf8_buffer)
noexcept;
2452simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2454 std::span<const char16_t> utf16_input,
2455 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2456 #if SIMDUTF_CPLUSPLUS23
2458 return scalar::utf16_to_utf8::convert<endianness::LITTLE>(
2459 utf16_input.data(), utf16_input.size(), utf8_output.data());
2464 utf16_input.data(), utf16_input.size(),
2465 reinterpret_cast<char *
>(utf8_output.data()));
2486 char *utf8_buffer)
noexcept;
2488simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2490 std::span<const char16_t> utf16_input,
2491 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2492 #if SIMDUTF_CPLUSPLUS23
2494 return scalar::utf16_to_utf8::convert<endianness::BIG>(
2495 utf16_input.data(), utf16_input.size(), utf8_output.data());
2500 utf16_input.data(), utf16_input.size(),
2501 reinterpret_cast<char *
>(utf8_output.data()));
2507#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
2525 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2527simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2529 std::span<const char16_t> utf16_input,
2530 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2531 #if SIMDUTF_CPLUSPLUS23
2533 return scalar::utf16_to_latin1::convert_with_errors<endianness::NATIVE>(
2534 utf16_input.data(), utf16_input.size(), latin1_output.data());
2539 utf16_input.data(), utf16_input.size(),
2540 reinterpret_cast<char *
>(latin1_output.data()));
2561 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2563simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2565 std::span<const char16_t> utf16_input,
2566 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2567 #if SIMDUTF_CPLUSPLUS23
2569 return scalar::utf16_to_latin1::convert_with_errors<endianness::LITTLE>(
2570 utf16_input.data(), utf16_input.size(), latin1_output.data());
2575 utf16_input.data(), utf16_input.size(),
2576 reinterpret_cast<char *
>(latin1_output.data()));
2599 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2601simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2603 std::span<const char16_t> utf16_input,
2604 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2605 #if SIMDUTF_CPLUSPLUS23
2607 return scalar::utf16_to_latin1::convert_with_errors<endianness::BIG>(
2608 utf16_input.data(), utf16_input.size(), latin1_output.data());
2613 utf16_input.data(), utf16_input.size(),
2614 reinterpret_cast<char *
>(latin1_output.data()));
2620#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
2639 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2641simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2643 std::span<const char16_t> utf16_input,
2644 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2645 #if SIMDUTF_CPLUSPLUS23
2647 return scalar::utf16_to_utf8::convert_with_errors<endianness::NATIVE>(
2648 utf16_input.data(), utf16_input.size(), utf8_output.data());
2653 utf16_input.data(), utf16_input.size(),
2654 reinterpret_cast<char *
>(utf8_output.data()));
2676 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2678simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2680 std::span<const char16_t> utf16_input,
2681 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2682 #if SIMDUTF_CPLUSPLUS23
2684 return scalar::utf16_to_utf8::convert_with_errors<endianness::LITTLE>(
2685 utf16_input.data(), utf16_input.size(), utf8_output.data());
2690 utf16_input.data(), utf16_input.size(),
2691 reinterpret_cast<char *
>(utf8_output.data()));
2713 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2715simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2717 std::span<const char16_t> utf16_input,
2718 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2719 #if SIMDUTF_CPLUSPLUS23
2721 return scalar::utf16_to_utf8::convert_with_errors<endianness::BIG>(
2722 utf16_input.data(), utf16_input.size(), utf8_output.data());
2727 utf16_input.data(), utf16_input.size(),
2728 reinterpret_cast<char *
>(utf8_output.data()));
2748 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2750simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2752 std::span<const char16_t> utf16_input,
2753 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2754 #if SIMDUTF_CPLUSPLUS23
2756 return scalar::utf16_to_utf8::convert_with_replacement<endianness::LITTLE>(
2757 utf16_input.data(), utf16_input.size(), utf8_output.data());
2762 utf16_input.data(), utf16_input.size(),
2763 reinterpret_cast<char *
>(utf8_output.data()));
2783 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2785simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2787 std::span<const char16_t> utf16_input,
2788 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2789 #if SIMDUTF_CPLUSPLUS23
2791 return scalar::utf16_to_utf8::convert_with_replacement<endianness::BIG>(
2792 utf16_input.data(), utf16_input.size(), utf8_output.data());
2797 utf16_input.data(), utf16_input.size(),
2798 reinterpret_cast<char *
>(utf8_output.data()));
2818 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2820simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2822 std::span<const char16_t> utf16_input,
2823 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2824 #if SIMDUTF_CPLUSPLUS23
2826 return scalar::utf16_to_utf8::convert_with_replacement<endianness::NATIVE>(
2827 utf16_input.data(), utf16_input.size(), utf8_output.data());
2832 utf16_input.data(), utf16_input.size(),
2833 reinterpret_cast<char *
>(utf8_output.data()));
2854 const char16_t *input,
size_t length,
char *utf8_output,
2855 size_t utf8_len)
noexcept;
2857simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
full_result
2859 std::span<const char16_t> utf16_input,
2860 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2861 #if SIMDUTF_CPLUSPLUS23
2863 return scalar::utf16_to_utf8::convert_with_replacement_safe<
2864 endianness::NATIVE>(utf16_input.data(), utf16_input.size(),
2865 utf8_output.data(), utf8_output.size());
2870 utf16_input.data(), utf16_input.size(),
2871 reinterpret_cast<char *
>(utf8_output.data()), utf8_output.size());
2877#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
2892 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2894simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2896 std::span<const char16_t> valid_utf16_input,
2897 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2898 #if SIMDUTF_CPLUSPLUS23
2900 return scalar::utf16_to_utf8::convert_valid<endianness::NATIVE>(
2901 valid_utf16_input.data(), valid_utf16_input.size(), utf8_output.data());
2906 valid_utf16_input.data(), valid_utf16_input.size(),
2907 reinterpret_cast<char *
>(utf8_output.data()));
2913#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
2934 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2936simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2938 std::span<const char16_t> valid_utf16_input,
2939 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2940 #if SIMDUTF_CPLUSPLUS23
2942 return scalar::utf16_to_latin1::convert_valid_impl<endianness::NATIVE>(
2943 detail::constexpr_cast_ptr<uint16_t>(valid_utf16_input.data()),
2944 valid_utf16_input.size(),
2945 detail::constexpr_cast_writeptr<char>(latin1_output.data()));
2950 valid_utf16_input.data(), valid_utf16_input.size(),
2951 reinterpret_cast<char *
>(latin1_output.data()));
2976 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2978simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
size_t
2980 std::span<const char16_t> valid_utf16_input,
2981 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2982 #if SIMDUTF_CPLUSPLUS23
2984 return scalar::utf16_to_latin1::convert_valid_impl<endianness::LITTLE>(
2985 detail::constexpr_cast_ptr<uint16_t>(valid_utf16_input.data()),
2986 valid_utf16_input.size(),
2987 detail::constexpr_cast_writeptr<char>(latin1_output.data()));
2992 valid_utf16_input.data(), valid_utf16_input.size(),
2993 reinterpret_cast<char *
>(latin1_output.data()));
3018 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
3020simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
size_t
3022 std::span<const char16_t> valid_utf16_input,
3023 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
3024 #if SIMDUTF_CPLUSPLUS23
3026 return scalar::utf16_to_latin1::convert_valid_impl<endianness::BIG>(
3027 detail::constexpr_cast_ptr<uint16_t>(valid_utf16_input.data()),
3028 valid_utf16_input.size(),
3029 detail::constexpr_cast_writeptr<char>(latin1_output.data()));
3034 valid_utf16_input.data(), valid_utf16_input.size(),
3035 reinterpret_cast<char *
>(latin1_output.data()));
3041#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
3056 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
3058simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3060 std::span<const char16_t> valid_utf16_input,
3061 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
3062 #if SIMDUTF_CPLUSPLUS23
3064 return scalar::utf16_to_utf8::convert_valid<endianness::NATIVE>(
3065 valid_utf16_input.data(), valid_utf16_input.size(), utf8_output.data());
3070 valid_utf16_input.data(), valid_utf16_input.size(),
3071 reinterpret_cast<char *
>(utf8_output.data()));
3090 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
3092simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3094 std::span<const char16_t> valid_utf16_input,
3095 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
3096 #if SIMDUTF_CPLUSPLUS23
3098 return scalar::utf16_to_utf8::convert_valid<endianness::BIG>(
3099 valid_utf16_input.data(), valid_utf16_input.size(), utf8_output.data());
3104 valid_utf16_input.data(), valid_utf16_input.size(),
3105 reinterpret_cast<char *
>(utf8_output.data()));
3111#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
3128 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
3130simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3132 std::span<char32_t> utf32_output)
noexcept {
3134 #if SIMDUTF_CPLUSPLUS23
3136 return scalar::utf16_to_utf32::convert<endianness::NATIVE>(
3137 utf16_input.data(), utf16_input.size(), utf32_output.data());
3142 utf32_output.data());
3162 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
3164simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3166 std::span<char32_t> utf32_output)
noexcept {
3167 #if SIMDUTF_CPLUSPLUS23
3169 return scalar::utf16_to_utf32::convert<endianness::LITTLE>(
3170 utf16_input.data(), utf16_input.size(), utf32_output.data());
3175 utf32_output.data());
3195 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
3197simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3199 std::span<char32_t> utf32_output)
noexcept {
3200 #if SIMDUTF_CPLUSPLUS23
3202 return scalar::utf16_to_utf32::convert<endianness::BIG>(
3203 utf16_input.data(), utf16_input.size(), utf32_output.data());
3208 utf32_output.data());
3231 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
3233simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3235 std::span<char32_t> utf32_output)
noexcept {
3236 #if SIMDUTF_CPLUSPLUS23
3238 return scalar::utf16_to_utf32::convert_with_errors<endianness::NATIVE>(
3239 utf16_input.data(), utf16_input.size(), utf32_output.data());
3244 utf16_input.data(), utf16_input.size(), utf32_output.data());
3266 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
3268simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3270 std::span<const char16_t> utf16_input,
3271 std::span<char32_t> utf32_output)
noexcept {
3272 #if SIMDUTF_CPLUSPLUS23
3274 return scalar::utf16_to_utf32::convert_with_errors<endianness::LITTLE>(
3275 utf16_input.data(), utf16_input.size(), utf32_output.data());
3280 utf16_input.data(), utf16_input.size(), utf32_output.data());
3302 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
3304simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3306 std::span<const char16_t> utf16_input,
3307 std::span<char32_t> utf32_output)
noexcept {
3308 #if SIMDUTF_CPLUSPLUS23
3310 return scalar::utf16_to_utf32::convert_with_errors<endianness::BIG>(
3311 utf16_input.data(), utf16_input.size(), utf32_output.data());
3316 utf16_input.data(), utf16_input.size(), utf32_output.data());
3336 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
3338simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3340 std::span<char32_t> utf32_output)
noexcept {
3341 #if SIMDUTF_CPLUSPLUS23
3343 return scalar::utf16_to_utf32::convert_valid<endianness::NATIVE>(
3344 valid_utf16_input.data(), valid_utf16_input.size(),
3345 utf32_output.data());
3350 valid_utf16_input.size(),
3351 utf32_output.data());
3370 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
3372simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3374 std::span<char32_t> utf32_output)
noexcept {
3375 #if SIMDUTF_CPLUSPLUS23
3377 return scalar::utf16_to_utf32::convert_valid<endianness::LITTLE>(
3378 valid_utf16_input.data(), valid_utf16_input.size(),
3379 utf32_output.data());
3384 valid_utf16_input.size(),
3385 utf32_output.data());
3404 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
3406simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3408 std::span<char32_t> utf32_output)
noexcept {
3409 #if SIMDUTF_CPLUSPLUS23
3411 return scalar::utf16_to_utf32::convert_valid<endianness::BIG>(
3412 valid_utf16_input.data(), valid_utf16_input.size(),
3413 utf32_output.data());
3418 valid_utf16_input.size(),
3419 utf32_output.data());
3425#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
3438 size_t length)
noexcept;
3440simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3442 #if SIMDUTF_CPLUSPLUS23
3444 return scalar::utf16::utf8_length_from_utf16<endianness::NATIVE>(
3445 valid_utf16_input.data(), valid_utf16_input.size());
3450 valid_utf16_input.size());
3474 const char16_t *input,
size_t length)
noexcept;
3476simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3478 std::span<const char16_t> valid_utf16_input)
noexcept {
3479 #if SIMDUTF_CPLUSPLUS23
3481 return scalar::utf16::utf8_length_from_utf16_with_replacement<
3482 endianness::NATIVE>(valid_utf16_input.data(), valid_utf16_input.size());
3487 valid_utf16_input.size());
3504 size_t length)
noexcept;
3506simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
size_t
3508 #if SIMDUTF_CPLUSPLUS23
3510 return scalar::utf16::utf8_length_from_utf16<endianness::LITTLE>(
3511 valid_utf16_input.data(), valid_utf16_input.size());
3516 valid_utf16_input.size());
3533 size_t length)
noexcept;
3535simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3537 #if SIMDUTF_CPLUSPLUS23
3539 return scalar::utf16::utf8_length_from_utf16<endianness::BIG>(
3540 valid_utf16_input.data(), valid_utf16_input.size());
3545 valid_utf16_input.size());
3551#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
3567 char *utf8_buffer)
noexcept;
3569simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3571 std::span<const char32_t> utf32_input,
3572 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
3573 #if SIMDUTF_CPLUSPLUS23
3575 return scalar::utf32_to_utf8::convert(
3576 utf32_input.data(), utf32_input.size(), utf8_output.data());
3581 reinterpret_cast<char *
>(utf8_output.data()));
3603 const char32_t *input,
size_t length,
char *utf8_buffer)
noexcept;
3605simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3607 std::span<const char32_t> utf32_input,
3608 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
3609 #if SIMDUTF_CPLUSPLUS23
3611 return scalar::utf32_to_utf8::convert_with_errors(
3612 utf32_input.data(), utf32_input.size(), utf8_output.data());
3617 utf32_input.data(), utf32_input.size(),
3618 reinterpret_cast<char *
>(utf8_output.data()));
3637 const char32_t *input,
size_t length,
char *utf8_buffer)
noexcept;
3639simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3641 std::span<const char32_t> valid_utf32_input,
3642 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
3643 #if SIMDUTF_CPLUSPLUS23
3645 return scalar::utf32_to_utf8::convert_valid(
3646 valid_utf32_input.data(), valid_utf32_input.size(), utf8_output.data());
3651 valid_utf32_input.data(), valid_utf32_input.size(),
3652 reinterpret_cast<char *
>(utf8_output.data()));
3658#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
3674 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3676simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3678 std::span<char16_t> utf16_output)
noexcept {
3679 #if SIMDUTF_CPLUSPLUS23
3681 return scalar::utf32_to_utf16::convert<endianness::NATIVE>(
3682 utf32_input.data(), utf32_input.size(), utf16_output.data());
3687 utf16_output.data());
3706 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3708simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3710 std::span<char16_t> utf16_output)
noexcept {
3711 #if SIMDUTF_CPLUSPLUS23
3713 return scalar::utf32_to_utf16::convert<endianness::LITTLE>(
3714 utf32_input.data(), utf32_input.size(), utf16_output.data());
3719 utf16_output.data());
3725#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
3741 const char32_t *input,
size_t length,
char *latin1_buffer)
noexcept;
3743simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3745 std::span<const char32_t> utf32_input,
3746 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
3747 #if SIMDUTF_CPLUSPLUS23
3749 return scalar::utf32_to_latin1::convert(
3750 utf32_input.data(), utf32_input.size(), latin1_output.data());
3755 utf32_input.data(), utf32_input.size(),
3756 reinterpret_cast<char *
>(latin1_output.data()));
3779 const char32_t *input,
size_t length,
char *latin1_buffer)
noexcept;
3781simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3783 std::span<const char32_t> utf32_input,
3784 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
3785 #if SIMDUTF_CPLUSPLUS23
3787 return scalar::utf32_to_latin1::convert_with_errors(
3788 utf32_input.data(), utf32_input.size(), latin1_output.data());
3793 utf32_input.data(), utf32_input.size(),
3794 reinterpret_cast<char *
>(latin1_output.data()));
3820 const char32_t *input,
size_t length,
char *latin1_buffer)
noexcept;
3822simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
size_t
3824 std::span<const char32_t> valid_utf32_input,
3825 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
3826 #if SIMDUTF_CPLUSPLUS23
3828 return scalar::utf32_to_latin1::convert_valid(
3829 detail::constexpr_cast_ptr<uint32_t>(valid_utf32_input.data()),
3830 valid_utf32_input.size(),
3831 detail::constexpr_cast_writeptr<char>(latin1_output.data()));
3836 valid_utf32_input.data(), valid_utf32_input.size(),
3837 reinterpret_cast<char *
>(latin1_output.data()));
3854simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
size_t
3867simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
size_t
3873#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
3888 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3890simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3892 std::span<char16_t> utf16_output)
noexcept {
3893 #if SIMDUTF_CPLUSPLUS23
3895 return scalar::utf32_to_utf16::convert<endianness::BIG>(
3896 utf32_input.data(), utf32_input.size(), utf16_output.data());
3901 utf16_output.data());
3924 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3926simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3928 std::span<char16_t> utf16_output)
noexcept {
3929 #if SIMDUTF_CPLUSPLUS23
3931 return scalar::utf32_to_utf16::convert_with_errors<endianness::NATIVE>(
3932 utf32_input.data(), utf32_input.size(), utf16_output.data());
3937 utf32_input.data(), utf32_input.size(), utf16_output.data());
3959 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3961simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3963 std::span<const char32_t> utf32_input,
3964 std::span<char16_t> utf16_output)
noexcept {
3965 #if SIMDUTF_CPLUSPLUS23
3967 return scalar::utf32_to_utf16::convert_with_errors<endianness::LITTLE>(
3968 utf32_input.data(), utf32_input.size(), utf16_output.data());
3973 utf32_input.data(), utf32_input.size(), utf16_output.data());
3995 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3997simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3999 std::span<const char32_t> utf32_input,
4000 std::span<char16_t> utf16_output)
noexcept {
4001 #if SIMDUTF_CPLUSPLUS23
4003 return scalar::utf32_to_utf16::convert_with_errors<endianness::BIG>(
4004 utf32_input.data(), utf32_input.size(), utf16_output.data());
4009 utf32_input.data(), utf32_input.size(), utf16_output.data());
4028 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
4030simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4032 std::span<char16_t> utf16_output)
noexcept {
4034 #if SIMDUTF_CPLUSPLUS23
4036 return scalar::utf32_to_utf16::convert_valid<endianness::NATIVE>(
4037 valid_utf32_input.data(), valid_utf32_input.size(),
4038 utf16_output.data());
4043 valid_utf32_input.size(),
4044 utf16_output.data());
4063 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
4065simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4067 std::span<char16_t> utf16_output)
noexcept {
4068 #if SIMDUTF_CPLUSPLUS23
4070 return scalar::utf32_to_utf16::convert_valid<endianness::LITTLE>(
4071 valid_utf32_input.data(), valid_utf32_input.size(),
4072 utf16_output.data());
4077 valid_utf32_input.size(),
4078 utf16_output.data());
4097 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
4099simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4101 std::span<char16_t> utf16_output)
noexcept {
4102 #if SIMDUTF_CPLUSPLUS23
4104 return scalar::utf32_to_utf16::convert_valid<endianness::BIG>(
4105 valid_utf32_input.data(), valid_utf32_input.size(),
4106 utf16_output.data());
4111 valid_utf32_input.size(),
4112 utf16_output.data());
4118#if SIMDUTF_FEATURE_UTF16
4133 char16_t *output)
noexcept;
4135simdutf_really_inline simdutf_constexpr23
void
4137 std::span<char16_t> utf16_output)
noexcept {
4138 #if SIMDUTF_CPLUSPLUS23
4140 return scalar::utf16::change_endianness_utf16(
4141 utf16_input.data(), utf16_input.size(), utf16_output.data());
4146 utf16_output.data());
4152#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
4165 size_t length)
noexcept;
4167simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4169 #if SIMDUTF_CPLUSPLUS23
4171 return scalar::utf32::utf8_length_from_utf32(valid_utf32_input.data(),
4172 valid_utf32_input.size());
4177 valid_utf32_input.size());
4183#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
4196 size_t length)
noexcept;
4198simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4200 #if SIMDUTF_CPLUSPLUS23
4202 return scalar::utf32::utf16_length_from_utf32(valid_utf32_input.data(),
4203 valid_utf32_input.size());
4208 valid_utf32_input.size());
4229 size_t length)
noexcept;
4231simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4233 #if SIMDUTF_CPLUSPLUS23
4235 return scalar::utf16::utf32_length_from_utf16<endianness::NATIVE>(
4236 valid_utf16_input.data(), valid_utf16_input.size());
4241 valid_utf16_input.size());
4262 size_t length)
noexcept;
4264simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4266 std::span<const char16_t> valid_utf16_input)
noexcept {
4267 #if SIMDUTF_CPLUSPLUS23
4269 return scalar::utf16::utf32_length_from_utf16<endianness::LITTLE>(
4270 valid_utf16_input.data(), valid_utf16_input.size());
4275 valid_utf16_input.size());
4296 size_t length)
noexcept;
4298simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4300 std::span<const char16_t> valid_utf16_input)
noexcept {
4301 #if SIMDUTF_CPLUSPLUS23
4303 return scalar::utf16::utf32_length_from_utf16<endianness::BIG>(
4304 valid_utf16_input.data(), valid_utf16_input.size());
4309 valid_utf16_input.size());
4315#if SIMDUTF_FEATURE_UTF16
4331 size_t length)
noexcept;
4333simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4334count_utf16(std::span<const char16_t> valid_utf16_input)
noexcept {
4335 #if SIMDUTF_CPLUSPLUS23
4337 return scalar::utf16::count_code_points<endianness::NATIVE>(
4338 valid_utf16_input.data(), valid_utf16_input.size());
4342 return count_utf16(valid_utf16_input.data(), valid_utf16_input.size());
4362 size_t length)
noexcept;
4364simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4365count_utf16le(std::span<const char16_t> valid_utf16_input)
noexcept {
4366 #if SIMDUTF_CPLUSPLUS23
4368 return scalar::utf16::count_code_points<endianness::LITTLE>(
4369 valid_utf16_input.data(), valid_utf16_input.size());
4373 return count_utf16le(valid_utf16_input.data(), valid_utf16_input.size());
4393 size_t length)
noexcept;
4395simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4396count_utf16be(std::span<const char16_t> valid_utf16_input)
noexcept {
4397 #if SIMDUTF_CPLUSPLUS23
4399 return scalar::utf16::count_code_points<endianness::BIG>(
4400 valid_utf16_input.data(), valid_utf16_input.size());
4404 return count_utf16be(valid_utf16_input.data(), valid_utf16_input.size());
4410#if SIMDUTF_FEATURE_UTF8
4424 size_t length)
noexcept;
4426simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t count_utf8(
4427 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
4428 #if SIMDUTF_CPLUSPLUS23
4430 return scalar::utf8::count_code_points(valid_utf8_input.data(),
4431 valid_utf8_input.size());
4435 return count_utf8(
reinterpret_cast<const char *
>(valid_utf8_input.data()),
4436 valid_utf8_input.size());
4457simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4459 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
4460 #if SIMDUTF_CPLUSPLUS23
4462 return scalar::utf8::trim_partial_utf8(valid_utf8_input.data(),
4463 valid_utf8_input.size());
4468 reinterpret_cast<const char *
>(valid_utf8_input.data()),
4469 valid_utf8_input.size());
4475#if SIMDUTF_FEATURE_UTF16
4493simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4495 #if SIMDUTF_CPLUSPLUS23
4497 return scalar::utf16::trim_partial_utf16<endianness::BIG>(
4498 valid_utf16_input.data(), valid_utf16_input.size());
4503 valid_utf16_input.size());
4525simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4527 #if SIMDUTF_CPLUSPLUS23
4529 return scalar::utf16::trim_partial_utf16<endianness::LITTLE>(
4530 valid_utf16_input.data(), valid_utf16_input.size());
4535 valid_utf16_input.size());
4557simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4559 #if SIMDUTF_CPLUSPLUS23
4561 return scalar::utf16::trim_partial_utf16<endianness::NATIVE>(
4562 valid_utf16_input.data(), valid_utf16_input.size());
4567 valid_utf16_input.size());
4573#if SIMDUTF_FEATURE_BASE64 || SIMDUTF_FEATURE_UTF16 || \
4574 SIMDUTF_FEATURE_DETECT_ENCODING
4575 #ifndef SIMDUTF_NEED_TRAILING_ZEROES
4576 #define SIMDUTF_NEED_TRAILING_ZEROES 1
4581#if SIMDUTF_FEATURE_BASE64
4586constexpr uint64_t base64_reverse_padding =
4588enum base64_options : uint64_t {
4591 base64_default_no_padding =
4593 base64_reverse_padding,
4594 base64_url_with_padding =
4595 base64_url | base64_reverse_padding,
4596 base64_default_accept_garbage =
4599 base64_url_accept_garbage =
4602 base64_default_or_url =
4604 base64_default_or_url_accept_garbage =
4613enum last_chunk_handling_options : uint64_t {
4617 stop_before_partial =
4623inline simdutf_constexpr23
bool
4624is_partial(last_chunk_handling_options options) {
4625 return (options == stop_before_partial) || (options == only_full_chunks);
4629simdutf_warn_unused
const char *find(
const char *start,
const char *end,
4630 char character)
noexcept;
4631simdutf_warn_unused
const char16_t *
4632find(
const char16_t *start,
const char16_t *end,
char16_t character)
noexcept;
4645simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
const char *
4646find(
const char *start,
const char *end,
char character)
noexcept {
4647 #if SIMDUTF_CPLUSPLUS23
4649 for (; start != end; ++start)
4650 if (*start == character)
4656 return detail::find(start, end, character);
4659simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
const char16_t *
4660find(
const char16_t *start,
const char16_t *end,
char16_t character)
noexcept {
4663 #if SIMDUTF_CPLUSPLUS23
4665 for (; start != end; ++start)
4666 if (*start == character)
4672 return detail::find(start, end, character);
4677 #include <simdutf/base64_tables.h>
4678 #include <simdutf/scalar/base64.h>
4682inline std::string_view to_string(base64_options options) {
4684 case base64_default:
4685 return "base64_default";
4687 return "base64_url";
4688 case base64_reverse_padding:
4689 return "base64_reverse_padding";
4690 case base64_url_with_padding:
4691 return "base64_url_with_padding";
4692 case base64_default_accept_garbage:
4693 return "base64_default_accept_garbage";
4694 case base64_url_accept_garbage:
4695 return "base64_url_accept_garbage";
4696 case base64_default_or_url:
4697 return "base64_default_or_url";
4698 case base64_default_or_url_accept_garbage:
4699 return "base64_default_or_url_accept_garbage";
4704inline std::string_view to_string(last_chunk_handling_options options) {
4710 case stop_before_partial:
4711 return "stop_before_partial";
4712 case only_full_chunks:
4713 return "only_full_chunks";
4731simdutf_warn_unused
size_t
4734simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4736 const detail::input_span_of_byte_like
auto &input)
noexcept {
4737 #if SIMDUTF_CPLUSPLUS23
4739 return scalar::base64::maximal_binary_length_from_base64(
4740 detail::constexpr_cast_ptr<uint8_t>(input.data()), input.size());
4745 reinterpret_cast<const char *
>(input.data()), input.size());
4765 const char16_t *input,
size_t length)
noexcept;
4767simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4769 #if SIMDUTF_CPLUSPLUS23
4771 return scalar::base64::maximal_binary_length_from_base64(input.data(),
4796 size_t length)
noexcept;
4798simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4800 const detail::input_span_of_byte_like
auto &input)
noexcept {
4801 #if SIMDUTF_CPLUSPLUS23
4803 return detail::with_char_input(input, [&](
auto in) {
4804 return scalar::base64::binary_length_from_base64(in, input.size());
4810 reinterpret_cast<const char *
>(input.data()), input.size());
4831 size_t length)
noexcept;
4833simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4835 #if SIMDUTF_CPLUSPLUS23
4837 return scalar::base64::binary_length_from_base64(input.data(),
4902 const char *input,
size_t length,
char *output,
4903 base64_options options = base64_default,
4904 last_chunk_handling_options last_chunk_options = loose)
noexcept;
4906simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
4908 const detail::input_span_of_byte_like
auto &input,
4909 detail::output_span_of_byte_like
auto &&binary_output,
4910 base64_options options = base64_default,
4911 last_chunk_handling_options last_chunk_options = loose)
noexcept {
4912 #if SIMDUTF_CPLUSPLUS23
4914 return detail::with_char_input(input, [&](
auto in) {
4915 return detail::with_char_output(
4918 return scalar::base64::base64_to_binary_details_impl(
4919 in, input.size(), out, options, last_chunk_options);
4921 [](
const full_result &r) {
return r.output_count; });
4928 reinterpret_cast<char *
>(binary_output.data()),
4929 options, last_chunk_options);
4942 size_t length, base64_options options = base64_default)
noexcept {
4943 return scalar::base64::base64_length_from_binary(length, options);
4956inline simdutf_warn_unused simdutf_constexpr23
size_t
4958 size_t length, base64_options options = base64_default,
4960 return scalar::base64::base64_length_from_binary_with_lines(length, options,
4986 base64_options options = base64_default)
noexcept;
4988simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4990 detail::output_span_of_byte_like
auto &&binary_output,
4991 base64_options options = base64_default)
noexcept {
4992 #if SIMDUTF_CPLUSPLUS23
4994 return detail::with_char_input(input, [&](
const char *in) {
4995 return detail::with_char_output(
4998 return scalar::base64::tail_encode_base64(out, in, input.size(),
5001 [](std::size_t n) {
return n; });
5007 reinterpret_cast<const char *
>(input.data()), input.size(),
5008 reinterpret_cast<char *
>(binary_output.data()), options);
5040 base64_options options = base64_default)
noexcept;
5042simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
5044 const detail::input_span_of_byte_like
auto &input,
5045 detail::output_span_of_byte_like
auto &&binary_output,
5047 base64_options options = base64_default)
noexcept {
5048 #if SIMDUTF_CPLUSPLUS23
5050 return detail::with_char_input(input, [&](
const char *in) {
5051 return detail::with_char_output(
5054 return scalar::base64::tail_encode_base64_impl<true>(
5055 out, in, input.size(), options, line_length);
5057 [](std::size_t n) {
return n; });
5063 reinterpret_cast<const char *
>(input.data()), input.size(),
5064 reinterpret_cast<char *
>(binary_output.data()), line_length, options);
5069 #if SIMDUTF_ATOMIC_REF
5112atomic_binary_to_base64(
const char *input,
size_t length,
char *output,
5113 base64_options options = base64_default)
noexcept;
5115simdutf_really_inline simdutf_warn_unused
size_t
5116atomic_binary_to_base64(
const detail::input_span_of_byte_like
auto &input,
5117 detail::output_span_of_byte_like
auto &&binary_output,
5118 base64_options options = base64_default)
noexcept {
5119 return atomic_binary_to_base64(
5120 reinterpret_cast<const char *
>(input.data()), input.size(),
5121 reinterpret_cast<char *
>(binary_output.data()), options);
5182simdutf_warn_unused
result
5184 base64_options options = base64_default,
5185 last_chunk_handling_options last_chunk_options =
5186 last_chunk_handling_options::loose)
noexcept;
5188simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
5190 std::span<const char16_t> input,
5191 detail::output_span_of_byte_like
auto &&binary_output,
5192 base64_options options = base64_default,
5193 last_chunk_handling_options last_chunk_options = loose)
noexcept {
5194 #if SIMDUTF_CPLUSPLUS23
5196 return detail::with_char_output(
5199 return scalar::base64::base64_to_binary_details_impl(
5200 input.data(), input.size(), out, options, last_chunk_options);
5202 [](
const full_result &r) {
return r.output_count; });
5207 reinterpret_cast<char *
>(binary_output.data()),
5208 options, last_chunk_options);
5260simdutf_warn_unused full_result
5262 base64_options options = base64_default,
5263 last_chunk_handling_options last_chunk_options =
5264 last_chunk_handling_options::loose)
noexcept;
5266simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
full_result
5268 const detail::input_span_of_byte_like
auto &input,
5269 detail::output_span_of_byte_like
auto &&binary_output,
5270 base64_options options = base64_default,
5271 last_chunk_handling_options last_chunk_options = loose)
noexcept {
5272 #if SIMDUTF_CPLUSPLUS23
5274 return detail::with_char_input(input, [&](
auto in) {
5275 return detail::with_char_output(
5278 return scalar::base64::base64_to_binary_details_impl(
5279 in, input.size(), out, options, last_chunk_options);
5281 [](
const full_result &r) {
return r.output_count; });
5287 reinterpret_cast<const char *
>(input.data()), input.size(),
5288 reinterpret_cast<char *
>(binary_output.data()), options,
5289 last_chunk_options);
5342simdutf_warn_unused full_result
5344 base64_options options = base64_default,
5345 last_chunk_handling_options last_chunk_options =
5346 last_chunk_handling_options::loose)
noexcept;
5348simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
full_result
5350 std::span<const char16_t> input,
5351 detail::output_span_of_byte_like
auto &&binary_output,
5352 base64_options options = base64_default,
5353 last_chunk_handling_options last_chunk_options = loose)
noexcept {
5354 #if SIMDUTF_CPLUSPLUS23
5356 return detail::with_char_output(
5359 return scalar::base64::base64_to_binary_details_impl(
5360 input.data(), input.size(), out, options, last_chunk_options);
5362 [](
const full_result &r) {
return r.output_count; });
5367 input.data(), input.size(),
5368 reinterpret_cast<char *
>(binary_output.data()), options,
5369 last_chunk_options);
5384simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
bool
5386 return scalar::base64::is_ignorable(input, options);
5388simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
bool
5390 base64_options options = base64_default)
noexcept {
5391 return scalar::base64::is_ignorable(input, options);
5405simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
bool
5406base64_valid(
char input, base64_options options = base64_default)
noexcept {
5407 return scalar::base64::is_base64(input, options);
5409simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
bool
5410base64_valid(
char16_t input, base64_options options = base64_default)
noexcept {
5411 return scalar::base64::is_base64(input, options);
5423simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
bool
5425 base64_options options = base64_default)
noexcept {
5426 return scalar::base64::is_base64_or_padding(input, options);
5428simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
bool
5430 base64_options options = base64_default)
noexcept {
5431 return scalar::base64::is_base64_or_padding(input, options);
5505simdutf_warn_unused
result
5507 size_t &outlen, base64_options options = base64_default,
5508 last_chunk_handling_options last_chunk_options =
5509 last_chunk_handling_options::loose,
5510 bool decode_up_to_bad_char =
false) noexcept;
5513simdutf_warn_unused
result
5515 size_t &outlen, base64_options options = base64_default,
5516 last_chunk_handling_options last_chunk_options =
5517 last_chunk_handling_options::loose,
5518 bool decode_up_to_bad_char = false) noexcept;
5521 #if SIMDUTF_ATOMIC_REF
5561simdutf_warn_unused
result atomic_base64_to_binary_safe(
5562 const char *input,
size_t length,
char *output,
size_t &outlen,
5563 base64_options options = base64_default,
5564 last_chunk_handling_options last_chunk_options =
5565 last_chunk_handling_options::loose,
5566 bool decode_up_to_bad_char =
false) noexcept;
5567simdutf_warn_unused
result atomic_base64_to_binary_safe(
5568 const
char16_t *input,
size_t length,
char *output,
size_t &outlen,
5569 base64_options options = base64_default,
5570 last_chunk_handling_options last_chunk_options = loose,
5571 bool decode_up_to_bad_char = false) noexcept;
5577simdutf_really_inline simdutf_warn_unused std::tuple<result, std::size_t>
5578atomic_base64_to_binary_safe(
5579 const detail::input_span_of_byte_like
auto &binary_input,
5580 detail::output_span_of_byte_like
auto &&output,
5581 base64_options options = base64_default,
5582 last_chunk_handling_options last_chunk_options =
5583 last_chunk_handling_options::loose,
5584 bool decode_up_to_bad_char =
false) noexcept {
5585 size_t outlen = output.size();
5586 auto ret = atomic_base64_to_binary_safe(
5587 reinterpret_cast<const char *
>(binary_input.data()), binary_input.size(),
5588 reinterpret_cast<char *
>(output.data()), outlen, options,
5589 last_chunk_options, decode_up_to_bad_char);
5590 return {ret, outlen};
5596simdutf_warn_unused std::tuple<result, std::size_t>
5597atomic_base64_to_binary_safe(
5598 std::span<const char16_t> base64_input,
5599 detail::output_span_of_byte_like
auto &&binary_output,
5600 base64_options options = base64_default,
5601 last_chunk_handling_options last_chunk_options = loose,
5602 bool decode_up_to_bad_char =
false) noexcept {
5603 size_t outlen = binary_output.size();
5604 auto ret = atomic_base64_to_binary_safe(
5605 base64_input.data(), base64_input.size(),
5606 reinterpret_cast<char *
>(binary_output.data()), outlen, options,
5607 last_chunk_options, decode_up_to_bad_char);
5608 return {ret, outlen};
5622class implementation {
5633 virtual std::string_view
name() const noexcept {
return _name; }
5644 virtual std::string_view
description() const noexcept {
return _description; }
5657#if SIMDUTF_FEATURE_DETECT_ENCODING
5665 size_t length)
const noexcept;
5674 size_t length)
const noexcept = 0;
5684 virtual uint32_t required_instruction_sets()
const {
5685 return _required_instruction_sets;
5688#if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
5699 size_t len)
const noexcept = 0;
5702#if SIMDUTF_FEATURE_UTF8
5715 simdutf_warn_unused
virtual result
5734#if SIMDUTF_FEATURE_ASCII
5744 simdutf_warn_unused
virtual bool
5759 simdutf_warn_unused
virtual result
5764#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_ASCII
5776 simdutf_warn_unused
virtual bool
5790 simdutf_warn_unused
virtual bool
5794#if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
5809 simdutf_warn_unused
virtual bool
5813#if SIMDUTF_FEATURE_UTF16
5828 simdutf_warn_unused
virtual bool
5847 simdutf_warn_unused
virtual result
5849 size_t len)
const noexcept = 0;
5867 simdutf_warn_unused
virtual result
5869 size_t len)
const noexcept = 0;
5883 char16_t *output)
const noexcept = 0;
5897 char16_t *output)
const noexcept = 0;
5900#if SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
5913 simdutf_warn_unused
virtual bool
5917#if SIMDUTF_FEATURE_UTF32
5933 simdutf_warn_unused
virtual result
5935 size_t len)
const noexcept = 0;
5938#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
5949 simdutf_warn_unused
virtual size_t
5951 char *utf8_output)
const noexcept = 0;
5954#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
5965 simdutf_warn_unused
virtual size_t
5967 char16_t *utf16_output)
const noexcept = 0;
5979 simdutf_warn_unused
virtual size_t
5981 char16_t *utf16_output)
const noexcept = 0;
5984#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
5995 simdutf_warn_unused
virtual size_t
5997 char32_t *utf32_buffer)
const noexcept = 0;
6000#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
6013 simdutf_warn_unused
virtual size_t
6015 char *latin1_output)
const noexcept = 0;
6033 simdutf_warn_unused
virtual result
6035 char *latin1_output)
const noexcept = 0;
6056 simdutf_warn_unused
virtual size_t
6058 char *latin1_output)
const noexcept = 0;
6061#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
6074 simdutf_warn_unused
virtual size_t
6076 char16_t *utf16_output)
const noexcept = 0;
6090 simdutf_warn_unused
virtual size_t
6092 char16_t *utf16_output)
const noexcept = 0;
6110 const char *input,
size_t length,
6111 char16_t *utf16_output)
const noexcept = 0;
6129 const char *input,
size_t length,
6130 char16_t *utf16_output)
const noexcept = 0;
6151 const char16_t *input,
size_t length)
const noexcept = 0;
6173 const char16_t *input,
size_t length)
const noexcept = 0;
6177#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
6190 simdutf_warn_unused
virtual size_t
6192 char32_t *utf32_output)
const noexcept = 0;
6208 simdutf_warn_unused
virtual result
6210 char32_t *utf32_output)
const noexcept = 0;
6213#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
6224 simdutf_warn_unused
virtual size_t
6226 char16_t *utf16_buffer)
const noexcept = 0;
6238 simdutf_warn_unused
virtual size_t
6240 char16_t *utf16_buffer)
const noexcept = 0;
6243#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
6254 simdutf_warn_unused
virtual size_t
6256 char32_t *utf32_buffer)
const noexcept = 0;
6259#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
6272 simdutf_warn_unused
virtual size_t
6276#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
6291 simdutf_warn_unused
virtual size_t
6295#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
6312 simdutf_warn_unused
virtual size_t
6314 char *latin1_buffer)
const noexcept = 0;
6332 simdutf_warn_unused
virtual size_t
6334 char *latin1_buffer)
const noexcept = 0;
6355 simdutf_warn_unused
virtual result
6357 char *latin1_buffer)
const noexcept = 0;
6378 simdutf_warn_unused
virtual result
6380 char *latin1_buffer)
const noexcept = 0;
6402 simdutf_warn_unused
virtual size_t
6404 char *latin1_buffer)
const noexcept = 0;
6426 simdutf_warn_unused
virtual size_t
6428 char *latin1_buffer)
const noexcept = 0;
6431#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
6447 simdutf_warn_unused
virtual size_t
6449 char *utf8_buffer)
const noexcept = 0;
6466 simdutf_warn_unused
virtual size_t
6468 char *utf8_buffer)
const noexcept = 0;
6488 simdutf_warn_unused
virtual result
6490 char *utf8_buffer)
const noexcept = 0;
6510 simdutf_warn_unused
virtual result
6512 char *utf8_buffer)
const noexcept = 0;
6530 const char16_t *input,
size_t length,
6531 char *utf8_buffer)
const noexcept = 0;
6549 const char16_t *input,
size_t length,
6550 char *utf8_buffer)
const noexcept = 0;
6566 simdutf_warn_unused
virtual size_t
6568 char *utf8_buffer)
const noexcept = 0;
6584 simdutf_warn_unused
virtual size_t
6586 char *utf8_buffer)
const noexcept = 0;
6589#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
6605 simdutf_warn_unused
virtual size_t
6607 char32_t *utf32_buffer)
const noexcept = 0;
6624 simdutf_warn_unused
virtual size_t
6626 char32_t *utf32_buffer)
const noexcept = 0;
6647 const char16_t *input,
size_t length,
6648 char32_t *utf32_buffer)
const noexcept = 0;
6669 const char16_t *input,
size_t length,
6670 char32_t *utf32_buffer)
const noexcept = 0;
6686 simdutf_warn_unused
virtual size_t
6688 char32_t *utf32_buffer)
const noexcept = 0;
6704 simdutf_warn_unused
virtual size_t
6706 char32_t *utf32_buffer)
const noexcept = 0;
6709#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
6724 simdutf_warn_unused
virtual size_t
6726 size_t length)
const noexcept = 0;
6742 simdutf_warn_unused
virtual size_t
6744 size_t length)
const noexcept = 0;
6747#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
6764 simdutf_warn_unused
virtual size_t
6766 char *latin1_buffer)
const noexcept = 0;
6769#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
6789 simdutf_warn_unused
virtual result
6791 char *latin1_buffer)
const noexcept = 0;
6813 simdutf_warn_unused
virtual size_t
6815 char *latin1_buffer)
const noexcept = 0;
6818#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
6834 simdutf_warn_unused
virtual size_t
6836 char *utf8_buffer)
const noexcept = 0;
6855 simdutf_warn_unused
virtual result
6857 char *utf8_buffer)
const noexcept = 0;
6873 simdutf_warn_unused
virtual size_t
6875 char *utf8_buffer)
const noexcept = 0;
6878#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
6888 simdutf_warn_unused
virtual size_t
6894#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
6910 simdutf_warn_unused
virtual size_t
6912 char16_t *utf16_buffer)
const noexcept = 0;
6929 simdutf_warn_unused
virtual size_t
6931 char16_t *utf16_buffer)
const noexcept = 0;
6952 const char32_t *input,
size_t length,
6953 char16_t *utf16_buffer)
const noexcept = 0;
6974 const char32_t *input,
size_t length,
6975 char16_t *utf16_buffer)
const noexcept = 0;
6991 simdutf_warn_unused
virtual size_t
6993 char16_t *utf16_buffer)
const noexcept = 0;
7009 simdutf_warn_unused
virtual size_t
7011 char16_t *utf16_buffer)
const noexcept = 0;
7014#if SIMDUTF_FEATURE_UTF16
7030 char16_t *output)
const noexcept = 0;
7033#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
7042 simdutf_warn_unused
virtual size_t
7046#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
7059 simdutf_warn_unused
virtual size_t
7061 size_t length)
const noexcept = 0;
7064#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
7076 simdutf_warn_unused
virtual size_t
7082#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
7094 simdutf_warn_unused
virtual size_t
7098#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
7113 simdutf_warn_unused
virtual size_t
7119#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
7132 simdutf_warn_unused
virtual size_t
7134 size_t length)
const noexcept = 0;
7137#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
7146 simdutf_warn_unused
virtual size_t
7152#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
7170 simdutf_warn_unused
virtual size_t
7172 size_t length)
const noexcept = 0;
7191 simdutf_warn_unused
virtual size_t
7193 size_t length)
const noexcept = 0;
7196#if SIMDUTF_FEATURE_UTF16
7212 simdutf_warn_unused
virtual size_t
7230 simdutf_warn_unused
virtual size_t
7234#if SIMDUTF_FEATURE_UTF8
7247 simdutf_warn_unused
virtual size_t
7251#if SIMDUTF_FEATURE_BASE64
7266 const char *input,
size_t length)
const noexcept;
7283 const char16_t *input,
size_t length)
const noexcept;
7297 simdutf_warn_unused
virtual size_t
7313 simdutf_warn_unused
virtual size_t
7315 size_t length)
const noexcept;
7350 simdutf_warn_unused
virtual result
7352 base64_options options = base64_default,
7353 last_chunk_handling_options last_chunk_options =
7354 last_chunk_handling_options::loose)
const noexcept = 0;
7389 const char *input,
size_t length,
char *output,
7390 base64_options options = base64_default,
7391 last_chunk_handling_options last_chunk_options =
7392 last_chunk_handling_options::loose)
const noexcept = 0;
7428 simdutf_warn_unused
virtual result
7430 base64_options options = base64_default,
7431 last_chunk_handling_options last_chunk_options =
7432 last_chunk_handling_options::loose)
const noexcept = 0;
7467 const char16_t *input,
size_t length,
char *output,
7468 base64_options options = base64_default,
7469 last_chunk_handling_options last_chunk_options =
7470 last_chunk_handling_options::loose)
const noexcept = 0;
7481 size_t length, base64_options options = base64_default)
const noexcept;
7506 base64_options options = base64_default)
const noexcept = 0;
7534 const char *input,
size_t length,
char *output,
7536 base64_options options = base64_default)
const noexcept = 0;
7548 virtual const char *
find(
const char *start,
const char *end,
7549 char character)
const noexcept = 0;
7550 virtual const char16_t *
find(
const char16_t *start,
const char16_t *end,
7551 char16_t character)
const noexcept = 0;
7554#ifdef SIMDUTF_INTERNAL_TESTS
7563 struct TestProcedure {
7565 std::string_view
name;
7568 void (*procedure)(
const implementation &);
7571 virtual std::vector<TestProcedure> internal_tests()
const;
7584 uint32_t required_instruction_sets)
7586 _required_instruction_sets(required_instruction_sets) {}
7589 ~implementation() =
default;
7600 const char *_description;
7605 const uint32_t _required_instruction_sets;
7614class available_implementation_list {
7617 simdutf_really_inline available_implementation_list() {}
7619 size_t size() const noexcept;
7621 const implementation *const *begin() const noexcept;
7623 const implementation *const *end() const noexcept;
7638 const implementation *operator[](std::string_view name) const noexcept {
7639 for (
const implementation *impl : *
this) {
7640 if (impl->name() == name) {
7660 const implementation *detect_best_supported() const noexcept;
7663template <typename T> class atomic_ptr {
7665 atomic_ptr(T *_ptr) : ptr{_ptr} {}
7667#if defined(SIMDUTF_NO_THREADS)
7668 operator const T *()
const {
return ptr; }
7669 const T &operator*()
const {
return *ptr; }
7670 const T *operator->()
const {
return ptr; }
7672 operator T *() {
return ptr; }
7673 T &operator*() {
return *ptr; }
7674 T *operator->() {
return ptr; }
7675 atomic_ptr &operator=(T *_ptr) {
7681 operator const T *()
const {
return ptr.load(); }
7682 const T &operator*()
const {
return *ptr; }
7683 const T *operator->()
const {
return ptr.load(); }
7685 operator T *() {
return ptr.load(); }
7686 T &operator*() {
return *ptr; }
7687 T *operator->() {
return ptr.load(); }
7688 atomic_ptr &operator=(T *_ptr) {
7696#if defined(SIMDUTF_NO_THREADS)
7699 std::atomic<T *> ptr;
7703class detect_best_supported_implementation_on_first_use;
7710extern SIMDUTF_DLLIMPORTEXPORT
const internal::available_implementation_list &
7719extern SIMDUTF_DLLIMPORTEXPORT internal::atomic_ptr<const implementation> &
7724#if SIMDUTF_FEATURE_BASE64
7726 #include <simdutf/base64_implementation.h>
7734simdutf_really_inline
7735 simdutf_constexpr23 simdutf_warn_unused std::tuple<result, std::size_t>
7737 const detail::input_span_of_byte_like
auto &input,
7738 detail::output_span_of_byte_like
auto &&binary_output,
7739 base64_options options = base64_default,
7740 last_chunk_handling_options last_chunk_options = loose,
7741 bool decode_up_to_bad_char =
false) noexcept {
7742 size_t outlen = binary_output.size();
7743 #if SIMDUTF_CPLUSPLUS23
7745 auto r = detail::with_char_input(input, [&](
auto in) {
7746 return detail::with_char_output(
7749 return base64_to_binary_safe_impl(in, input.size(), out, outlen,
7750 options, last_chunk_options,
7751 decode_up_to_bad_char);
7753 [&](
const auto &) {
return outlen; });
7759 auto r = base64_to_binary_safe_impl<char>(
7760 reinterpret_cast<const char *
>(input.data()), input.size(),
7761 reinterpret_cast<char *
>(binary_output.data()), outlen, options,
7762 last_chunk_options, decode_up_to_bad_char);
7772simdutf_really_inline
7773 simdutf_warn_unused simdutf_constexpr23 std::tuple<result, std::size_t>
7775 std::span<const char16_t> input,
7776 detail::output_span_of_byte_like
auto &&binary_output,
7777 base64_options options = base64_default,
7778 last_chunk_handling_options last_chunk_options = loose,
7779 bool decode_up_to_bad_char =
false) noexcept {
7780 size_t outlen = binary_output.size();
7781 #if SIMDUTF_CPLUSPLUS23
7783 auto r = detail::with_char_output(
7786 return base64_to_binary_safe_impl(input.data(), input.size(), out,
7787 outlen, options, last_chunk_options,
7788 decode_up_to_bad_char);
7790 [&](
const auto &) {
return outlen; });
7796 input.data(), input.size(),
7797 reinterpret_cast<char *
>(binary_output.data()), outlen, options,
7798 last_chunk_options, decode_up_to_bad_char);
7809#if SIMDUTF_CPLUSPLUS23 && SIMDUTF_FEATURE_BASE64
7818template <std::
size_t N>
struct base64_literal_helper {
7819 std::array<char, N - 1> storage{};
7820 static constexpr std::size_t size() noexcept {
return N - 1; }
7821 consteval base64_literal_helper(
const char (&str)[N]) {
7822 for (std::size_t i = 0; i < size(); i++) {
7823 storage[i] = str[i];
7828template <std::
size_t InputLen>
struct base64_decode_result {
7829 static constexpr std::size_t max_out = (InputLen + 3) / 4 * 3;
7830 std::array<char, max_out> buffer{};
7831 std::size_t output_count{};
7834template <std::
size_t InputLen>
7835consteval auto base64_decode_literal(
const char *str) {
7836 base64_decode_result<InputLen> result{};
7837 auto r = scalar::base64::base64_to_binary_details_impl(
7838 str, InputLen, result.buffer.data(), base64_default, loose);
7839 if (r.error != error_code::SUCCESS) {
7840 #if __cpp_lib_unreachable >= 202202L
7844 throw "invalid base64 input in _base64 literal";
7847 result.output_count = r.output_count;
7851template <base64_literal_helper a>
consteval auto base64_make_array() {
7852 constexpr auto decoded = base64_decode_literal<a.size()>(a.storage.data());
7853 std::array<char, decoded.output_count> ret{};
7854 for (std::size_t i = 0; i < decoded.output_count; i++) {
7855 ret[i] = decoded.buffer[i];
7873template <detail::base64_literal_helper a>
consteval auto operator""_base64() {
7874 return detail::base64_make_array<a>();
An implementation of simdutf for a particular CPU architecture.
virtual simdutf_warn_unused size_t convert_valid_utf32_to_latin1(const char32_t *input, size_t length, char *latin1_buffer) const noexcept=0
Convert valid UTF-32 string into Latin1 string.
virtual simdutf_warn_unused size_t binary_length_from_base64(const char *input, size_t length) const noexcept
Compute the binary length from a base64 input with ASCII spaces.
virtual const char * find(const char *start, const char *end, char character) const noexcept=0
Find the first occurrence of a character in a string.
virtual simdutf_warn_unused size_t convert_valid_utf8_to_utf16le(const char *input, size_t length, char16_t *utf16_buffer) const noexcept=0
Convert valid UTF-8 string into UTF-16LE string.
virtual simdutf_warn_unused size_t latin1_length_from_utf16(size_t length) const noexcept
Compute the number of bytes that this UTF-16LE/BE string would require in Latin1 format.
virtual simdutf_warn_unused size_t convert_utf16le_to_utf8_with_replacement(const char16_t *input, size_t length, char *utf8_buffer) const noexcept=0
Convert possibly broken UTF-16LE string into UTF-8 string, replacing unpaired surrogates with the Uni...
virtual simdutf_warn_unused size_t binary_length_from_base64(const char16_t *input, size_t length) const noexcept
Compute the binary length from a base64 input with ASCII spaces.
virtual simdutf_warn_unused size_t utf32_length_from_utf16be(const char16_t *input, size_t length) const noexcept=0
Compute the number of bytes that this UTF-16BE string would require in UTF-32 format.
virtual simdutf_warn_unused size_t convert_utf8_to_utf16be(const char *input, size_t length, char16_t *utf16_output) const noexcept=0
Convert possibly broken UTF-8 string into UTF-16BE string.
virtual simdutf_warn_unused size_t convert_utf16le_to_utf32(const char16_t *input, size_t length, char32_t *utf32_buffer) const noexcept=0
Convert possibly broken UTF-16LE string into UTF-32 string.
virtual simdutf_warn_unused size_t convert_valid_utf16be_to_utf32(const char16_t *input, size_t length, char32_t *utf32_buffer) const noexcept=0
Convert valid UTF-16LE string into UTF-32BE string.
virtual std::string_view name() const noexcept
The name of this implementation.
virtual simdutf_warn_unused size_t convert_valid_utf16be_to_utf8(const char16_t *input, size_t length, char *utf8_buffer) const noexcept=0
Convert valid UTF-16BE string into UTF-8 string.
virtual simdutf_warn_unused size_t convert_latin1_to_utf16le(const char *input, size_t length, char16_t *utf16_output) const noexcept=0
Convert possibly Latin1 string into UTF-16LE string.
virtual simdutf_warn_unused bool validate_utf16be(const char16_t *buf, size_t len) const noexcept=0
Validate the UTF-16BE string.
virtual simdutf_warn_unused result convert_utf16be_to_latin1_with_errors(const char16_t *input, size_t length, char *latin1_buffer) const noexcept=0
Convert possibly broken UTF-16BE string into Latin1 string.
virtual simdutf_warn_unused full_result base64_to_binary_details(const char *input, size_t length, char *output, base64_options options=base64_default, last_chunk_handling_options last_chunk_options=last_chunk_handling_options::loose) const noexcept=0
Convert a base64 input to a binary output while returning more details than base64_to_binary.
virtual simdutf_warn_unused size_t convert_valid_utf16le_to_utf32(const char16_t *input, size_t length, char32_t *utf32_buffer) const noexcept=0
Convert valid UTF-16LE string into UTF-32 string.
virtual simdutf_warn_unused size_t latin1_length_from_utf8(const char *input, size_t length) const noexcept=0
Compute the number of bytes that this UTF-8 string would require in Latin1 format.
virtual simdutf_warn_unused result convert_utf32_to_latin1_with_errors(const char32_t *input, size_t length, char *latin1_buffer) const noexcept=0
Convert possibly broken UTF-32 string into Latin1 string and stop on error.
virtual simdutf_warn_unused size_t utf8_length_from_utf32(const char32_t *input, size_t length) const noexcept=0
Compute the number of bytes that this UTF-32 string would require in UTF-8 format.
virtual simdutf_warn_unused size_t convert_latin1_to_utf16be(const char *input, size_t length, char16_t *utf16_output) const noexcept=0
Convert Latin1 string into UTF-16BE string.
virtual simdutf_warn_unused size_t latin1_length_from_utf32(size_t length) const noexcept
Compute the number of bytes that this UTF-32 string would require in Latin1 format.
virtual simdutf_warn_unused full_result base64_to_binary_details(const char16_t *input, size_t length, char *output, base64_options options=base64_default, last_chunk_handling_options last_chunk_options=last_chunk_handling_options::loose) const noexcept=0
Convert a base64 input to a binary output while returning more details than base64_to_binary.
virtual simdutf_warn_unused size_t convert_utf32_to_utf16le(const char32_t *input, size_t length, char16_t *utf16_buffer) const noexcept=0
Convert possibly broken UTF-32 string into UTF-16LE string.
virtual simdutf_warn_unused size_t utf16_length_from_utf32(const char32_t *input, size_t length) const noexcept=0
Compute the number of two-byte code units that this UTF-32 string would require in UTF-16 format.
virtual simdutf_warn_unused size_t count_utf8(const char *input, size_t length) const noexcept=0
Count the number of code points (characters) in the string assuming that it is valid.
virtual simdutf_warn_unused size_t convert_valid_utf32_to_utf16be(const char32_t *input, size_t length, char16_t *utf16_buffer) const noexcept=0
Convert valid UTF-32 string into UTF-16BE string.
virtual simdutf_warn_unused size_t utf32_length_from_utf8(const char *input, size_t length) const noexcept=0
Compute the number of 4-byte code units that this UTF-8 string would require in UTF-32 format.
virtual simdutf_warn_unused size_t convert_valid_utf16le_to_utf8(const char16_t *input, size_t length, char *utf8_buffer) const noexcept=0
Convert valid UTF-16LE string into UTF-8 string.
virtual void to_well_formed_utf16le(const char16_t *input, size_t len, char16_t *output) const noexcept=0
Copies the UTF-16LE string while replacing mismatched surrogates with the Unicode replacement charact...
virtual simdutf_warn_unused result convert_utf32_to_utf16be_with_errors(const char32_t *input, size_t length, char16_t *utf16_buffer) const noexcept=0
Convert possibly broken UTF-32 string into UTF-16BE string and stop on error.
virtual simdutf_warn_unused result validate_utf8_with_errors(const char *buf, size_t len) const noexcept=0
Validate the UTF-8 string and stop on errors.
virtual simdutf_warn_unused size_t utf8_length_from_utf16le(const char16_t *input, size_t length) const noexcept=0
Compute the number of bytes that this UTF-16LE string would require in UTF-8 format.
virtual size_t binary_to_base64_with_lines(const char *input, size_t length, char *output, size_t line_length=simdutf::default_line_length, base64_options options=base64_default) const noexcept=0
Convert a binary input to a base64 output with lines of given length.
virtual simdutf_warn_unused size_t convert_utf16be_to_utf8(const char16_t *input, size_t length, char *utf8_buffer) const noexcept=0
Convert possibly broken UTF-16BE string into UTF-8 string.
virtual simdutf_warn_unused size_t convert_utf8_to_utf16le(const char *input, size_t length, char16_t *utf16_output) const noexcept=0
Convert possibly broken UTF-8 string into UTF-16LE string.
virtual simdutf_warn_unused result convert_utf16le_to_latin1_with_errors(const char16_t *input, size_t length, char *latin1_buffer) const noexcept=0
Convert possibly broken UTF-16LE string into Latin1 string.
virtual simdutf_warn_unused result utf8_length_from_utf16le_with_replacement(const char16_t *input, size_t length) const noexcept=0
Compute the number of bytes that this UTF-16LE string would require in UTF-8 format even when the UTF...
virtual simdutf_warn_unused result validate_utf16le_with_errors(const char16_t *buf, size_t len) const noexcept=0
Validate the UTF-16LE string and stop on error.
virtual simdutf_warn_unused result convert_utf16be_to_utf8_with_errors(const char16_t *input, size_t length, char *utf8_buffer) const noexcept=0
Convert possibly broken UTF-16BE string into UTF-8 string and stop on error.
virtual size_t binary_to_base64(const char *input, size_t length, char *output, base64_options options=base64_default) const noexcept=0
Convert a binary input to a base64 output.
virtual simdutf_warn_unused result utf8_length_from_utf16be_with_replacement(const char16_t *input, size_t length) const noexcept=0
Compute the number of bytes that this UTF-16BE string would require in UTF-8 format even when the UTF...
virtual simdutf_warn_unused size_t convert_latin1_to_utf32(const char *input, size_t length, char32_t *utf32_buffer) const noexcept=0
Convert Latin1 string into UTF-32 string.
virtual simdutf_warn_unused result convert_utf8_to_utf32_with_errors(const char *input, size_t length, char32_t *utf32_output) const noexcept=0
Convert possibly broken UTF-8 string into UTF-32 string and stop on error.
virtual simdutf_warn_unused size_t convert_valid_utf32_to_utf8(const char32_t *input, size_t length, char *utf8_buffer) const noexcept=0
Convert valid UTF-32 string into UTF-8 string.
virtual simdutf_warn_unused size_t utf32_length_from_latin1(size_t length) const noexcept
Return the number of bytes that this UTF-32 string would require in Latin1 format.
virtual std::string_view description() const noexcept
The description of this implementation.
virtual simdutf_warn_unused bool validate_utf16le(const char16_t *buf, size_t len) const noexcept=0
Validate the UTF-16LE string.This function may be best when you expect the input to be almost always ...
virtual simdutf_warn_unused result convert_utf8_to_utf16le_with_errors(const char *input, size_t length, char16_t *utf16_output) const noexcept=0
Convert possibly broken UTF-8 string into UTF-16LE string and stop on error.
virtual simdutf_warn_unused size_t count_utf16le(const char16_t *input, size_t length) const noexcept=0
Count the number of code points (characters) in the string assuming that it is valid.
virtual simdutf_warn_unused size_t convert_utf16be_to_utf32(const char16_t *input, size_t length, char32_t *utf32_buffer) const noexcept=0
Convert possibly broken UTF-16BE string into UTF-32 string.
virtual simdutf_warn_unused size_t convert_valid_utf16le_to_latin1(const char16_t *input, size_t length, char *latin1_buffer) const noexcept=0
Convert valid UTF-16LE string into Latin1 string.
virtual simdutf_warn_unused size_t convert_utf32_to_latin1(const char32_t *input, size_t length, char *latin1_buffer) const noexcept=0
Convert possibly broken UTF-32 string into Latin1 string.
virtual simdutf_warn_unused size_t convert_valid_utf16be_to_latin1(const char16_t *input, size_t length, char *latin1_buffer) const noexcept=0
Convert valid UTF-16BE string into Latin1 string.
bool supported_by_runtime_system() const
The instruction sets this implementation is compiled against and the current CPU match.
virtual simdutf_warn_unused size_t convert_valid_utf8_to_utf32(const char *input, size_t length, char32_t *utf32_buffer) const noexcept=0
Convert valid UTF-8 string into UTF-32 string.
virtual simdutf_warn_unused size_t convert_utf16le_to_latin1(const char16_t *input, size_t length, char *latin1_buffer) const noexcept=0
Convert possibly broken UTF-16LE string into Latin1 string.
virtual simdutf_warn_unused result validate_utf16be_with_errors(const char16_t *buf, size_t len) const noexcept=0
Validate the UTF-16BE string and stop on error.
virtual simdutf_warn_unused result convert_utf16le_to_utf8_with_errors(const char16_t *input, size_t length, char *utf8_buffer) const noexcept=0
Convert possibly broken UTF-16LE string into UTF-8 string and stop on error.
virtual simdutf_warn_unused result convert_utf16be_to_utf32_with_errors(const char16_t *input, size_t length, char32_t *utf32_buffer) const noexcept=0
Convert possibly broken UTF-16BE string into UTF-32 string and stop on error.
virtual simdutf_warn_unused result base64_to_binary(const char *input, size_t length, char *output, base64_options options=base64_default, last_chunk_handling_options last_chunk_options=last_chunk_handling_options::loose) const noexcept=0
Convert a base64 input to a binary output.
virtual simdutf_warn_unused bool validate_utf16be_as_ascii(const char16_t *buf, size_t len) const noexcept=0
Validate the ASCII string as a UTF-16BE sequence.
virtual simdutf_warn_unused size_t convert_utf32_to_utf16be(const char32_t *input, size_t length, char16_t *utf16_buffer) const noexcept=0
Convert possibly broken UTF-32 string into UTF-16BE string.
virtual simdutf_warn_unused result validate_utf32_with_errors(const char32_t *buf, size_t len) const noexcept=0
Validate the UTF-32 string and stop on error.
virtual simdutf_warn_unused size_t utf32_length_from_utf16le(const char16_t *input, size_t length) const noexcept=0
Compute the number of bytes that this UTF-16LE string would require in UTF-32 format.
virtual void change_endianness_utf16(const char16_t *input, size_t length, char16_t *output) const noexcept=0
Change the endianness of the input.
virtual simdutf_warn_unused size_t convert_valid_utf8_to_utf16be(const char *input, size_t length, char16_t *utf16_buffer) const noexcept=0
Convert valid UTF-8 string into UTF-16BE string.
virtual simdutf_warn_unused size_t convert_valid_utf8_to_latin1(const char *input, size_t length, char *latin1_output) const noexcept=0
Convert valid UTF-8 string into latin1 string.
simdutf_warn_unused size_t maximal_binary_length_from_base64(const char *input, size_t length) const noexcept
Provide the maximal binary length in bytes given the base64 input.
virtual simdutf_warn_unused size_t convert_valid_utf32_to_utf16le(const char32_t *input, size_t length, char16_t *utf16_buffer) const noexcept=0
Convert valid UTF-32 string into UTF-16LE string.
virtual simdutf_warn_unused result validate_ascii_with_errors(const char *buf, size_t len) const noexcept=0
Validate the ASCII string and stop on error.
virtual simdutf_warn_unused bool validate_utf8(const char *buf, size_t len) const noexcept=0
Validate the UTF-8 string.
virtual simdutf_warn_unused size_t convert_utf8_to_utf32(const char *input, size_t length, char32_t *utf32_output) const noexcept=0
Convert possibly broken UTF-8 string into UTF-32 string.
simdutf_warn_unused size_t maximal_binary_length_from_base64(const char16_t *input, size_t length) const noexcept
Provide the maximal binary length in bytes given the base64 input.
virtual simdutf_warn_unused bool validate_utf32(const char32_t *buf, size_t len) const noexcept=0
Validate the UTF-32 string.
virtual simdutf_warn_unused result convert_utf16le_to_utf32_with_errors(const char16_t *input, size_t length, char32_t *utf32_buffer) const noexcept=0
Convert possibly broken UTF-16LE string into UTF-32 string and stop on error.
virtual simdutf_warn_unused size_t convert_utf16be_to_utf8_with_replacement(const char16_t *input, size_t length, char *utf8_buffer) const noexcept=0
Convert possibly broken UTF-16BE string into UTF-8 string, replacing unpaired surrogates with the Uni...
virtual simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t *input, size_t length, char *utf8_buffer) const noexcept=0
Convert possibly broken UTF-16LE string into UTF-8 string.
virtual simdutf_warn_unused size_t utf8_length_from_utf16be(const char16_t *input, size_t length) const noexcept=0
Compute the number of bytes that this UTF-16BE string would require in UTF-8 format.
virtual simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t *input, size_t length, char *utf8_buffer) const noexcept=0
Convert possibly broken UTF-32 string into UTF-8 string.
virtual simdutf_warn_unused size_t convert_utf16be_to_latin1(const char16_t *input, size_t length, char *latin1_buffer) const noexcept=0
Convert possibly broken UTF-16BE string into Latin1 string.
virtual simdutf_warn_unused size_t convert_utf8_to_latin1(const char *input, size_t length, char *latin1_output) const noexcept=0
Convert possibly broken UTF-8 string into latin1 string.
virtual simdutf_warn_unused result base64_to_binary(const char16_t *input, size_t length, char *output, base64_options options=base64_default, last_chunk_handling_options last_chunk_options=last_chunk_handling_options::loose) const noexcept=0
Convert a base64 input to a binary output.
simdutf_warn_unused size_t base64_length_from_binary(size_t length, base64_options options=base64_default) const noexcept
Provide the base64 length in bytes given the length of a binary input.
virtual int detect_encodings(const char *input, size_t length) const noexcept=0
This function will try to detect the possible encodings in one pass.
virtual simdutf_warn_unused size_t count_utf16be(const char16_t *input, size_t length) const noexcept=0
Count the number of code points (characters) in the string assuming that it is valid.
virtual simdutf_warn_unused result convert_utf32_to_utf8_with_errors(const char32_t *input, size_t length, char *utf8_buffer) const noexcept=0
Convert possibly broken UTF-32 string into UTF-8 string and stop on error.
virtual simdutf_warn_unused bool validate_utf16le_as_ascii(const char16_t *buf, size_t len) const noexcept=0
Validate the ASCII string as a UTF-16LE sequence.
virtual void to_well_formed_utf16be(const char16_t *input, size_t len, char16_t *output) const noexcept=0
Copies the UTF-16BE string while replacing mismatched surrogates with the Unicode replacement charact...
virtual simdutf_warn_unused bool validate_ascii(const char *buf, size_t len) const noexcept=0
Validate the ASCII string.
virtual simdutf_warn_unused size_t utf16_length_from_utf8(const char *input, size_t length) const noexcept=0
Compute the number of 2-byte code units that this UTF-8 string would require in UTF-16LE format.
virtual simdutf_warn_unused result convert_utf8_to_utf16be_with_errors(const char *input, size_t length, char16_t *utf16_output) const noexcept=0
Convert possibly broken UTF-8 string into UTF-16BE string and stop on error.
virtual simdutf_warn_unused result convert_utf8_to_latin1_with_errors(const char *input, size_t length, char *latin1_output) const noexcept=0
Convert possibly broken UTF-8 string into latin1 string with errors.
virtual simdutf_warn_unused size_t utf16_length_from_latin1(size_t length) const noexcept
Return the number of bytes that this UTF-16 string would require in Latin1 format.
virtual simdutf_warn_unused result convert_utf32_to_utf16le_with_errors(const char32_t *input, size_t length, char16_t *utf16_buffer) const noexcept=0
Convert possibly broken UTF-32 string into UTF-16LE string and stop on error.
virtual simdutf_warn_unused size_t convert_latin1_to_utf8(const char *input, size_t length, char *utf8_output) const noexcept=0
Convert Latin1 string into UTF-8 string.
virtual simdutf_warn_unused utf8_result validate_utf8_with_counts(const char *buf, size_t len) const noexcept=0
Finds the pointer to the first byte of invalid utf8 while counting continuation bytes and four-byte s...
virtual encoding_type autodetect_encoding(const char *input, size_t length) const noexcept
This function will try to detect the encoding.
virtual simdutf_warn_unused size_t utf8_length_from_latin1(const char *input, size_t length) const noexcept=0
Return the number of bytes that this Latin1 string would require in UTF-8 format.
helpers placed in namespace detail are not a part of the public API
simdutf_warn_unused simdutf_really_inline simdutf_constexpr23 size_t utf32_length_from_latin1(size_t length) noexcept
Compute the number of bytes that this Latin1 string would require in UTF-32 format.
simdutf_warn_unused size_t convert_utf16_to_latin1(const char16_t *input, size_t length, char *latin1_buffer) noexcept
Using native endianness, convert possibly broken UTF-16 string into Latin1 string.
simdutf_warn_unused size_t convert_valid_utf16_to_utf8(const char16_t *input, size_t length, char *utf8_buffer) noexcept
Using native endianness, convert valid UTF-16 string into UTF-8 string.
simdutf_warn_unused bool validate_utf16be(const char16_t *buf, size_t len) noexcept
Validate the UTF-16BE string.
simdutf_warn_unused size_t convert_valid_utf16_to_latin1(const char16_t *input, size_t length, char *latin1_buffer) noexcept
Using native endianness, convert UTF-16 string into Latin1 string.
simdutf_warn_unused size_t convert_valid_utf16le_to_utf8(const char16_t *input, size_t length, char *utf8_buffer) noexcept
Convert valid UTF-16LE string into UTF-8 string.
simdutf_warn_unused simdutf_constexpr23 size_t base64_length_from_binary(size_t length, base64_options options=base64_default) noexcept
Provide the base64 length in bytes given the length of a binary input.
simdutf_warn_unused simdutf_really_inline simdutf_constexpr23 bool base64_ignorable(char input, base64_options options=base64_default) noexcept
Check if a character is an ignorable base64 character.
simdutf_warn_unused size_t convert_utf8_to_utf16_with_replacement(const char *input, size_t length, char16_t *utf16_output) noexcept
Convert a possibly ill-formed UTF-8 string into a UTF-16 string (native endianness),...
simdutf_warn_unused bool validate_utf16_as_ascii(const char16_t *buf, size_t len) noexcept
Validate the ASCII string as a UTF-16 sequence.
simdutf_warn_unused bool validate_utf16le(const char16_t *buf, size_t len) noexcept
Validate the UTF-16LE string.
simdutf_warn_unused size_t utf8_length_from_utf32(const char32_t *input, size_t length) noexcept
Compute the number of bytes that this UTF-32 string would require in UTF-8 format.
simdutf_warn_unused simdutf_really_inline simdutf_constexpr23 const char * find(const char *start, const char *end, char character) noexcept
Find the first occurrence of a character in a string.
simdutf_warn_unused result base64_to_binary_safe(const char *input, size_t length, char *output, size_t &outlen, base64_options options=base64_default, last_chunk_handling_options last_chunk_options=last_chunk_handling_options::loose, bool decode_up_to_bad_char=false) noexcept
Convert a base64 input to a binary output.
simdutf_warn_unused size_t convert_utf16be_to_utf8_with_replacement(const char16_t *input, size_t length, char *utf8_buffer) noexcept
Convert possibly broken UTF-16BE string into UTF-8 string, replacing unpaired surrogates with the Uni...
simdutf_warn_unused size_t convert_utf8_to_utf32(const char *input, size_t length, char32_t *utf32_output) noexcept
Convert possibly broken UTF-8 string into UTF-32 string.
simdutf_warn_unused size_t convert_valid_utf16le_to_utf32(const char16_t *input, size_t length, char32_t *utf32_buffer) noexcept
Convert valid UTF-16LE string into UTF-32 string.
simdutf_warn_unused size_t utf32_length_from_utf16le(const char16_t *input, size_t length) noexcept
Compute the number of bytes that this UTF-16LE string would require in UTF-32 format.
constexpr size_t default_line_length
default line length for base64 encoding with lines
size_t binary_to_base64(const char *input, size_t length, char *output, base64_options options=base64_default) noexcept
Convert a binary input to a base64 output.
simdutf_warn_unused result base64_to_binary(const char *input, size_t length, char *output, base64_options options=base64_default, last_chunk_handling_options last_chunk_options=loose) noexcept
Convert a base64 input to a binary output.
SIMDUTF_DLLIMPORTEXPORT internal::atomic_ptr< const implementation > & get_active_implementation()
The active implementation.
simdutf_warn_unused size_t convert_utf16be_to_latin1(const char16_t *input, size_t length, char *latin1_buffer) noexcept
Convert possibly broken UTF-16BE string into Latin1 string.
simdutf_warn_unused size_t convert_utf16le_to_utf8(const char16_t *input, size_t length, char *utf8_buffer) noexcept
Convert possibly broken UTF-16LE string into UTF-8 string.
simdutf_warn_unused bool validate_utf16le_as_ascii(const char16_t *buf, size_t len) noexcept
Validate the ASCII string as a UTF-16LE sequence.
simdutf_warn_unused size_t convert_valid_utf8_to_latin1(const char *input, size_t length, char *latin1_output) noexcept
Convert valid UTF-8 string into latin1 string.
simdutf_warn_unused size_t convert_utf8_to_utf16le(const char *input, size_t length, char16_t *utf16_output) noexcept
Convert possibly broken UTF-8 string into UTF-16LE string.
simdutf_warn_unused size_t convert_valid_utf16be_to_utf8(const char16_t *input, size_t length, char *utf8_buffer) noexcept
Convert valid UTF-16BE string into UTF-8 string.
simdutf_warn_unused full_result convert_latin1_to_utf8_safe_with_details(const char *input, size_t length, char *utf8_output, size_t utf8_len) noexcept
Convert a Latin1 string into a size-limited UTF-8 buffer and report how much input was consumed and o...
simdutf_warn_unused size_t convert_latin1_to_utf32(const char *input, size_t length, char32_t *utf32_buffer) noexcept
Convert Latin1 string into UTF-32 string.
simdutf_warn_unused size_t convert_utf16_to_utf8(const char16_t *input, size_t length, char *utf8_buffer) noexcept
Using native endianness, convert possibly broken UTF-16 string into UTF-8 string.
simdutf_warn_unused size_t convert_utf16le_to_utf32(const char16_t *input, size_t length, char32_t *utf32_buffer) noexcept
Convert possibly broken UTF-16LE string into UTF-32 string.
simdutf_warn_unused result convert_utf16be_to_utf8_with_errors(const char16_t *input, size_t length, char *utf8_buffer) noexcept
Convert possibly broken UTF-16BE string into UTF-8 string and stop on error.
simdutf_warn_unused size_t convert_valid_utf8_to_utf32(const char *input, size_t length, char32_t *utf32_buffer) noexcept
Convert valid UTF-8 string into UTF-32 string.
simdutf_warn_unused result convert_utf32_to_utf8_with_errors(const char32_t *input, size_t length, char *utf8_buffer) noexcept
Convert possibly broken UTF-32 string into UTF-8 string and stop on error.
simdutf_warn_unused size_t convert_utf8_to_utf16le_with_replacement(const char *input, size_t length, char16_t *utf16_output) noexcept
Convert a possibly ill-formed UTF-8 string into a UTF-16LE string, replacing each ill-formed subseque...
simdutf_warn_unused result validate_utf16be_with_errors(const char16_t *buf, size_t len) noexcept
Validate the UTF-16BE string and stop on error.
simdutf_warn_unused size_t convert_utf16_to_utf8_with_replacement(const char16_t *input, size_t length, char *utf8_buffer) noexcept
Convert possibly broken UTF-16 string (native endianness) into UTF-8 string, replacing unpaired surro...
SIMDUTF_DLLIMPORTEXPORT const internal::available_implementation_list & get_available_implementations()
The list of available implementations compiled into simdutf.
simdutf_warn_unused size_t convert_utf32_to_utf16le(const char32_t *input, size_t length, char16_t *utf16_buffer) noexcept
Convert possibly broken UTF-32 string into UTF-16LE string.
simdutf_really_inline simdutf_warn_unused simdutf_constexpr23 size_t utf16_length_from_latin1(size_t length) noexcept
Compute the number of code units that this Latin1 string would require in UTF-16 format.
simdutf_warn_unused simdutf_really_inline simdutf_constexpr23 bool base64_valid_or_padding(char input, base64_options options=base64_default) noexcept
Check if a character is a valid base64 character or the padding character ('=').
void change_endianness_utf16(const char16_t *input, size_t length, char16_t *output) noexcept
Change the endianness of the input.
simdutf_warn_unused result utf8_length_from_utf16_with_replacement(const char16_t *input, size_t length) noexcept
Using native endianness; compute the number of bytes that this UTF-16 string would require in UTF-8 f...
simdutf_warn_unused full_result convert_utf16_to_utf8_with_replacement_safe(const char16_t *input, size_t length, char *utf8_output, size_t utf8_len) noexcept
Convert a possibly broken UTF-16 string into a size-limited UTF-8 buffer, replacing unpaired surrogat...
simdutf_warn_unused result utf8_length_from_utf16le_with_replacement(const char16_t *input, size_t length) noexcept
Compute the number of bytes that this UTF-16LE string would require in UTF-8 format even when the UTF...
simdutf_warn_unused full_result base64_to_binary_details(const char *input, size_t length, char *output, base64_options options=base64_default, last_chunk_handling_options last_chunk_options=last_chunk_handling_options::loose) noexcept
Convert a base64 input to a binary output while returning more details than base64_to_binary.
simdutf_warn_unused size_t convert_utf16be_to_utf32(const char16_t *input, size_t length, char32_t *utf32_buffer) noexcept
Convert possibly broken UTF-16BE string into UTF-32 string.
simdutf_warn_unused size_t utf8_length_from_latin1(const char *input, size_t length) noexcept
Return the number of bytes that this Latin1 string would require in UTF-8 format.
simdutf_warn_unused result convert_utf8_to_utf16le_with_errors(const char *input, size_t length, char16_t *utf16_output) noexcept
Convert possibly broken UTF-8 string into UTF-16LE string and stop on error.
simdutf_warn_unused size_t count_utf16be(const char16_t *input, size_t length) noexcept
Count the number of code points (characters) in the string assuming that it is valid.
simdutf_warn_unused bool validate_utf8(const char *buf, size_t len) noexcept
Validate the UTF-8 string.
simdutf_warn_unused bool validate_utf16(const char16_t *buf, size_t len) noexcept
Using native endianness; Validate the UTF-16 string.
simdutf_warn_unused result convert_utf16be_to_utf32_with_errors(const char16_t *input, size_t length, char32_t *utf32_buffer) noexcept
Convert possibly broken UTF-16BE string into UTF-32 string and stop on error.
simdutf_warn_unused size_t utf8_length_from_utf16le(const char16_t *input, size_t length) noexcept
Compute the number of bytes that this UTF-16LE string would require in UTF-8 format.
simdutf_warn_unused size_t count_utf8(const char *input, size_t length) noexcept
Count the number of code points (characters) in the string assuming that it is valid.
simdutf_warn_unused bool validate_utf32(const char32_t *buf, size_t len) noexcept
Validate the UTF-32 string.
simdutf_warn_unused result convert_utf16le_to_utf8_with_errors(const char16_t *input, size_t length, char *utf8_buffer) noexcept
Convert possibly broken UTF-16LE string into UTF-8 string and stop on error.
simdutf_warn_unused result utf8_length_from_utf16be_with_replacement(const char16_t *input, size_t length) noexcept
Compute the number of bytes that this UTF-16BE string would require in UTF-8 format even when the UTF...
simdutf_warn_unused size_t convert_valid_utf8_to_utf16be(const char *input, size_t length, char16_t *utf16_buffer) noexcept
Convert valid UTF-8 string into UTF-16BE string.
simdutf_warn_unused utf8_to_utf16_result utf16_length_from_utf8_with_replacement(const char *input, size_t length) noexcept
Compute the number of char16_t that this UTF-8 string requires in UTF-16 when ill-formed subsequences...
simdutf_warn_unused size_t utf8_length_from_utf16be(const char16_t *input, size_t length) noexcept
Compute the number of bytes that this UTF-16BE string would require in UTF-8 format.
simdutf_warn_unused utf8_result validate_utf8_with_counts(const char *buf, size_t len) noexcept
Validate the UTF-8 string and stop on error, while counting the number of continuation bytes and of f...
simdutf_warn_unused result convert_utf32_to_utf16_with_errors(const char32_t *input, size_t length, char16_t *utf16_buffer) noexcept
Using native endianness, convert possibly broken UTF-32 string into UTF-16 string and stop on error.
simdutf_warn_unused size_t trim_partial_utf16(const char16_t *input, size_t length)
Given a valid UTF-16 string having a possibly truncated last character, this function checks the end ...
simdutf_warn_unused result convert_utf32_to_latin1_with_errors(const char32_t *input, size_t length, char *latin1_buffer) noexcept
Convert possibly broken UTF-32 string into Latin1 string and stop on error.
simdutf_warn_unused size_t convert_valid_utf32_to_utf16le(const char32_t *input, size_t length, char16_t *utf16_buffer) noexcept
Convert valid UTF-32 string into UTF-16LE string.
simdutf_warn_unused size_t convert_valid_utf16le_to_latin1(const char16_t *input, size_t length, char *latin1_buffer) noexcept
Convert valid UTF-16LE string into Latin1 string.
simdutf_warn_unused size_t convert_valid_utf8_to_utf16(const char *input, size_t length, char16_t *utf16_buffer) noexcept
Using native endianness, convert valid UTF-8 string into a UTF-16 string.
simdutf_warn_unused size_t count_utf16(const char16_t *input, size_t length) noexcept
Count the number of code points (characters) in the string assuming that it is valid.
simdutf_warn_unused result convert_utf32_to_utf16le_with_errors(const char32_t *input, size_t length, char16_t *utf16_buffer) noexcept
Convert possibly broken UTF-32 string into UTF-16LE string and stop on error.
simdutf_warn_unused size_t convert_latin1_to_utf8(const char *input, size_t length, char *utf8_output) noexcept
Convert Latin1 string into UTF-8 string.
simdutf_warn_unused result convert_utf16_to_utf8_with_errors(const char16_t *input, size_t length, char *utf8_buffer) noexcept
Using native endianness, convert possibly broken UTF-16 string into UTF-8 string and stop on error.
simdutf_warn_unused size_t convert_utf16le_to_utf8_with_replacement(const char16_t *input, size_t length, char *utf8_buffer) noexcept
Convert possibly broken UTF-16LE string into UTF-8 string, replacing unpaired surrogates with the Uni...
simdutf_warn_unused size_t maximal_binary_length_from_base64(const char *input, size_t length) noexcept
Provide the maximal binary length in bytes given the base64 input.
simdutf_warn_unused result convert_utf8_to_utf16_with_errors(const char *input, size_t length, char16_t *utf16_output) noexcept
Using native endianness, convert possibly broken UTF-8 string into UTF-16 string and stop on error.
simdutf_warn_unused bool validate_utf16be_as_ascii(const char16_t *buf, size_t len) noexcept
Validate the ASCII string as a UTF-16BE sequence.
simdutf_warn_unused result convert_utf8_to_utf16be_with_errors(const char *input, size_t length, char16_t *utf16_output) noexcept
Convert possibly broken UTF-8 string into UTF-16BE string and stop on error.
simdutf_really_inline simdutf_warn_unused simdutf_constexpr23 size_t latin1_length_from_utf16(size_t length) noexcept
Compute the number of bytes that this UTF-16 string would require in Latin1 format.
simdutf_warn_unused result convert_utf16le_to_latin1_with_errors(const char16_t *input, size_t length, char *latin1_buffer) noexcept
Convert possibly broken UTF-16LE string into Latin1 string.
simdutf_warn_unused result convert_utf16_to_utf32_with_errors(const char16_t *input, size_t length, char32_t *utf32_buffer) noexcept
Using native endianness, convert possibly broken UTF-16 string into UTF-32 string and stop on error.
simdutf_warn_unused result convert_utf8_to_latin1_with_errors(const char *input, size_t length, char *latin1_output) noexcept
Convert possibly broken UTF-8 string into latin1 string with errors.
simdutf_warn_unused size_t utf32_length_from_utf8(const char *input, size_t length) noexcept
Compute the number of 4-byte code units that this UTF-8 string would require in UTF-32 format.
simdutf_warn_unused result validate_utf8_with_errors(const char *buf, size_t len) noexcept
Validate the UTF-8 string and stop on error.
simdutf_warn_unused size_t latin1_length_from_utf8(const char *input, size_t length) noexcept
Compute the number of bytes that this UTF-8 string would require in Latin1 format.
simdutf_warn_unused size_t convert_utf16be_to_utf8(const char16_t *input, size_t length, char *utf8_buffer) noexcept
Convert possibly broken UTF-16BE string into UTF-8 string.
simdutf_warn_unused size_t convert_valid_utf32_to_utf16(const char32_t *input, size_t length, char16_t *utf16_buffer) noexcept
Using native endianness, convert valid UTF-32 string into a UTF-16 string.
simdutf_warn_unused size_t utf32_length_from_utf16be(const char16_t *input, size_t length) noexcept
Compute the number of bytes that this UTF-16BE string would require in UTF-32 format.
simdutf_warn_unused size_t convert_latin1_to_utf16be(const char *input, size_t length, char16_t *utf16_output) noexcept
Convert Latin1 string into UTF-16BE string.
simdutf_warn_unused size_t utf16_length_from_utf8(const char *input, size_t length) noexcept
Compute the number of 2-byte code units that this UTF-8 string would require in UTF-16LE format.
simdutf_warn_unused size_t convert_utf8_to_latin1(const char *input, size_t length, char *latin1_output) noexcept
Convert possibly broken UTF-8 string into latin1 string.
simdutf_warn_unused size_t convert_valid_utf16be_to_latin1(const char16_t *input, size_t length, char *latin1_buffer) noexcept
Convert valid UTF-16BE string into Latin1 string.
void to_well_formed_utf16le(const char16_t *input, size_t len, char16_t *output) noexcept
Fixes an ill-formed UTF-16LE string by replacing mismatched surrogates with the Unicode replacement c...
simdutf_warn_unused simdutf_really_inline simdutf_constexpr23 size_t latin1_length_from_utf32(size_t length) noexcept
Compute the number of bytes that this UTF-32 string would require in Latin1 format.
simdutf_warn_unused size_t convert_utf16_to_utf32(const char16_t *input, size_t length, char32_t *utf32_buffer) noexcept
Using native endianness, convert possibly broken UTF-16 string into UTF-32 string.
simdutf_warn_unused size_t trim_partial_utf16le(const char16_t *input, size_t length)
Given a valid UTF-16LE string having a possibly truncated last character, this function checks the en...
simdutf_warn_unused size_t count_utf16le(const char16_t *input, size_t length) noexcept
Count the number of code points (characters) in the string assuming that it is valid.
simdutf_warn_unused result validate_utf16_with_errors(const char16_t *buf, size_t len) noexcept
Using native endianness; Validate the UTF-16 string and stop on error.
simdutf_warn_unused result convert_utf8_to_utf32_with_errors(const char *input, size_t length, char32_t *utf32_output) noexcept
Convert possibly broken UTF-8 string into UTF-32 string and stop on error.
void to_well_formed_utf16be(const char16_t *input, size_t len, char16_t *output) noexcept
Fixes an ill-formed UTF-16BE string by replacing mismatched surrogates with the Unicode replacement c...
simdutf_warn_unused result validate_utf16le_with_errors(const char16_t *buf, size_t len) noexcept
Validate the UTF-16LE string and stop on error.
simdutf_warn_unused size_t convert_valid_utf16_to_utf32(const char16_t *input, size_t length, char32_t *utf32_buffer) noexcept
Using native endianness, convert valid UTF-16 string into UTF-32 string.
simdutf_warn_unused full_result convert_utf16_to_utf8_safe_with_details(const char16_t *input, size_t length, char *utf8_output, size_t utf8_len) noexcept
Convert a possibly broken UTF-16 string into a size-limited UTF-8 buffer and report how much input wa...
simdutf_warn_unused result convert_utf16_to_latin1_with_errors(const char16_t *input, size_t length, char *latin1_buffer) noexcept
Using native endianness, convert possibly broken UTF-16 string into Latin1 string.
simdutf_warn_unused size_t convert_utf16le_to_latin1(const char16_t *input, size_t length, char *latin1_buffer) noexcept
Convert possibly broken UTF-16LE string into Latin1 string.
simdutf_warn_unused size_t convert_valid_utf32_to_latin1(const char32_t *input, size_t length, char *latin1_buffer) noexcept
Convert valid UTF-32 string into Latin1 string.
simdutf_warn_unused size_t binary_length_from_base64(const char *input, size_t length) noexcept
Compute the binary length from a base64 input.
simdutf_warn_unused int detect_encodings(const char *input, size_t length) noexcept
Autodetect the possible encodings of the input in one pass.
simdutf_warn_unused size_t convert_utf8_to_utf16be_with_replacement(const char *input, size_t length, char16_t *utf16_output) noexcept
Convert a possibly ill-formed UTF-8 string into a UTF-16BE string, replacing each ill-formed subseque...
simdutf_warn_unused size_t convert_valid_utf32_to_utf8(const char32_t *input, size_t length, char *utf8_buffer) noexcept
Convert valid UTF-32 string into UTF-8 string.
size_t binary_to_base64_with_lines(const char *input, size_t length, char *output, size_t line_length=simdutf::default_line_length, base64_options options=base64_default) noexcept
Convert a binary input to a base64 output with line breaks.
simdutf_warn_unused result convert_utf16be_to_latin1_with_errors(const char16_t *input, size_t length, char *latin1_buffer) noexcept
Convert possibly broken UTF-16BE string into Latin1 string.
simdutf_warn_unused simdutf_constexpr23 size_t base64_length_from_binary_with_lines(size_t length, base64_options options=base64_default, size_t line_length=default_line_length) noexcept
Provide the base64 length in bytes given the length of a binary input, taking into account line break...
simdutf_warn_unused size_t trim_partial_utf16be(const char16_t *input, size_t length)
Given a valid UTF-16BE string having a possibly truncated last character, this function checks the en...
simdutf_warn_unused size_t convert_utf32_to_utf16(const char32_t *input, size_t length, char16_t *utf16_buffer) noexcept
Using native endianness, convert possibly broken UTF-32 string into a UTF-16 string.
simdutf_warn_unused result validate_utf32_with_errors(const char32_t *buf, size_t len) noexcept
Validate the UTF-32 string and stop on error.
simdutf_warn_unused size_t convert_valid_utf8_to_utf16le(const char *input, size_t length, char16_t *utf16_buffer) noexcept
Convert valid UTF-8 string into UTF-16LE string.
simdutf_warn_unused size_t convert_latin1_to_utf8_safe(const char *input, size_t length, char *utf8_output, size_t utf8_len) noexcept
Convert Latin1 string into UTF-8 string with output limit.
simdutf_warn_unused size_t convert_utf8_to_utf16be(const char *input, size_t length, char16_t *utf16_output) noexcept
Convert possibly broken UTF-8 string into UTF-16BE string.
simdutf_warn_unused simdutf_really_inline simdutf_constexpr23 bool base64_valid(char input, base64_options options=base64_default) noexcept
Check if a character is a valid base64 character.
simdutf_warn_unused size_t convert_utf16_to_utf8_safe(const char16_t *input, size_t length, char *utf8_output, size_t utf8_len) noexcept
Using native endianness, convert possibly broken UTF-16 string into UTF-8 string with output limit.
simdutf_warn_unused result convert_utf32_to_utf16be_with_errors(const char32_t *input, size_t length, char16_t *utf16_buffer) noexcept
Convert possibly broken UTF-32 string into UTF-16BE string and stop on error.
simdutf_warn_unused size_t convert_utf32_to_utf8(const char32_t *input, size_t length, char *utf8_buffer) noexcept
Convert possibly broken UTF-32 string into UTF-8 string.
simdutf_warn_unused size_t utf32_length_from_utf16(const char16_t *input, size_t length) noexcept
Using native endianness; Compute the number of bytes that this UTF-16 string would require in UTF-32 ...
simdutf_warn_unused size_t convert_valid_utf16be_to_utf32(const char16_t *input, size_t length, char32_t *utf32_buffer) noexcept
Convert valid UTF-16BE string into UTF-32 string.
simdutf_warn_unused size_t convert_valid_utf32_to_utf16be(const char32_t *input, size_t length, char16_t *utf16_buffer) noexcept
Convert valid UTF-32 string into UTF-16BE string.
simdutf_warn_unused result convert_utf16le_to_utf32_with_errors(const char16_t *input, size_t length, char32_t *utf32_buffer) noexcept
Convert possibly broken UTF-16LE string into UTF-32 string and stop on error.
simdutf_warn_unused result validate_ascii_with_errors(const char *buf, size_t len) noexcept
Validate the ASCII string and stop on error.
simdutf_warn_unused size_t trim_partial_utf8(const char *input, size_t length)
Given a valid UTF-8 string having a possibly truncated last character, this function checks the end o...
simdutf_warn_unused size_t convert_latin1_to_utf16le(const char *input, size_t length, char16_t *utf16_output) noexcept
Convert possibly Latin1 string into UTF-16LE string.
simdutf_warn_unused size_t convert_utf8_to_utf16(const char *input, size_t length, char16_t *utf16_output) noexcept
Using native endianness, convert possibly broken UTF-8 string into a UTF-16 string.
simdutf_warn_unused size_t convert_latin1_to_utf16(const char *input, size_t length, char16_t *utf16_output) noexcept
Using native endianness, convert a Latin1 string into a UTF-16 string.
simdutf_warn_unused bool validate_ascii(const char *buf, size_t len) noexcept
Validate the ASCII string.
simdutf_warn_unused size_t convert_utf32_to_latin1(const char32_t *input, size_t length, char *latin1_buffer) noexcept
Convert possibly broken UTF-32 string into Latin1 string.
simdutf_warn_unused size_t utf8_length_from_utf16(const char16_t *input, size_t length) noexcept
Using native endianness; Compute the number of bytes that this UTF-16 string would require in UTF-8 f...
void to_well_formed_utf16(const char16_t *input, size_t len, char16_t *output) noexcept
Fixes an ill-formed UTF-16 string by replacing mismatched surrogates with the Unicode replacement cha...
simdutf_warn_unused size_t convert_utf32_to_utf16be(const char32_t *input, size_t length, char16_t *utf16_buffer) noexcept
Convert possibly broken UTF-32 string into UTF-16BE string.
simdutf_warn_unused simdutf::encoding_type autodetect_encoding(const char *input, size_t length) noexcept
Autodetect the encoding of the input, a single encoding is recommended.
simdutf_warn_unused size_t utf16_length_from_utf32(const char32_t *input, size_t length) noexcept
Compute the number of two-byte code units that this UTF-32 string would require in UTF-16 format.