1#ifndef SIMDUTF_IMPLEMENTATION_H
2#define SIMDUTF_IMPLEMENTATION_H
3#if !defined(SIMDUTF_NO_THREADS)
8#include "simdutf/common_defs.h"
9#include "simdutf/compiler_check.h"
10#include "simdutf/encoding_types.h"
11#include "simdutf/error.h"
12#include "simdutf/internal/isadetection.h"
16 #include <type_traits>
29#define SIMDUTF_FEATURE_DETECT_ENCODING 1
30#define SIMDUTF_FEATURE_ASCII 1
31#define SIMDUTF_FEATURE_LATIN1 1
32#define SIMDUTF_FEATURE_UTF8 1
33#define SIMDUTF_FEATURE_UTF16 1
34#define SIMDUTF_FEATURE_UTF32 1
35#define SIMDUTF_FEATURE_BASE64 1
47concept byte_like = std::is_same_v<T, std::byte> ||
48 std::is_same_v<T, char> ||
49 std::is_same_v<T, signed char> ||
50 std::is_same_v<T, unsigned char>;
53concept is_byte_like = byte_like<std::remove_cvref_t<T>>;
56concept is_pointer = std::is_pointer_v<T>;
64concept input_span_of_byte_like =
requires(
const T &t) {
65 { t.size() }
noexcept -> std::convertible_to<std::size_t>;
66 { t.data() }
noexcept -> is_pointer;
67 { *t.data() }
noexcept -> is_byte_like;
71concept is_mutable = !std::is_const_v<std::remove_reference_t<T>>;
77concept output_span_of_byte_like =
requires(T &t) {
78 { t.size() }
noexcept -> std::convertible_to<std::size_t>;
79 { t.data() }
noexcept -> is_pointer;
80 { *t.data() }
noexcept -> is_byte_like;
81 { *t.data() }
noexcept -> is_mutable;
86#if SIMDUTF_FEATURE_DETECT_ENCODING
97simdutf_warn_unused simdutf::encoding_type
98autodetect_encoding(
const char *input,
size_t length)
noexcept;
99simdutf_really_inline simdutf_warn_unused simdutf::encoding_type
100autodetect_encoding(
const uint8_t *input,
size_t length)
noexcept {
101 return autodetect_encoding(
reinterpret_cast<const char *
>(input), length);
115simdutf_really_inline simdutf_warn_unused simdutf::encoding_type
117 const detail::input_span_of_byte_like
auto &input)
noexcept {
118 return autodetect_encoding(
reinterpret_cast<const char *
>(input.data()),
134simdutf_warn_unused
int detect_encodings(
const char *input,
135 size_t length)
noexcept;
136simdutf_really_inline simdutf_warn_unused
int
137detect_encodings(
const uint8_t *input,
size_t length)
noexcept {
138 return detect_encodings(
reinterpret_cast<const char *
>(input), length);
141simdutf_really_inline simdutf_warn_unused
int
142detect_encodings(
const detail::input_span_of_byte_like
auto &input)
noexcept {
143 return detect_encodings(
reinterpret_cast<const char *
>(input.data()),
149#if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
161simdutf_warn_unused
bool validate_utf8(
const char *buf,
size_t len)
noexcept;
163simdutf_really_inline simdutf_warn_unused
bool
164validate_utf8(
const detail::input_span_of_byte_like
auto &input)
noexcept {
165 return validate_utf8(
reinterpret_cast<const char *
>(input.data()),
171#if SIMDUTF_FEATURE_UTF8
184simdutf_warn_unused result validate_utf8_with_errors(
const char *buf,
185 size_t len)
noexcept;
187simdutf_really_inline simdutf_warn_unused result validate_utf8_with_errors(
188 const detail::input_span_of_byte_like
auto &input)
noexcept {
189 return validate_utf8_with_errors(
reinterpret_cast<const char *
>(input.data()),
195#if SIMDUTF_FEATURE_ASCII
205simdutf_warn_unused
bool validate_ascii(
const char *buf,
size_t len)
noexcept;
207simdutf_really_inline simdutf_warn_unused
bool
208validate_ascii(
const detail::input_span_of_byte_like
auto &input)
noexcept {
209 return validate_ascii(
reinterpret_cast<const char *
>(input.data()),
227simdutf_warn_unused result validate_ascii_with_errors(
const char *buf,
228 size_t len)
noexcept;
230simdutf_really_inline simdutf_warn_unused result validate_ascii_with_errors(
231 const detail::input_span_of_byte_like
auto &input)
noexcept {
232 return validate_ascii_with_errors(
233 reinterpret_cast<const char *
>(input.data()), input.size());
238#if SIMDUTF_FEATURE_UTF16
253simdutf_warn_unused
bool validate_utf16(
const char16_t *buf,
254 size_t len)
noexcept;
256simdutf_really_inline simdutf_warn_unused
bool
257validate_utf16(std::span<const char16_t> input)
noexcept {
258 return validate_utf16(input.data(), input.size());
263#if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
278simdutf_warn_unused
bool validate_utf16le(
const char16_t *buf,
279 size_t len)
noexcept;
281simdutf_really_inline simdutf_warn_unused
bool
282validate_utf16le(std::span<const char16_t> input)
noexcept {
283 return validate_utf16le(input.data(), input.size());
288#if SIMDUTF_FEATURE_UTF16
303simdutf_warn_unused
bool validate_utf16be(
const char16_t *buf,
304 size_t len)
noexcept;
306simdutf_really_inline simdutf_warn_unused
bool
307validate_utf16be(std::span<const char16_t> input)
noexcept {
308 return validate_utf16be(input.data(), input.size());
329simdutf_warn_unused result validate_utf16_with_errors(
const char16_t *buf,
330 size_t len)
noexcept;
332simdutf_really_inline simdutf_warn_unused result
333validate_utf16_with_errors(std::span<const char16_t> input)
noexcept {
334 return validate_utf16_with_errors(input.data(), input.size());
354simdutf_warn_unused result validate_utf16le_with_errors(
const char16_t *buf,
355 size_t len)
noexcept;
357simdutf_really_inline simdutf_warn_unused result
358validate_utf16le_with_errors(std::span<const char16_t> input)
noexcept {
359 return validate_utf16le_with_errors(input.data(), input.size());
379simdutf_warn_unused result validate_utf16be_with_errors(
const char16_t *buf,
380 size_t len)
noexcept;
382simdutf_really_inline simdutf_warn_unused result
383validate_utf16be_with_errors(std::span<const char16_t> input)
noexcept {
384 return validate_utf16be_with_errors(input.data(), input.size());
389#if SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
404simdutf_warn_unused
bool validate_utf32(
const char32_t *buf,
405 size_t len)
noexcept;
407simdutf_really_inline simdutf_warn_unused
bool
408validate_utf32(std::span<const char32_t> input)
noexcept {
409 return validate_utf32(input.data(), input.size());
414#if SIMDUTF_FEATURE_UTF32
431simdutf_warn_unused result validate_utf32_with_errors(
const char32_t *buf,
432 size_t len)
noexcept;
434simdutf_really_inline simdutf_warn_unused result
435validate_utf32_with_errors(std::span<const char32_t> input)
noexcept {
436 return validate_utf32_with_errors(input.data(), input.size());
441#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
452simdutf_warn_unused
size_t convert_latin1_to_utf8(
const char *input,
454 char *utf8_output)
noexcept;
456simdutf_really_inline simdutf_warn_unused
size_t convert_latin1_to_utf8(
457 const detail::input_span_of_byte_like
auto &latin1_input,
458 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
459 return convert_latin1_to_utf8(
460 reinterpret_cast<const char *
>(latin1_input.data()), latin1_input.size(),
476simdutf_warn_unused
size_t
477convert_latin1_to_utf8_safe(
const char *input,
size_t length,
char *utf8_output,
478 size_t utf8_len)
noexcept;
480simdutf_really_inline simdutf_warn_unused
size_t convert_latin1_to_utf8_safe(
481 const detail::input_span_of_byte_like
auto &input,
482 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
489 return convert_latin1_to_utf8_safe(
490 input.data(), input.size(),
reinterpret_cast<char *
>(utf8_output.data()),
496#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
507simdutf_warn_unused
size_t convert_latin1_to_utf16le(
508 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
510simdutf_really_inline simdutf_warn_unused
size_t convert_latin1_to_utf16le(
511 const detail::input_span_of_byte_like
auto &latin1_input,
512 std::span<char16_t> utf16_output)
noexcept {
513 return convert_latin1_to_utf16le(
514 reinterpret_cast<const char *
>(latin1_input.data()), latin1_input.size(),
515 utf16_output.data());
529simdutf_warn_unused
size_t convert_latin1_to_utf16be(
530 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
532simdutf_really_inline simdutf_warn_unused
size_t
533convert_latin1_to_utf16be(
const detail::input_span_of_byte_like
auto &input,
534 std::span<char16_t> output)
noexcept {
535 return convert_latin1_to_utf16be(
reinterpret_cast<const char *
>(input.data()),
536 input.size(), output.data());
547simdutf_warn_unused size_t latin1_length_from_utf16(size_t length) noexcept;
557simdutf_warn_unused
size_t utf16_length_from_latin1(
size_t length)
noexcept;
560#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
571simdutf_warn_unused
size_t convert_latin1_to_utf32(
572 const char *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
574simdutf_really_inline simdutf_warn_unused
size_t convert_latin1_to_utf32(
575 const detail::input_span_of_byte_like
auto &latin1_input,
576 std::span<char32_t> utf32_output)
noexcept {
577 return convert_latin1_to_utf32(
578 reinterpret_cast<const char *
>(latin1_input.data()), latin1_input.size(),
579 utf32_output.data());
584#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
597simdutf_warn_unused
size_t convert_utf8_to_latin1(
const char *input,
599 char *latin1_output)
noexcept;
601simdutf_really_inline simdutf_warn_unused
size_t convert_utf8_to_latin1(
602 const detail::input_span_of_byte_like
auto &input,
603 detail::output_span_of_byte_like
auto &&output)
noexcept {
604 return convert_utf8_to_latin1(
reinterpret_cast<const char *
>(input.data()),
606 reinterpret_cast<char *
>(output.data()));
611#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
625simdutf_warn_unused
size_t convert_utf8_to_utf16(
626 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
628simdutf_really_inline simdutf_warn_unused
size_t
629convert_utf8_to_utf16(
const detail::input_span_of_byte_like
auto &input,
630 std::span<char16_t> output)
noexcept {
631 return convert_utf8_to_utf16(
reinterpret_cast<const char *
>(input.data()),
632 input.size(), output.data());
637#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
646simdutf_warn_unused
size_t convert_latin1_to_utf16(
647 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
649simdutf_really_inline simdutf_warn_unused
size_t
650convert_latin1_to_utf16(
const detail::input_span_of_byte_like
auto &input,
651 std::span<char16_t> output)
noexcept {
652 return convert_latin1_to_utf16(
reinterpret_cast<const char *
>(input.data()),
653 input.size(), output.data());
658#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
671simdutf_warn_unused
size_t convert_utf8_to_utf16le(
672 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
674simdutf_really_inline simdutf_warn_unused
size_t
675convert_utf8_to_utf16le(
const detail::input_span_of_byte_like
auto &utf8_input,
676 std::span<char16_t> utf16_output)
noexcept {
677 return convert_utf8_to_utf16le(
678 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
679 utf16_output.data());
695simdutf_warn_unused
size_t convert_utf8_to_utf16be(
696 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
698simdutf_really_inline simdutf_warn_unused
size_t
699convert_utf8_to_utf16be(
const detail::input_span_of_byte_like
auto &utf8_input,
700 std::span<char16_t> utf16_output)
noexcept {
701 return convert_utf8_to_utf16be(
702 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
703 utf16_output.data());
708#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
725simdutf_warn_unused result convert_utf8_to_latin1_with_errors(
726 const char *input,
size_t length,
char *latin1_output)
noexcept;
728simdutf_really_inline simdutf_warn_unused result
729convert_utf8_to_latin1_with_errors(
730 const detail::input_span_of_byte_like
auto &utf8_input,
731 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
732 return convert_utf8_to_latin1_with_errors(
733 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
734 reinterpret_cast<char *
>(latin1_output.data()));
739#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
755simdutf_warn_unused result convert_utf8_to_utf16_with_errors(
756 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
758simdutf_really_inline simdutf_warn_unused result
759convert_utf8_to_utf16_with_errors(
760 const detail::input_span_of_byte_like
auto &utf8_input,
761 std::span<char16_t> utf16_output)
noexcept {
762 return convert_utf8_to_utf16_with_errors(
763 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
764 utf16_output.data());
782simdutf_warn_unused result convert_utf8_to_utf16le_with_errors(
783 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
785simdutf_really_inline simdutf_warn_unused result
786convert_utf8_to_utf16le_with_errors(
787 const detail::input_span_of_byte_like
auto &utf8_input,
788 std::span<char16_t> utf16_output)
noexcept {
789 return convert_utf8_to_utf16le_with_errors(
790 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
791 utf16_output.data());
809simdutf_warn_unused result convert_utf8_to_utf16be_with_errors(
810 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
812simdutf_really_inline simdutf_warn_unused result
813convert_utf8_to_utf16be_with_errors(
814 const detail::input_span_of_byte_like
auto &utf8_input,
815 std::span<char16_t> utf16_output)
noexcept {
816 return convert_utf8_to_utf16be_with_errors(
817 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
818 utf16_output.data());
823#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
836simdutf_warn_unused
size_t convert_utf8_to_utf32(
837 const char *input,
size_t length,
char32_t *utf32_output)
noexcept;
839simdutf_really_inline simdutf_warn_unused
size_t
840convert_utf8_to_utf32(
const detail::input_span_of_byte_like
auto &utf8_input,
841 std::span<char32_t> utf32_output)
noexcept {
842 return convert_utf8_to_utf32(
843 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
844 utf32_output.data());
862simdutf_warn_unused result convert_utf8_to_utf32_with_errors(
863 const char *input,
size_t length,
char32_t *utf32_output)
noexcept;
865simdutf_really_inline simdutf_warn_unused result
866convert_utf8_to_utf32_with_errors(
867 const detail::input_span_of_byte_like
auto &utf8_input,
868 std::span<char32_t> utf32_output)
noexcept {
869 return convert_utf8_to_utf32_with_errors(
870 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
871 utf32_output.data());
876#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
896simdutf_warn_unused
size_t convert_valid_utf8_to_latin1(
897 const char *input,
size_t length,
char *latin1_output)
noexcept;
899simdutf_really_inline simdutf_warn_unused
size_t convert_valid_utf8_to_latin1(
900 const detail::input_span_of_byte_like
auto &valid_utf8_input,
901 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
902 return convert_valid_utf8_to_latin1(
903 reinterpret_cast<const char *
>(valid_utf8_input.data()),
904 valid_utf8_input.size(), latin1_output.data());
909#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
920simdutf_warn_unused
size_t convert_valid_utf8_to_utf16(
921 const char *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
923simdutf_really_inline simdutf_warn_unused
size_t convert_valid_utf8_to_utf16(
924 const detail::input_span_of_byte_like
auto &valid_utf8_input,
925 std::span<char16_t> utf16_output)
noexcept {
926 return convert_valid_utf8_to_utf16(
927 reinterpret_cast<const char *
>(valid_utf8_input.data()),
928 valid_utf8_input.size(), utf16_output.data());
942simdutf_warn_unused
size_t convert_valid_utf8_to_utf16le(
943 const char *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
945simdutf_really_inline simdutf_warn_unused
size_t convert_valid_utf8_to_utf16le(
946 const detail::input_span_of_byte_like
auto &valid_utf8_input,
947 std::span<char16_t> utf16_output)
noexcept {
948 return convert_valid_utf8_to_utf16le(
949 reinterpret_cast<const char *
>(valid_utf8_input.data()),
950 valid_utf8_input.size(), utf16_output.data());
964simdutf_warn_unused
size_t convert_valid_utf8_to_utf16be(
965 const char *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
967simdutf_really_inline simdutf_warn_unused
size_t convert_valid_utf8_to_utf16be(
968 const detail::input_span_of_byte_like
auto &valid_utf8_input,
969 std::span<char16_t> utf16_output)
noexcept {
970 return convert_valid_utf8_to_utf16be(
971 reinterpret_cast<const char *
>(valid_utf8_input.data()),
972 valid_utf8_input.size(), utf16_output.data());
977#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
988simdutf_warn_unused
size_t convert_valid_utf8_to_utf32(
989 const char *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
991simdutf_really_inline simdutf_warn_unused
size_t convert_valid_utf8_to_utf32(
992 const detail::input_span_of_byte_like
auto &valid_utf8_input,
993 std::span<char32_t> utf32_output)
noexcept {
994 return convert_valid_utf8_to_utf32(
995 reinterpret_cast<const char *
>(valid_utf8_input.data()),
996 valid_utf8_input.size(), utf32_output.data());
1001#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1010simdutf_warn_unused
size_t utf8_length_from_latin1(
const char *input,
1011 size_t length)
noexcept;
1013simdutf_really_inline simdutf_warn_unused
size_t utf8_length_from_latin1(
1014 const detail::input_span_of_byte_like
auto &latin1_input)
noexcept {
1015 return utf8_length_from_latin1(
1016 reinterpret_cast<const char *
>(latin1_input.data()), latin1_input.size());
1033simdutf_warn_unused
size_t latin1_length_from_utf8(
const char *input,
1034 size_t length)
noexcept;
1036simdutf_really_inline simdutf_warn_unused
size_t latin1_length_from_utf8(
1037 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
1038 return latin1_length_from_utf8(
1039 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1040 valid_utf8_input.size());
1045#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1060simdutf_warn_unused
size_t utf16_length_from_utf8(
const char *input,
1061 size_t length)
noexcept;
1063simdutf_really_inline simdutf_warn_unused
size_t utf16_length_from_utf8(
1064 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
1065 return utf16_length_from_utf8(
1066 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1067 valid_utf8_input.size());
1072#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1089simdutf_warn_unused
size_t utf32_length_from_utf8(
const char *input,
1090 size_t length)
noexcept;
1092simdutf_really_inline simdutf_warn_unused
size_t utf32_length_from_utf8(
1093 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
1094 return utf32_length_from_utf8(
1095 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1096 valid_utf8_input.size());
1101#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1117simdutf_warn_unused
size_t convert_utf16_to_utf8(
const char16_t *input,
1119 char *utf8_buffer)
noexcept;
1121simdutf_really_inline simdutf_warn_unused
size_t convert_utf16_to_utf8(
1122 std::span<char16_t> utf16_input,
1123 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1124 return convert_utf16_to_utf8(utf16_input.data(), utf16_input.size(),
1125 reinterpret_cast<char *
>(utf8_output.data()));
1130#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
1146simdutf_warn_unused
size_t convert_utf16_to_latin1(
1147 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
1149simdutf_really_inline simdutf_warn_unused
size_t convert_utf16_to_latin1(
1150 std::span<char16_t> utf16_input,
1151 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1152 return convert_utf16_to_latin1(
1153 utf16_input.data(), utf16_input.size(),
1154 reinterpret_cast<char *
>(latin1_output.data()));
1174simdutf_warn_unused
size_t convert_utf16le_to_latin1(
1175 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
1177simdutf_really_inline simdutf_warn_unused
size_t convert_utf16le_to_latin1(
1178 std::span<char16_t> utf16_input,
1179 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1180 return convert_utf16le_to_latin1(
1181 utf16_input.data(), utf16_input.size(),
1182 reinterpret_cast<char *
>(latin1_output.data()));
1200simdutf_warn_unused
size_t convert_utf16be_to_latin1(
1201 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
1203simdutf_really_inline simdutf_warn_unused
size_t convert_utf16be_to_latin1(
1204 std::span<char16_t> utf16_input,
1205 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1206 return convert_utf16be_to_latin1(
1207 utf16_input.data(), utf16_input.size(),
1208 reinterpret_cast<char *
>(latin1_output.data()));
1213#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1228simdutf_warn_unused
size_t convert_utf16le_to_utf8(
const char16_t *input,
1230 char *utf8_buffer)
noexcept;
1232simdutf_really_inline simdutf_warn_unused
size_t convert_utf16le_to_utf8(
1233 std::span<char16_t> utf16_input,
1234 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1235 return convert_utf16le_to_utf8(utf16_input.data(), utf16_input.size(),
1236 reinterpret_cast<char *
>(utf8_output.data()));
1254simdutf_warn_unused
size_t convert_utf16be_to_utf8(
const char16_t *input,
1256 char *utf8_buffer)
noexcept;
1258simdutf_really_inline simdutf_warn_unused
size_t convert_utf16be_to_utf8(
1259 std::span<char16_t> utf16_input,
1260 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1261 return convert_utf16be_to_utf8(utf16_input.data(), utf16_input.size(),
1262 reinterpret_cast<char *
>(utf8_output.data()));
1267#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
1284simdutf_warn_unused result convert_utf16_to_latin1_with_errors(
1285 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
1287simdutf_really_inline simdutf_warn_unused result
1288convert_utf16_to_latin1_with_errors(
1289 std::span<char16_t> utf16_input,
1290 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1291 return convert_utf16_to_latin1_with_errors(
1292 utf16_input.data(), utf16_input.size(),
1293 reinterpret_cast<char *
>(latin1_output.data()));
1312simdutf_warn_unused result convert_utf16le_to_latin1_with_errors(
1313 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
1315simdutf_really_inline simdutf_warn_unused result
1316convert_utf16le_to_latin1_with_errors(
1317 std::span<char16_t> utf16_input,
1318 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1319 return convert_utf16le_to_latin1_with_errors(
1320 utf16_input.data(), utf16_input.size(),
1321 reinterpret_cast<char *
>(latin1_output.data()));
1342simdutf_warn_unused result convert_utf16be_to_latin1_with_errors(
1343 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
1345simdutf_really_inline simdutf_warn_unused result
1346convert_utf16be_to_latin1_with_errors(
1347 std::span<char16_t> utf16_input,
1348 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1349 return convert_utf16be_to_latin1_with_errors(
1350 utf16_input.data(), utf16_input.size(),
1351 reinterpret_cast<char *
>(latin1_output.data()));
1356#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1374simdutf_warn_unused result convert_utf16_to_utf8_with_errors(
1375 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
1377simdutf_really_inline simdutf_warn_unused result
1378convert_utf16_to_utf8_with_errors(
1379 std::span<char16_t> utf16_input,
1380 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1381 return convert_utf16_to_utf8_with_errors(
1382 utf16_input.data(), utf16_input.size(),
1383 reinterpret_cast<char *
>(utf8_output.data()));
1403simdutf_warn_unused result convert_utf16le_to_utf8_with_errors(
1404 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
1406simdutf_really_inline simdutf_warn_unused result
1407convert_utf16le_to_utf8_with_errors(
1408 std::span<char16_t> utf16_input,
1409 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1410 return convert_utf16le_to_utf8_with_errors(
1411 utf16_input.data(), utf16_input.size(),
1412 reinterpret_cast<char *
>(utf8_output.data()));
1432simdutf_warn_unused result convert_utf16be_to_utf8_with_errors(
1433 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
1435simdutf_really_inline simdutf_warn_unused result
1436convert_utf16be_to_utf8_with_errors(
1437 std::span<char16_t> utf16_input,
1438 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1439 return convert_utf16be_to_utf8_with_errors(
1440 utf16_input.data(), utf16_input.size(),
1441 reinterpret_cast<char *
>(utf8_output.data()));
1458simdutf_warn_unused
size_t convert_valid_utf16_to_utf8(
1459 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
1461simdutf_really_inline simdutf_warn_unused
size_t convert_valid_utf16_to_utf8(
1462 std::span<char16_t> valid_utf16_input,
1463 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1464 return convert_valid_utf16_to_utf8(
1465 valid_utf16_input.data(), valid_utf16_input.size(),
1466 reinterpret_cast<char *
>(utf8_output.data()));
1471#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
1491simdutf_warn_unused
size_t convert_valid_utf16_to_latin1(
1492 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
1494simdutf_really_inline simdutf_warn_unused
size_t convert_valid_utf16_to_latin1(
1495 std::span<char16_t> valid_utf16_input,
1496 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1497 return convert_valid_utf16_to_latin1(
1498 valid_utf16_input.data(), valid_utf16_input.size(),
1499 reinterpret_cast<char *
>(latin1_output.data()));
1522simdutf_warn_unused
size_t convert_valid_utf16le_to_latin1(
1523 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
1525simdutf_really_inline simdutf_warn_unused
size_t
1526convert_valid_utf16le_to_latin1(
1527 std::span<char16_t> valid_utf16_input,
1528 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1529 return convert_valid_utf16le_to_latin1(
1530 valid_utf16_input.data(), valid_utf16_input.size(),
1531 reinterpret_cast<char *
>(latin1_output.data()));
1554simdutf_warn_unused
size_t convert_valid_utf16be_to_latin1(
1555 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
1557simdutf_really_inline simdutf_warn_unused
size_t
1558convert_valid_utf16be_to_latin1(
1559 std::span<char16_t> valid_utf16_input,
1560 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1561 return convert_valid_utf16be_to_latin1(
1562 valid_utf16_input.data(), valid_utf16_input.size(),
1563 reinterpret_cast<char *
>(latin1_output.data()));
1568#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1583simdutf_warn_unused
size_t convert_valid_utf16le_to_utf8(
1584 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
1586simdutf_really_inline simdutf_warn_unused
size_t convert_valid_utf16le_to_utf8(
1587 std::span<char16_t> valid_utf16_input,
1588 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1589 return convert_valid_utf16le_to_utf8(
1590 valid_utf16_input.data(), valid_utf16_input.size(),
1591 reinterpret_cast<char *
>(utf8_output.data()));
1608simdutf_warn_unused
size_t convert_valid_utf16be_to_utf8(
1609 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
1611simdutf_really_inline simdutf_warn_unused
size_t convert_valid_utf16be_to_utf8(
1612 std::span<char16_t> valid_utf16_input,
1613 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1614 return convert_valid_utf16be_to_utf8(
1615 valid_utf16_input.data(), valid_utf16_input.size(),
1616 reinterpret_cast<char *
>(utf8_output.data()));
1621#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
1637simdutf_warn_unused
size_t convert_utf16_to_utf32(
1638 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
1640simdutf_really_inline simdutf_warn_unused
size_t
1641convert_utf16_to_utf32(std::span<const char16_t> utf16_input,
1642 std::span<char32_t> utf32_output)
noexcept {
1643 return convert_utf16_to_utf32(utf16_input.data(), utf16_input.size(),
1644 utf32_output.data());
1662simdutf_warn_unused
size_t convert_utf16le_to_utf32(
1663 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
1665simdutf_really_inline simdutf_warn_unused
size_t
1666convert_utf16le_to_utf32(std::span<const char16_t> utf16_input,
1667 std::span<char32_t> utf32_output)
noexcept {
1668 return convert_utf16le_to_utf32(utf16_input.data(), utf16_input.size(),
1669 utf32_output.data());
1687simdutf_warn_unused
size_t convert_utf16be_to_utf32(
1688 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
1690simdutf_really_inline simdutf_warn_unused
size_t
1691convert_utf16be_to_utf32(std::span<const char16_t> utf16_input,
1692 std::span<char32_t> utf32_output)
noexcept {
1693 return convert_utf16be_to_utf32(utf16_input.data(), utf16_input.size(),
1694 utf32_output.data());
1715simdutf_warn_unused result convert_utf16_to_utf32_with_errors(
1716 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
1718simdutf_really_inline simdutf_warn_unused result
1719convert_utf16_to_utf32_with_errors(std::span<const char16_t> utf16_input,
1720 std::span<char32_t> utf32_output)
noexcept {
1721 return convert_utf16_to_utf32_with_errors(
1722 utf16_input.data(), utf16_input.size(), utf32_output.data());
1742simdutf_warn_unused result convert_utf16le_to_utf32_with_errors(
1743 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
1745simdutf_really_inline simdutf_warn_unused result
1746convert_utf16le_to_utf32_with_errors(
1747 std::span<const char16_t> utf16_input,
1748 std::span<char32_t> utf32_output)
noexcept {
1749 return convert_utf16le_to_utf32_with_errors(
1750 utf16_input.data(), utf16_input.size(), utf32_output.data());
1770simdutf_warn_unused result convert_utf16be_to_utf32_with_errors(
1771 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
1773simdutf_really_inline simdutf_warn_unused result
1774convert_utf16be_to_utf32_with_errors(
1775 std::span<const char16_t> utf16_input,
1776 std::span<char32_t> utf32_output)
noexcept {
1777 return convert_utf16be_to_utf32_with_errors(
1778 utf16_input.data(), utf16_input.size(), utf32_output.data());
1796simdutf_warn_unused
size_t convert_valid_utf16_to_utf32(
1797 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
1799simdutf_really_inline simdutf_warn_unused
size_t
1800convert_valid_utf16_to_utf32(std::span<const char16_t> valid_utf16_input,
1801 std::span<char32_t> utf32_output)
noexcept {
1802 return convert_valid_utf16_to_utf32(
1803 valid_utf16_input.data(), valid_utf16_input.size(), utf32_output.data());
1820simdutf_warn_unused
size_t convert_valid_utf16le_to_utf32(
1821 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
1823simdutf_really_inline simdutf_warn_unused
size_t
1824convert_valid_utf16le_to_utf32(std::span<const char16_t> valid_utf16_input,
1825 std::span<char32_t> utf32_output)
noexcept {
1826 return convert_valid_utf16le_to_utf32(
1827 valid_utf16_input.data(), valid_utf16_input.size(), utf32_output.data());
1844simdutf_warn_unused
size_t convert_valid_utf16be_to_utf32(
1845 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
1847simdutf_really_inline simdutf_warn_unused
size_t
1848convert_valid_utf16be_to_utf32(std::span<const char16_t> valid_utf16_input,
1849 std::span<char32_t> utf32_output)
noexcept {
1850 return convert_valid_utf16be_to_utf32(
1851 valid_utf16_input.data(), valid_utf16_input.size(), utf32_output.data());
1856#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
1869simdutf_warn_unused
size_t latin1_length_from_utf16(
size_t length)
noexcept;
1882simdutf_warn_unused
size_t utf8_length_from_utf16(
const char16_t *input,
1883 size_t length)
noexcept;
1885simdutf_really_inline simdutf_warn_unused
size_t
1886utf8_length_from_utf16(std::span<const char16_t> valid_utf16_input)
noexcept {
1887 return utf8_length_from_utf16(valid_utf16_input.data(),
1888 valid_utf16_input.size());
1893#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1905simdutf_warn_unused
size_t utf8_length_from_utf16le(
const char16_t *input,
1906 size_t length)
noexcept;
1908simdutf_really_inline simdutf_warn_unused
size_t
1909utf8_length_from_utf16le(std::span<const char16_t> valid_utf16_input)
noexcept {
1910 return utf8_length_from_utf16le(valid_utf16_input.data(),
1911 valid_utf16_input.size());
1926simdutf_warn_unused
size_t utf8_length_from_utf16be(
const char16_t *input,
1927 size_t length)
noexcept;
1929simdutf_really_inline simdutf_warn_unused
size_t
1930utf8_length_from_utf16be(std::span<const char16_t> valid_utf16_input)
noexcept {
1931 return utf8_length_from_utf16be(valid_utf16_input.data(),
1932 valid_utf16_input.size());
1937#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1951simdutf_warn_unused
size_t convert_utf32_to_utf8(
const char32_t *input,
1953 char *utf8_buffer)
noexcept;
1955simdutf_really_inline simdutf_warn_unused
size_t convert_utf32_to_utf8(
1956 std::span<const char32_t> utf32_input,
1957 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1958 return convert_utf32_to_utf8(utf32_input.data(), utf32_input.size(),
1959 reinterpret_cast<char *
>(utf8_output.data()));
1979simdutf_warn_unused result convert_utf32_to_utf8_with_errors(
1980 const char32_t *input,
size_t length,
char *utf8_buffer)
noexcept;
1982simdutf_really_inline simdutf_warn_unused result
1983convert_utf32_to_utf8_with_errors(
1984 std::span<const char32_t> utf32_input,
1985 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1986 return convert_utf32_to_utf8_with_errors(
1987 utf32_input.data(), utf32_input.size(),
1988 reinterpret_cast<char *
>(utf8_output.data()));
2005simdutf_warn_unused
size_t convert_valid_utf32_to_utf8(
2006 const char32_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2008simdutf_really_inline simdutf_warn_unused
size_t convert_valid_utf32_to_utf8(
2009 std::span<const char32_t> valid_utf32_input,
2010 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2011 return convert_valid_utf32_to_utf8(
2012 valid_utf32_input.data(), valid_utf32_input.size(),
2013 reinterpret_cast<char *
>(utf8_output.data()));
2018#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
2033simdutf_warn_unused
size_t convert_utf32_to_utf16(
2034 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
2036simdutf_really_inline simdutf_warn_unused
size_t
2037convert_utf32_to_utf16(std::span<const char32_t> utf32_input,
2038 std::span<char16_t> utf16_output)
noexcept {
2039 return convert_utf32_to_utf16(utf32_input.data(), utf32_input.size(),
2040 utf16_output.data());
2057simdutf_warn_unused
size_t convert_utf32_to_utf16le(
2058 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
2060simdutf_really_inline simdutf_warn_unused
size_t
2061convert_utf32_to_utf16le(std::span<const char32_t> utf32_input,
2062 std::span<char16_t> utf16_output)
noexcept {
2063 return convert_utf32_to_utf16le(utf32_input.data(), utf32_input.size(),
2064 utf16_output.data());
2069#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
2084simdutf_warn_unused
size_t convert_utf32_to_latin1(
2085 const char32_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2087simdutf_really_inline simdutf_warn_unused
size_t convert_utf32_to_latin1(
2088 std::span<char32_t> utf32_input,
2089 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2090 return convert_utf32_to_latin1(
2091 utf32_input.data(), utf32_input.size(),
2092 reinterpret_cast<char *
>(latin1_output.data()));
2113simdutf_warn_unused result convert_utf32_to_latin1_with_errors(
2114 const char32_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2116simdutf_really_inline simdutf_warn_unused result
2117convert_utf32_to_latin1_with_errors(
2118 std::span<char32_t> utf32_input,
2119 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2120 return convert_utf32_to_latin1_with_errors(
2121 utf32_input.data(), utf32_input.size(),
2122 reinterpret_cast<char *
>(latin1_output.data()));
2146simdutf_warn_unused
size_t convert_valid_utf32_to_latin1(
2147 const char32_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2149simdutf_really_inline simdutf_warn_unused
size_t convert_valid_utf32_to_latin1(
2150 std::span<char32_t> valid_utf32_input,
2151 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2152 return convert_valid_utf32_to_latin1(
2153 valid_utf32_input.data(), valid_utf32_input.size(),
2154 reinterpret_cast<char *
>(latin1_output.data()));
2170simdutf_warn_unused
size_t latin1_length_from_utf32(
size_t length)
noexcept;
2180simdutf_warn_unused
size_t utf32_length_from_latin1(
size_t length)
noexcept;
2183#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
2197simdutf_warn_unused
size_t convert_utf32_to_utf16be(
2198 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
2200simdutf_really_inline simdutf_warn_unused
size_t
2201convert_utf32_to_utf16be(std::span<const char32_t> utf32_input,
2202 std::span<char16_t> utf16_output)
noexcept {
2203 return convert_utf32_to_utf16be(utf32_input.data(), utf32_input.size(),
2204 utf16_output.data());
2225simdutf_warn_unused result convert_utf32_to_utf16_with_errors(
2226 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
2228simdutf_really_inline simdutf_warn_unused result
2229convert_utf32_to_utf16_with_errors(std::span<const char32_t> utf32_input,
2230 std::span<char16_t> utf16_output)
noexcept {
2231 return convert_utf32_to_utf16_with_errors(
2232 utf32_input.data(), utf32_input.size(), utf16_output.data());
2252simdutf_warn_unused result convert_utf32_to_utf16le_with_errors(
2253 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
2255simdutf_really_inline simdutf_warn_unused result
2256convert_utf32_to_utf16le_with_errors(
2257 std::span<const char32_t> utf32_input,
2258 std::span<char16_t> utf16_output)
noexcept {
2259 return convert_utf32_to_utf16le_with_errors(
2260 utf32_input.data(), utf32_input.size(), utf16_output.data());
2280simdutf_warn_unused result convert_utf32_to_utf16be_with_errors(
2281 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
2283simdutf_really_inline simdutf_warn_unused result
2284convert_utf32_to_utf16be_with_errors(
2285 std::span<const char32_t> utf32_input,
2286 std::span<char16_t> utf16_output)
noexcept {
2287 return convert_utf32_to_utf16be_with_errors(
2288 utf32_input.data(), utf32_input.size(), utf16_output.data());
2305simdutf_warn_unused
size_t convert_valid_utf32_to_utf16(
2306 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
2308simdutf_really_inline simdutf_warn_unused
size_t
2309convert_valid_utf32_to_utf16(std::span<const char32_t> valid_utf32_input,
2310 std::span<char16_t> utf16_output)
noexcept {
2311 return convert_valid_utf32_to_utf16(
2312 valid_utf32_input.data(), valid_utf32_input.size(), utf16_output.data());
2329simdutf_warn_unused
size_t convert_valid_utf32_to_utf16le(
2330 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
2332simdutf_really_inline simdutf_warn_unused
size_t
2333convert_valid_utf32_to_utf16le(std::span<const char32_t> valid_utf32_input,
2334 std::span<char16_t> utf16_output)
noexcept {
2335 return convert_valid_utf32_to_utf16le(
2336 valid_utf32_input.data(), valid_utf32_input.size(), utf16_output.data());
2353simdutf_warn_unused
size_t convert_valid_utf32_to_utf16be(
2354 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
2356simdutf_really_inline simdutf_warn_unused
size_t
2357convert_valid_utf32_to_utf16be(std::span<const char32_t> valid_utf32_input,
2358 std::span<char16_t> utf16_output)
noexcept {
2359 return convert_valid_utf32_to_utf16be(
2360 valid_utf32_input.data(), valid_utf32_input.size(), utf16_output.data());
2365#if SIMDUTF_FEATURE_UTF16
2379void change_endianness_utf16(
const char16_t *input,
size_t length,
2380 char16_t *output)
noexcept;
2382simdutf_really_inline
void
2383change_endianness_utf16(std::span<const char16_t> utf16_input,
2384 std::span<char16_t> utf16_output)
noexcept {
2385 return change_endianness_utf16(utf16_input.data(), utf16_input.size(),
2386 utf16_output.data());
2391#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
2403simdutf_warn_unused
size_t utf8_length_from_utf32(
const char32_t *input,
2404 size_t length)
noexcept;
2406simdutf_really_inline simdutf_warn_unused
size_t
2407utf8_length_from_utf32(std::span<const char32_t> valid_utf32_input)
noexcept {
2408 return utf8_length_from_utf32(valid_utf32_input.data(),
2409 valid_utf32_input.size());
2414#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
2426simdutf_warn_unused
size_t utf16_length_from_utf32(
const char32_t *input,
2427 size_t length)
noexcept;
2429simdutf_really_inline simdutf_warn_unused
size_t
2430utf16_length_from_utf32(std::span<const char32_t> valid_utf32_input)
noexcept {
2431 return utf16_length_from_utf32(valid_utf32_input.data(),
2432 valid_utf32_input.size());
2451simdutf_warn_unused
size_t utf32_length_from_utf16(
const char16_t *input,
2452 size_t length)
noexcept;
2454simdutf_really_inline simdutf_warn_unused
size_t
2455utf32_length_from_utf16(std::span<const char16_t> valid_utf16_input)
noexcept {
2456 return utf32_length_from_utf16(valid_utf16_input.data(),
2457 valid_utf16_input.size());
2476simdutf_warn_unused
size_t utf32_length_from_utf16le(
const char16_t *input,
2477 size_t length)
noexcept;
2479simdutf_really_inline simdutf_warn_unused
size_t utf32_length_from_utf16le(
2480 std::span<const char16_t> valid_utf16_input)
noexcept {
2481 return utf32_length_from_utf16le(valid_utf16_input.data(),
2482 valid_utf16_input.size());
2501simdutf_warn_unused
size_t utf32_length_from_utf16be(
const char16_t *input,
2502 size_t length)
noexcept;
2504simdutf_really_inline simdutf_warn_unused
size_t utf32_length_from_utf16be(
2505 std::span<const char16_t> valid_utf16_input)
noexcept {
2506 return utf32_length_from_utf16be(valid_utf16_input.data(),
2507 valid_utf16_input.size());
2512#if SIMDUTF_FEATURE_UTF16
2527simdutf_warn_unused
size_t count_utf16(
const char16_t *input,
2528 size_t length)
noexcept;
2530simdutf_really_inline simdutf_warn_unused
size_t
2531count_utf16(std::span<const char16_t> valid_utf16_input)
noexcept {
2532 return count_utf16(valid_utf16_input.data(), valid_utf16_input.size());
2550simdutf_warn_unused
size_t count_utf16le(
const char16_t *input,
2551 size_t length)
noexcept;
2553simdutf_really_inline simdutf_warn_unused
size_t
2554count_utf16le(std::span<const char16_t> valid_utf16_input)
noexcept {
2555 return count_utf16le(valid_utf16_input.data(), valid_utf16_input.size());
2573simdutf_warn_unused
size_t count_utf16be(
const char16_t *input,
2574 size_t length)
noexcept;
2576simdutf_really_inline simdutf_warn_unused
size_t
2577count_utf16be(std::span<const char16_t> valid_utf16_input)
noexcept {
2578 return count_utf16be(valid_utf16_input.data(), valid_utf16_input.size());
2583#if SIMDUTF_FEATURE_UTF8
2596simdutf_warn_unused
size_t count_utf8(
const char *input,
2597 size_t length)
noexcept;
2599simdutf_really_inline simdutf_warn_unused
size_t count_utf8(
2600 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
2601 return count_utf8(
reinterpret_cast<const char *
>(valid_utf8_input.data()),
2602 valid_utf8_input.size());
2620simdutf_warn_unused
size_t trim_partial_utf8(
const char *input,
size_t length);
2622simdutf_really_inline simdutf_warn_unused
size_t trim_partial_utf8(
2623 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
2624 return trim_partial_utf8(
2625 reinterpret_cast<const char *
>(valid_utf8_input.data()),
2626 valid_utf8_input.size());
2631#if SIMDUTF_FEATURE_UTF16
2646simdutf_warn_unused
size_t trim_partial_utf16be(
const char16_t *input,
2649simdutf_really_inline simdutf_warn_unused
size_t
2650trim_partial_utf16be(std::span<const char16_t> valid_utf16_input)
noexcept {
2651 return trim_partial_utf16be(valid_utf16_input.data(),
2652 valid_utf16_input.size());
2670simdutf_warn_unused
size_t trim_partial_utf16le(
const char16_t *input,
2673simdutf_really_inline simdutf_warn_unused
size_t
2674trim_partial_utf16le(std::span<const char16_t> valid_utf16_input)
noexcept {
2675 return trim_partial_utf16le(valid_utf16_input.data(),
2676 valid_utf16_input.size());
2694simdutf_warn_unused
size_t trim_partial_utf16(
const char16_t *input,
2697simdutf_really_inline simdutf_warn_unused
size_t
2698trim_partial_utf16(std::span<const char16_t> valid_utf16_input)
noexcept {
2699 return trim_partial_utf16(valid_utf16_input.data(), valid_utf16_input.size());
2704#if SIMDUTF_FEATURE_BASE64
2705 #ifndef SIMDUTF_NEED_TRAILING_ZEROES
2706 #define SIMDUTF_NEED_TRAILING_ZEROES 1
2712enum base64_options : uint64_t {
2715 base64_reverse_padding = 2,
2716 base64_default_no_padding =
2718 base64_reverse_padding,
2719 base64_url_with_padding =
2720 base64_url | base64_reverse_padding,
2721 base64_default_accept_garbage =
2723 base64_url_accept_garbage =
2730enum last_chunk_handling_options : uint64_t {
2734 stop_before_partial =
2747simdutf_warn_unused
size_t
2748maximal_binary_length_from_base64(
const char *input,
size_t length)
noexcept;
2750simdutf_really_inline simdutf_warn_unused
size_t
2751maximal_binary_length_from_base64(
2752 const detail::input_span_of_byte_like
auto &input)
noexcept {
2753 return maximal_binary_length_from_base64(
2754 reinterpret_cast<const char *
>(input.data()), input.size());
2768simdutf_warn_unused
size_t maximal_binary_length_from_base64(
2769 const char16_t *input,
size_t length)
noexcept;
2771simdutf_really_inline simdutf_warn_unused
size_t
2772maximal_binary_length_from_base64(std::span<const char16_t> input)
noexcept {
2773 return maximal_binary_length_from_base64(input.data(), input.size());
2831simdutf_warn_unused result base64_to_binary(
2832 const char *input,
size_t length,
char *output,
2833 base64_options options = base64_default,
2834 last_chunk_handling_options last_chunk_options = loose)
noexcept;
2836simdutf_really_inline simdutf_warn_unused result base64_to_binary(
2837 const detail::input_span_of_byte_like
auto &input,
2838 detail::output_span_of_byte_like
auto &&binary_output,
2839 base64_options options = base64_default,
2840 last_chunk_handling_options last_chunk_options = loose)
noexcept {
2841 return base64_to_binary(
reinterpret_cast<const char *
>(input.data()),
2843 reinterpret_cast<char *
>(binary_output.data()),
2844 options, last_chunk_options);
2854simdutf_warn_unused
size_t base64_length_from_binary(
2855 size_t length, base64_options options = base64_default)
noexcept;
2878size_t binary_to_base64(
const char *input,
size_t length,
char *output,
2879 base64_options options = base64_default)
noexcept;
2881simdutf_really_inline simdutf_warn_unused
size_t
2882binary_to_base64(
const detail::input_span_of_byte_like
auto &input,
2883 detail::output_span_of_byte_like
auto &&binary_output,
2884 base64_options options = base64_default)
noexcept {
2885 return binary_to_base64(
2886 reinterpret_cast<const char *
>(input.data()), input.size(),
2887 reinterpret_cast<char *
>(binary_output.data()), options);
2891 #if SIMDUTF_ATOMIC_REF
2928atomic_binary_to_base64(
const char *input,
size_t length,
char *output,
2929 base64_options options = base64_default)
noexcept;
2931simdutf_really_inline simdutf_warn_unused
size_t
2932atomic_binary_to_base64(
const detail::input_span_of_byte_like
auto &input,
2933 detail::output_span_of_byte_like
auto &&binary_output,
2934 base64_options options = base64_default)
noexcept {
2935 return atomic_binary_to_base64(
2936 reinterpret_cast<const char *
>(input.data()), input.size(),
2937 reinterpret_cast<char *
>(binary_output.data()), options);
2998simdutf_warn_unused result
2999base64_to_binary(
const char16_t *input,
size_t length,
char *output,
3000 base64_options options = base64_default,
3001 last_chunk_handling_options last_chunk_options =
3002 last_chunk_handling_options::loose)
noexcept;
3004simdutf_really_inline simdutf_warn_unused result base64_to_binary(
3005 std::span<const char16_t> input,
3006 detail::output_span_of_byte_like
auto &&binary_output,
3007 base64_options options = base64_default,
3008 last_chunk_handling_options last_chunk_options = loose)
noexcept {
3009 return base64_to_binary(input.data(), input.size(),
3010 reinterpret_cast<char *
>(binary_output.data()),
3011 options, last_chunk_options);
3076simdutf_warn_unused result
3077base64_to_binary_safe(
const char *input,
size_t length,
char *output,
3078 size_t &outlen, base64_options options = base64_default,
3079 last_chunk_handling_options last_chunk_options =
3080 last_chunk_handling_options::loose)
noexcept;
3082simdutf_really_inline simdutf_warn_unused result base64_to_binary_safe(
3083 const detail::input_span_of_byte_like
auto &input,
3084 detail::output_span_of_byte_like
auto &&binary_output,
3085 base64_options options = base64_default,
3086 last_chunk_handling_options last_chunk_options = loose)
noexcept {
3090 size_t outlen = binary_output.size();
3091 return base64_to_binary_safe(
reinterpret_cast<const char *
>(input.data()),
3093 reinterpret_cast<char *
>(binary_output.data()),
3094 outlen, options, last_chunk_options);
3098simdutf_warn_unused result
3099base64_to_binary_safe(
const char16_t *input,
size_t length,
char *output,
3100 size_t &outlen, base64_options options = base64_default,
3101 last_chunk_handling_options last_chunk_options =
3102 last_chunk_handling_options::loose)
noexcept;
3104simdutf_really_inline simdutf_warn_unused result base64_to_binary_safe(
3105 std::span<const char16_t> input,
3106 detail::output_span_of_byte_like
auto &&binary_output,
3107 base64_options options = base64_default,
3108 last_chunk_handling_options last_chunk_options = loose)
noexcept {
3112 size_t outlen = binary_output.size();
3113 return base64_to_binary_safe(input.data(), input.size(),
3114 reinterpret_cast<char *
>(binary_output.data()),
3115 outlen, options, last_chunk_options);
3138 virtual std::string
name()
const {
return std::string(_name); }
3149 virtual std::string
description()
const {
return std::string(_description); }
3162#if SIMDUTF_FEATURE_DETECT_ENCODING
3170 size_t length)
const noexcept;
3179 size_t length)
const noexcept = 0;
3189 virtual uint32_t required_instruction_sets()
const {
3190 return _required_instruction_sets;
3193#if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
3204 size_t len)
const noexcept = 0;
3207#if SIMDUTF_FEATURE_UTF8
3220 simdutf_warn_unused
virtual result
3224#if SIMDUTF_FEATURE_ASCII
3234 simdutf_warn_unused
virtual bool
3249 simdutf_warn_unused
virtual result
3253#if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
3268 simdutf_warn_unused
virtual bool
3272#if SIMDUTF_FEATURE_UTF16
3287 simdutf_warn_unused
virtual bool
3306 simdutf_warn_unused
virtual result
3308 size_t len)
const noexcept = 0;
3326 simdutf_warn_unused
virtual result
3328 size_t len)
const noexcept = 0;
3331#if SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
3344 simdutf_warn_unused
virtual bool
3348#if SIMDUTF_FEATURE_UTF32
3364 simdutf_warn_unused
virtual result
3366 size_t len)
const noexcept = 0;
3369#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
3380 simdutf_warn_unused
virtual size_t
3382 char *utf8_output)
const noexcept = 0;
3385#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
3396 simdutf_warn_unused
virtual size_t
3398 char16_t *utf16_output)
const noexcept = 0;
3410 simdutf_warn_unused
virtual size_t
3412 char16_t *utf16_output)
const noexcept = 0;
3415#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
3426 simdutf_warn_unused
virtual size_t
3428 char32_t *utf32_buffer)
const noexcept = 0;
3431#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
3444 simdutf_warn_unused
virtual size_t
3446 char *latin1_output)
const noexcept = 0;
3464 simdutf_warn_unused
virtual result
3466 char *latin1_output)
const noexcept = 0;
3487 simdutf_warn_unused
virtual size_t
3489 char *latin1_output)
const noexcept = 0;
3492#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
3505 simdutf_warn_unused
virtual size_t
3507 char16_t *utf16_output)
const noexcept = 0;
3521 simdutf_warn_unused
virtual size_t
3523 char16_t *utf16_output)
const noexcept = 0;
3541 const char *input,
size_t length,
3542 char16_t *utf16_output)
const noexcept = 0;
3560 const char *input,
size_t length,
3561 char16_t *utf16_output)
const noexcept = 0;
3564#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
3577 simdutf_warn_unused
virtual size_t
3579 char32_t *utf32_output)
const noexcept = 0;
3595 simdutf_warn_unused
virtual result
3597 char32_t *utf32_output)
const noexcept = 0;
3600#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
3611 simdutf_warn_unused
virtual size_t
3613 char16_t *utf16_buffer)
const noexcept = 0;
3625 simdutf_warn_unused
virtual size_t
3627 char16_t *utf16_buffer)
const noexcept = 0;
3630#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
3641 simdutf_warn_unused
virtual size_t
3643 char32_t *utf32_buffer)
const noexcept = 0;
3646#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
3659 simdutf_warn_unused
virtual size_t
3663#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
3678 simdutf_warn_unused
virtual size_t
3682#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
3699 simdutf_warn_unused
virtual size_t
3701 char *latin1_buffer)
const noexcept = 0;
3719 simdutf_warn_unused
virtual size_t
3721 char *latin1_buffer)
const noexcept = 0;
3742 simdutf_warn_unused
virtual result
3744 char *latin1_buffer)
const noexcept = 0;
3765 simdutf_warn_unused
virtual result
3767 char *latin1_buffer)
const noexcept = 0;
3789 simdutf_warn_unused
virtual size_t
3791 char *latin1_buffer)
const noexcept = 0;
3813 simdutf_warn_unused
virtual size_t
3815 char *latin1_buffer)
const noexcept = 0;
3818#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
3834 simdutf_warn_unused
virtual size_t
3836 char *utf8_buffer)
const noexcept = 0;
3853 simdutf_warn_unused
virtual size_t
3855 char *utf8_buffer)
const noexcept = 0;
3875 simdutf_warn_unused
virtual result
3877 char *utf8_buffer)
const noexcept = 0;
3897 simdutf_warn_unused
virtual result
3899 char *utf8_buffer)
const noexcept = 0;
3915 simdutf_warn_unused
virtual size_t
3917 char *utf8_buffer)
const noexcept = 0;
3933 simdutf_warn_unused
virtual size_t
3935 char *utf8_buffer)
const noexcept = 0;
3938#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
3954 simdutf_warn_unused
virtual size_t
3956 char32_t *utf32_buffer)
const noexcept = 0;
3973 simdutf_warn_unused
virtual size_t
3975 char32_t *utf32_buffer)
const noexcept = 0;
3996 const char16_t *input,
size_t length,
3997 char32_t *utf32_buffer)
const noexcept = 0;
4018 const char16_t *input,
size_t length,
4019 char32_t *utf32_buffer)
const noexcept = 0;
4035 simdutf_warn_unused
virtual size_t
4037 char32_t *utf32_buffer)
const noexcept = 0;
4053 simdutf_warn_unused
virtual size_t
4055 char32_t *utf32_buffer)
const noexcept = 0;
4058#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
4073 simdutf_warn_unused
virtual size_t
4075 size_t length)
const noexcept = 0;
4091 simdutf_warn_unused
virtual size_t
4093 size_t length)
const noexcept = 0;
4096#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
4113 simdutf_warn_unused
virtual size_t
4115 char *latin1_buffer)
const noexcept = 0;
4118#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
4138 simdutf_warn_unused
virtual result
4140 char *latin1_buffer)
const noexcept = 0;
4162 simdutf_warn_unused
virtual size_t
4164 char *latin1_buffer)
const noexcept = 0;
4167#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
4183 simdutf_warn_unused
virtual size_t
4185 char *utf8_buffer)
const noexcept = 0;
4204 simdutf_warn_unused
virtual result
4206 char *utf8_buffer)
const noexcept = 0;
4222 simdutf_warn_unused
virtual size_t
4224 char *utf8_buffer)
const noexcept = 0;
4227#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
4238 simdutf_warn_unused
virtual size_t
4244#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
4260 simdutf_warn_unused
virtual size_t
4262 char16_t *utf16_buffer)
const noexcept = 0;
4279 simdutf_warn_unused
virtual size_t
4281 char16_t *utf16_buffer)
const noexcept = 0;
4302 const char32_t *input,
size_t length,
4303 char16_t *utf16_buffer)
const noexcept = 0;
4324 const char32_t *input,
size_t length,
4325 char16_t *utf16_buffer)
const noexcept = 0;
4341 simdutf_warn_unused
virtual size_t
4343 char16_t *utf16_buffer)
const noexcept = 0;
4359 simdutf_warn_unused
virtual size_t
4361 char16_t *utf16_buffer)
const noexcept = 0;
4364#if SIMDUTF_FEATURE_UTF16
4380 char16_t *output)
const noexcept = 0;
4383#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
4392 simdutf_warn_unused
virtual size_t
4396#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
4409 simdutf_warn_unused
virtual size_t
4411 size_t length)
const noexcept = 0;
4414#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
4426 simdutf_warn_unused
virtual size_t
4432#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
4444 simdutf_warn_unused
virtual size_t
4448#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
4464 simdutf_warn_unused
virtual size_t
4470#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
4483 simdutf_warn_unused
virtual size_t
4485 size_t length)
const noexcept = 0;
4488#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
4497 simdutf_warn_unused
virtual size_t
4503#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
4521 simdutf_warn_unused
virtual size_t
4523 size_t length)
const noexcept = 0;
4542 simdutf_warn_unused
virtual size_t
4544 size_t length)
const noexcept = 0;
4547#if SIMDUTF_FEATURE_UTF16
4563 simdutf_warn_unused
virtual size_t
4581 simdutf_warn_unused
virtual size_t
4585#if SIMDUTF_FEATURE_UTF8
4598 simdutf_warn_unused
virtual size_t
4602#if SIMDUTF_FEATURE_BASE64
4614 const char *input,
size_t length)
const noexcept;
4628 const char16_t *input,
size_t length)
const noexcept;
4662 simdutf_warn_unused
virtual result
4664 base64_options options = base64_default,
4665 last_chunk_handling_options last_chunk_options =
4666 last_chunk_handling_options::loose)
const noexcept = 0;
4700 const char *input,
size_t length,
char *output,
4701 base64_options options = base64_default,
4702 last_chunk_handling_options last_chunk_options =
4703 last_chunk_handling_options::loose)
const noexcept = 0;
4737 simdutf_warn_unused
virtual result
4739 base64_options options = base64_default,
4740 last_chunk_handling_options last_chunk_options =
4741 last_chunk_handling_options::loose)
const noexcept = 0;
4775 const char16_t *input,
size_t length,
char *output,
4776 base64_options options = base64_default,
4777 last_chunk_handling_options last_chunk_options =
4778 last_chunk_handling_options::loose)
const noexcept = 0;
4788 size_t length, base64_options options = base64_default)
const noexcept;
4813 base64_options options = base64_default)
const noexcept = 0;
4816#ifdef SIMDUTF_INTERNAL_TESTS
4825 struct TestProcedure {
4833 virtual std::vector<TestProcedure> internal_tests()
const;
4841 uint32_t required_instruction_sets)
4843 _required_instruction_sets(required_instruction_sets) {}
4846 ~implementation() =
default;
4857 const char *_description;
4862 const uint32_t _required_instruction_sets;
4871class available_implementation_list {
4874 simdutf_really_inline available_implementation_list() {}
4876 size_t size() const noexcept;
4878 const implementation *const *begin() const noexcept;
4880 const implementation *const *end() const noexcept;
4895 const implementation *operator[](const std::
string &name) const noexcept {
4896 for (
const implementation *impl : *this) {
4897 if (impl->name() == name) {
4917 const implementation *detect_best_supported() const noexcept;
4920template <typename T> class atomic_ptr {
4922 atomic_ptr(T *_ptr) : ptr{_ptr} {}
4924#if defined(SIMDUTF_NO_THREADS)
4925 operator const T *()
const {
return ptr; }
4926 const T &operator*()
const {
return *ptr; }
4927 const T *operator->()
const {
return ptr; }
4929 operator T *() {
return ptr; }
4930 T &operator*() {
return *ptr; }
4931 T *operator->() {
return ptr; }
4932 atomic_ptr &operator=(T *_ptr) {
4938 operator const T *()
const {
return ptr.load(); }
4939 const T &operator*()
const {
return *ptr; }
4940 const T *operator->()
const {
return ptr.load(); }
4942 operator T *() {
return ptr.load(); }
4943 T &operator*() {
return *ptr; }
4944 T *operator->() {
return ptr.load(); }
4945 atomic_ptr &operator=(T *_ptr) {
4953#if defined(SIMDUTF_NO_THREADS)
4956 std::atomic<T *> ptr;
4960class detect_best_supported_implementation_on_first_use;
4967extern SIMDUTF_DLLIMPORTEXPORT
const internal::available_implementation_list &
4968get_available_implementations();
4976extern SIMDUTF_DLLIMPORTEXPORT internal::atomic_ptr<const implementation> &
4977get_active_implementation();
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 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 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 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 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 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 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 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 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 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 std::string name() const
The name of this implementation.
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_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_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 std::string description() const
The description of this implementation.
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 UTF8 string.
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.