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;
124template <
class InputPtr>
125concept indexes_into_byte_like =
requires(InputPtr p) {
126 { std::decay_t<
decltype(p[0])>{} } -> simdutf::detail::byte_like;
128template <
class InputPtr>
129concept indexes_into_utf16 =
requires(InputPtr p) {
130 { std::decay_t<
decltype(p[0])>{} } -> std::same_as<char16_t>;
132template <
class InputPtr>
133concept indexes_into_utf32 =
requires(InputPtr p) {
134 { std::decay_t<
decltype(p[0])>{} } -> std::same_as<char32_t>;
137template <
class InputPtr>
138concept index_assignable_from_char =
requires(InputPtr p,
char s) {
146template <
class InputPtr>
147concept indexes_into_uint32 =
requires(InputPtr p) {
148 { std::decay_t<
decltype(p[0])>{} } -> std::same_as<std::uint32_t>;
156#include <simdutf/scalar/swap_bytes.h>
157#include <simdutf/scalar/ascii.h>
158#include <simdutf/scalar/atomic_util.h>
159#include <simdutf/scalar/latin1.h>
160#include <simdutf/scalar/latin1_to_utf16/latin1_to_utf16.h>
161#include <simdutf/scalar/latin1_to_utf32/latin1_to_utf32.h>
162#include <simdutf/scalar/latin1_to_utf8/latin1_to_utf8.h>
163#include <simdutf/scalar/utf16.h>
164#include <simdutf/scalar/utf16_to_latin1/utf16_to_latin1.h>
165#include <simdutf/scalar/utf16_to_latin1/valid_utf16_to_latin1.h>
166#include <simdutf/scalar/utf16_to_utf32/utf16_to_utf32.h>
167#include <simdutf/scalar/utf16_to_utf32/valid_utf16_to_utf32.h>
168#include <simdutf/scalar/utf16_to_utf8/utf16_to_utf8.h>
169#include <simdutf/scalar/utf16_to_utf8/valid_utf16_to_utf8.h>
170#include <simdutf/scalar/utf32.h>
171#include <simdutf/scalar/utf32_to_latin1/utf32_to_latin1.h>
172#include <simdutf/scalar/utf32_to_latin1/valid_utf32_to_latin1.h>
173#include <simdutf/scalar/utf32_to_utf16/utf32_to_utf16.h>
174#include <simdutf/scalar/utf32_to_utf16/valid_utf32_to_utf16.h>
175#include <simdutf/scalar/utf32_to_utf8/utf32_to_utf8.h>
176#include <simdutf/scalar/utf32_to_utf8/valid_utf32_to_utf8.h>
177#include <simdutf/scalar/utf8.h>
178#include <simdutf/scalar/utf8_to_latin1/utf8_to_latin1.h>
179#include <simdutf/scalar/utf8_to_latin1/valid_utf8_to_latin1.h>
180#include <simdutf/scalar/utf8_to_utf16/utf8_to_utf16.h>
181#include <simdutf/scalar/utf8_to_utf16/valid_utf8_to_utf16.h>
182#include <simdutf/scalar/utf8_to_utf32/utf8_to_utf32.h>
183#include <simdutf/scalar/utf8_to_utf32/valid_utf8_to_utf32.h>
190#if SIMDUTF_FEATURE_DETECT_ENCODING
201simdutf_warn_unused simdutf::encoding_type
203simdutf_really_inline simdutf_warn_unused simdutf::encoding_type
219simdutf_really_inline simdutf_warn_unused simdutf::encoding_type
221 const detail::input_span_of_byte_like
auto &input)
noexcept {
239 size_t length)
noexcept;
240simdutf_really_inline simdutf_warn_unused
int
245simdutf_really_inline simdutf_warn_unused
int
246detect_encodings(
const detail::input_span_of_byte_like
auto &input)
noexcept {
253#if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
265simdutf_warn_unused
bool validate_utf8(
const char *buf,
size_t len)
noexcept;
267simdutf_constexpr23 simdutf_really_inline simdutf_warn_unused
bool
268validate_utf8(
const detail::input_span_of_byte_like
auto &input)
noexcept {
269 #if SIMDUTF_CPLUSPLUS23
271 return scalar::utf8::validate(
272 detail::constexpr_cast_ptr<uint8_t>(input.data()), input.size());
276 return validate_utf8(
reinterpret_cast<const char *
>(input.data()),
283#if SIMDUTF_FEATURE_UTF8
297 size_t len)
noexcept;
299simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
result
301 const detail::input_span_of_byte_like
auto &input)
noexcept {
302 #if SIMDUTF_CPLUSPLUS23
304 return scalar::utf8::validate_with_errors(
305 detail::constexpr_cast_ptr<uint8_t>(input.data()), input.size());
310 reinterpret_cast<const char *
>(input.data()), input.size());
316#if SIMDUTF_FEATURE_ASCII
328simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
329validate_ascii(
const detail::input_span_of_byte_like
auto &input)
noexcept {
330 #if SIMDUTF_CPLUSPLUS23
332 return scalar::ascii::validate(
333 detail::constexpr_cast_ptr<std::uint8_t>(input.data()), input.size());
337 return validate_ascii(
reinterpret_cast<const char *
>(input.data()),
357 size_t len)
noexcept;
359simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
361 const detail::input_span_of_byte_like
auto &input)
noexcept {
362 #if SIMDUTF_CPLUSPLUS23
364 return scalar::ascii::validate_with_errors(
365 detail::constexpr_cast_ptr<std::uint8_t>(input.data()), input.size());
370 reinterpret_cast<const char *
>(input.data()), input.size());
376#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_ASCII
389 size_t len)
noexcept;
391simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
393 #if SIMDUTF_CPLUSPLUS23
395 return scalar::utf16::validate_as_ascii<endianness::NATIVE>(input.data(),
417 size_t len)
noexcept;
419simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
421 #if SIMDUTF_CPLUSPLUS23
423 return scalar::utf16::validate_as_ascii<endianness::BIG>(input.data(),
445 size_t len)
noexcept;
447simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
449 #if SIMDUTF_CPLUSPLUS23
451 return scalar::utf16::validate_as_ascii<endianness::LITTLE>(input.data(),
462#if SIMDUTF_FEATURE_UTF16
478 size_t len)
noexcept;
480simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
482 #if SIMDUTF_CPLUSPLUS23
484 return scalar::utf16::validate<endianness::NATIVE>(input.data(),
495#if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
511 size_t len)
noexcept;
513simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
bool
515 #if SIMDUTF_CPLUSPLUS23
517 return scalar::utf16::validate<endianness::LITTLE>(input.data(),
528#if SIMDUTF_FEATURE_UTF16
544 size_t len)
noexcept;
546simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
548 #if SIMDUTF_CPLUSPLUS23
550 return scalar::utf16::validate<endianness::BIG>(input.data(), input.size());
577 size_t len)
noexcept;
579simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
581 #if SIMDUTF_CPLUSPLUS23
583 return scalar::utf16::validate_with_errors<endianness::NATIVE>(
584 input.data(), input.size());
610 size_t len)
noexcept;
612simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
614 #if SIMDUTF_CPLUSPLUS23
616 return scalar::utf16::validate_with_errors<endianness::LITTLE>(
617 input.data(), input.size());
643 size_t len)
noexcept;
645simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
647 #if SIMDUTF_CPLUSPLUS23
649 return scalar::utf16::validate_with_errors<endianness::BIG>(input.data(),
672 char16_t *output)
noexcept;
674simdutf_really_inline simdutf_constexpr23
void
676 std::span<char16_t> output)
noexcept {
677 #if SIMDUTF_CPLUSPLUS23
679 scalar::utf16::to_well_formed_utf16<endianness::LITTLE>(
680 input.data(), input.size(), output.data());
702 char16_t *output)
noexcept;
704simdutf_really_inline simdutf_constexpr23
void
706 std::span<char16_t> output)
noexcept {
707 #if SIMDUTF_CPLUSPLUS23
709 scalar::utf16::to_well_formed_utf16<endianness::BIG>(
710 input.data(), input.size(), output.data());
732 char16_t *output)
noexcept;
734simdutf_really_inline simdutf_constexpr23
void
736 std::span<char16_t> output)
noexcept {
737 #if SIMDUTF_CPLUSPLUS23
739 scalar::utf16::to_well_formed_utf16<endianness::NATIVE>(
740 input.data(), input.size(), output.data());
751#if SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
767 size_t len)
noexcept;
769simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
bool
771 #if SIMDUTF_CPLUSPLUS23
773 return scalar::utf32::validate(
774 detail::constexpr_cast_ptr<std::uint32_t>(input.data()), input.size());
784#if SIMDUTF_FEATURE_UTF32
802 size_t len)
noexcept;
804simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
806 #if SIMDUTF_CPLUSPLUS23
808 return scalar::utf32::validate_with_errors(
809 detail::constexpr_cast_ptr<std::uint32_t>(input.data()), input.size());
819#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
832 char *utf8_output)
noexcept;
834simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
836 const detail::input_span_of_byte_like
auto &latin1_input,
837 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
838 #if SIMDUTF_CPLUSPLUS23
840 return scalar::latin1_to_utf8::convert(
841 detail::constexpr_cast_ptr<char>(latin1_input.data()),
843 detail::constexpr_cast_writeptr<char>(utf8_output.data()));
848 reinterpret_cast<const char *
>(latin1_input.data()),
849 latin1_input.size(),
reinterpret_cast<char *
>(utf8_output.data()));
867simdutf_warn_unused
size_t
869 size_t utf8_len)
noexcept;
871simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
873 const detail::input_span_of_byte_like
auto &input,
874 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
881 #if SIMDUTF_CPLUSPLUS23
883 return scalar::latin1_to_utf8::convert_safe_constexpr(
884 input.data(), input.size(), utf8_output.data(), utf8_output.size());
889 reinterpret_cast<const char *
>(input.data()), input.size(),
890 reinterpret_cast<char *
>(utf8_output.data()), utf8_output.size());
896#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
908 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
910simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
912 const detail::input_span_of_byte_like
auto &latin1_input,
913 std::span<char16_t> utf16_output)
noexcept {
914 #if SIMDUTF_CPLUSPLUS23
916 return scalar::latin1_to_utf16::convert<endianness::LITTLE>(
917 latin1_input.data(), latin1_input.size(), utf16_output.data());
922 reinterpret_cast<const char *
>(latin1_input.data()),
923 latin1_input.size(), utf16_output.data());
939 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
941simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
943 std::span<char16_t> output)
noexcept {
944 #if SIMDUTF_CPLUSPLUS23
946 return scalar::latin1_to_utf16::convert<endianness::BIG>(
947 input.data(), input.size(), output.data());
952 reinterpret_cast<const char *
>(input.data()), input.size(),
965simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
978simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
984#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
996 const char *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
998simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1000 const detail::input_span_of_byte_like
auto &latin1_input,
1001 std::span<char32_t> utf32_output)
noexcept {
1002 #if SIMDUTF_CPLUSPLUS23
1004 return scalar::latin1_to_utf32::convert(
1005 latin1_input.data(), latin1_input.size(), utf32_output.data());
1010 reinterpret_cast<const char *
>(latin1_input.data()),
1011 latin1_input.size(), utf32_output.data());
1017#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1032 char *latin1_output)
noexcept;
1034simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1036 const detail::input_span_of_byte_like
auto &input,
1037 detail::output_span_of_byte_like
auto &&output)
noexcept {
1038 #if SIMDUTF_CPLUSPLUS23
1040 return scalar::utf8_to_latin1::convert(input.data(), input.size(),
1047 reinterpret_cast<char *
>(output.data()));
1053#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1068 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1070simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1072 std::span<char16_t> output)
noexcept {
1073 #if SIMDUTF_CPLUSPLUS23
1075 return scalar::utf8_to_utf16::convert<endianness::NATIVE>(
1076 input.data(), input.size(), output.data());
1081 input.size(), output.data());
1104 const char16_t *input,
size_t length)
noexcept;
1106simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
result
1108 std::span<const char16_t> valid_utf16_input)
noexcept {
1109 #if SIMDUTF_CPLUSPLUS23
1111 return scalar::utf16::utf8_length_from_utf16_with_replacement<
1112 endianness::LITTLE>(valid_utf16_input.data(), valid_utf16_input.size());
1117 valid_utf16_input.size());
1140 const char16_t *input,
size_t length)
noexcept;
1142simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
1144 std::span<const char16_t> valid_utf16_input)
noexcept {
1145 #if SIMDUTF_CPLUSPLUS23
1147 return scalar::utf16::utf8_length_from_utf16_with_replacement<
1148 endianness::BIG>(valid_utf16_input.data(), valid_utf16_input.size());
1153 valid_utf16_input.size());
1160#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
1170 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1172simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1174 std::span<char16_t> output)
noexcept {
1175 #if SIMDUTF_CPLUSPLUS23
1177 return scalar::latin1_to_utf16::convert<endianness::NATIVE>(
1178 input.data(), input.size(), output.data());
1183 input.size(), output.data());
1189#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1203 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1205simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1207 std::span<char16_t> utf16_output)
noexcept {
1208 #if SIMDUTF_CPLUSPLUS23
1210 return scalar::utf8_to_utf16::convert<endianness::LITTLE>(
1211 utf8_input.data(), utf8_input.size(), utf16_output.data());
1216 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1217 utf16_output.data());
1235 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1237simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1239 std::span<char16_t> utf16_output)
noexcept {
1241 #if SIMDUTF_CPLUSPLUS23
1243 return scalar::utf8_to_utf16::convert<endianness::BIG>(
1244 utf8_input.data(), utf8_input.size(), utf16_output.data());
1249 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1250 utf16_output.data());
1256#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1274 const char *input,
size_t length,
char *latin1_output)
noexcept;
1276simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
1278 const detail::input_span_of_byte_like
auto &utf8_input,
1279 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1280 #if SIMDUTF_CPLUSPLUS23
1282 return scalar::utf8_to_latin1::convert_with_errors(
1283 utf8_input.data(), utf8_input.size(), latin1_output.data());
1288 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1289 reinterpret_cast<char *
>(latin1_output.data()));
1295#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1312 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1314simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
1316 const detail::input_span_of_byte_like
auto &utf8_input,
1317 std::span<char16_t> utf16_output)
noexcept {
1318 #if SIMDUTF_CPLUSPLUS23
1320 return scalar::utf8_to_utf16::convert_with_errors<endianness::NATIVE>(
1321 utf8_input.data(), utf8_input.size(), utf16_output.data());
1326 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1327 utf16_output.data());
1347 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1349simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
1351 const detail::input_span_of_byte_like
auto &utf8_input,
1352 std::span<char16_t> utf16_output)
noexcept {
1353 #if SIMDUTF_CPLUSPLUS23
1355 return scalar::utf8_to_utf16::convert_with_errors<endianness::LITTLE>(
1356 utf8_input.data(), utf8_input.size(), utf16_output.data());
1361 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1362 utf16_output.data());
1382 const char *input,
size_t length,
char16_t *utf16_output)
noexcept;
1384simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
1386 const detail::input_span_of_byte_like
auto &utf8_input,
1387 std::span<char16_t> utf16_output)
noexcept {
1388 #if SIMDUTF_CPLUSPLUS23
1390 return scalar::utf8_to_utf16::convert_with_errors<endianness::BIG>(
1391 utf8_input.data(), utf8_input.size(), utf16_output.data());
1396 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1397 utf16_output.data());
1403#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1417 const char *input,
size_t length,
char32_t *utf32_output)
noexcept;
1419simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1421 std::span<char32_t> utf32_output)
noexcept {
1422 #if SIMDUTF_CPLUSPLUS23
1424 return scalar::utf8_to_utf32::convert(utf8_input.data(), utf8_input.size(),
1425 utf32_output.data());
1430 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1431 utf32_output.data());
1451 const char *input,
size_t length,
char32_t *utf32_output)
noexcept;
1453simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
1455 const detail::input_span_of_byte_like
auto &utf8_input,
1456 std::span<char32_t> utf32_output)
noexcept {
1457 #if SIMDUTF_CPLUSPLUS23
1459 return scalar::utf8_to_utf32::convert_with_errors(
1460 utf8_input.data(), utf8_input.size(), utf32_output.data());
1465 reinterpret_cast<const char *
>(utf8_input.data()), utf8_input.size(),
1466 utf32_output.data());
1472#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1493 const char *input,
size_t length,
char *latin1_output)
noexcept;
1495simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1497 const detail::input_span_of_byte_like
auto &valid_utf8_input,
1498 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1499 #if SIMDUTF_CPLUSPLUS23
1501 return scalar::utf8_to_latin1::convert_valid(
1502 valid_utf8_input.data(), valid_utf8_input.size(), latin1_output.data());
1507 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1508 valid_utf8_input.size(), latin1_output.data());
1514#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1526 const char *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
1528simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1530 const detail::input_span_of_byte_like
auto &valid_utf8_input,
1531 std::span<char16_t> utf16_output)
noexcept {
1532 #if SIMDUTF_CPLUSPLUS23
1534 return scalar::utf8_to_utf16::convert_valid<endianness::NATIVE>(
1535 valid_utf8_input.data(), valid_utf8_input.size(), utf16_output.data());
1540 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1541 valid_utf8_input.size(), utf16_output.data());
1557 const char *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
1559simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1561 const detail::input_span_of_byte_like
auto &valid_utf8_input,
1562 std::span<char16_t> utf16_output)
noexcept {
1564 #if SIMDUTF_CPLUSPLUS23
1566 return scalar::utf8_to_utf16::convert_valid<endianness::LITTLE>(
1567 valid_utf8_input.data(), valid_utf8_input.size(), utf16_output.data());
1572 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1573 valid_utf8_input.size(), utf16_output.data());
1589 const char *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
1591simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1593 const detail::input_span_of_byte_like
auto &valid_utf8_input,
1594 std::span<char16_t> utf16_output)
noexcept {
1595 #if SIMDUTF_CPLUSPLUS23
1597 return scalar::utf8_to_utf16::convert_valid<endianness::BIG>(
1598 valid_utf8_input.data(), valid_utf8_input.size(), utf16_output.data());
1603 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1604 valid_utf8_input.size(), utf16_output.data());
1610#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1622 const char *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
1624simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1626 const detail::input_span_of_byte_like
auto &valid_utf8_input,
1627 std::span<char32_t> utf32_output)
noexcept {
1628 #if SIMDUTF_CPLUSPLUS23
1630 return scalar::utf8_to_utf32::convert_valid(
1631 valid_utf8_input.data(), valid_utf8_input.size(), utf32_output.data());
1636 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1637 valid_utf8_input.size(), utf32_output.data());
1643#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
1653 size_t length)
noexcept;
1655simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1657 const detail::input_span_of_byte_like
auto &latin1_input)
noexcept {
1658 #if SIMDUTF_CPLUSPLUS23
1660 return scalar::latin1_to_utf8::utf8_length_from_latin1(latin1_input.data(),
1661 latin1_input.size());
1666 reinterpret_cast<const char *
>(latin1_input.data()),
1667 latin1_input.size());
1686 size_t length)
noexcept;
1688simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1690 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
1691 #if SIMDUTF_CPLUSPLUS23
1693 return scalar::utf8::count_code_points(valid_utf8_input.data(),
1694 valid_utf8_input.size());
1699 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1700 valid_utf8_input.size());
1706#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1722 size_t length)
noexcept;
1724simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1726 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
1727 #if SIMDUTF_CPLUSPLUS23
1729 return scalar::utf8::utf16_length_from_utf8(valid_utf8_input.data(),
1730 valid_utf8_input.size());
1735 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1736 valid_utf8_input.size());
1742#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
1760 size_t length)
noexcept;
1762simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1764 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
1766 #if SIMDUTF_CPLUSPLUS23
1768 return scalar::utf8::count_code_points(valid_utf8_input.data(),
1769 valid_utf8_input.size());
1774 reinterpret_cast<const char *
>(valid_utf8_input.data()),
1775 valid_utf8_input.size());
1781#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
1799 char *utf8_buffer)
noexcept;
1801simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1803 std::span<const char16_t> utf16_input,
1804 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1805 #if SIMDUTF_CPLUSPLUS23
1807 return scalar::utf16_to_utf8::convert<endianness::NATIVE>(
1808 utf16_input.data(), utf16_input.size(), utf8_output.data());
1813 reinterpret_cast<char *
>(utf8_output.data()));
1839 size_t utf8_len)
noexcept;
1841simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1843 std::span<const char16_t> utf16_input,
1844 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
1851 #if SIMDUTF_CPLUSPLUS23
1854 scalar::utf16_to_utf8::convert_with_errors<endianness::NATIVE, true>(
1855 utf16_input.data(), utf16_input.size(), utf8_output.data(),
1856 utf8_output.size());
1857 if (r.error != error_code::SUCCESS &&
1858 r.error != error_code::OUTPUT_BUFFER_TOO_SMALL) {
1861 return r.output_count;
1866 utf16_input.data(), utf16_input.size(),
1867 reinterpret_cast<char *
>(utf8_output.data()), utf8_output.size());
1873#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
1890 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
1892simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1894 std::span<const char16_t> utf16_input,
1895 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1896 #if SIMDUTF_CPLUSPLUS23
1898 return scalar::utf16_to_latin1::convert<endianness::NATIVE>(
1899 utf16_input.data(), utf16_input.size(), latin1_output.data());
1904 utf16_input.data(), utf16_input.size(),
1905 reinterpret_cast<char *
>(latin1_output.data()));
1927 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
1929simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1931 std::span<const char16_t> utf16_input,
1932 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1933 #if SIMDUTF_CPLUSPLUS23
1935 return scalar::utf16_to_latin1::convert<endianness::LITTLE>(
1936 utf16_input.data(), utf16_input.size(), latin1_output.data());
1941 utf16_input.data(), utf16_input.size(),
1942 reinterpret_cast<char *
>(latin1_output.data()));
1962 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
1964simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
1966 std::span<const char16_t> utf16_input,
1967 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
1968 #if SIMDUTF_CPLUSPLUS23
1970 return scalar::utf16_to_latin1::convert<endianness::BIG>(
1971 utf16_input.data(), utf16_input.size(), latin1_output.data());
1976 utf16_input.data(), utf16_input.size(),
1977 reinterpret_cast<char *
>(latin1_output.data()));
1983#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
2000 char *utf8_buffer)
noexcept;
2002simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2004 std::span<const char16_t> utf16_input,
2005 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2006 #if SIMDUTF_CPLUSPLUS23
2008 return scalar::utf16_to_utf8::convert<endianness::LITTLE>(
2009 utf16_input.data(), utf16_input.size(), utf8_output.data());
2014 utf16_input.data(), utf16_input.size(),
2015 reinterpret_cast<char *
>(utf8_output.data()));
2036 char *utf8_buffer)
noexcept;
2038simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2040 std::span<const char16_t> utf16_input,
2041 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2042 #if SIMDUTF_CPLUSPLUS23
2044 return scalar::utf16_to_utf8::convert<endianness::BIG>(
2045 utf16_input.data(), utf16_input.size(), utf8_output.data());
2050 utf16_input.data(), utf16_input.size(),
2051 reinterpret_cast<char *
>(utf8_output.data()));
2057#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
2075 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2077simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2079 std::span<const char16_t> utf16_input,
2080 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2081 #if SIMDUTF_CPLUSPLUS23
2083 return scalar::utf16_to_latin1::convert_with_errors<endianness::NATIVE>(
2084 utf16_input.data(), utf16_input.size(), latin1_output.data());
2089 utf16_input.data(), utf16_input.size(),
2090 reinterpret_cast<char *
>(latin1_output.data()));
2111 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2113simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2115 std::span<const char16_t> utf16_input,
2116 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2117 #if SIMDUTF_CPLUSPLUS23
2119 return scalar::utf16_to_latin1::convert_with_errors<endianness::LITTLE>(
2120 utf16_input.data(), utf16_input.size(), latin1_output.data());
2125 utf16_input.data(), utf16_input.size(),
2126 reinterpret_cast<char *
>(latin1_output.data()));
2149 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2151simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2153 std::span<const char16_t> utf16_input,
2154 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2155 #if SIMDUTF_CPLUSPLUS23
2157 return scalar::utf16_to_latin1::convert_with_errors<endianness::BIG>(
2158 utf16_input.data(), utf16_input.size(), latin1_output.data());
2163 utf16_input.data(), utf16_input.size(),
2164 reinterpret_cast<char *
>(latin1_output.data()));
2170#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
2189 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2191simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2193 std::span<const char16_t> utf16_input,
2194 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2195 #if SIMDUTF_CPLUSPLUS23
2197 return scalar::utf16_to_utf8::convert_with_errors<endianness::NATIVE>(
2198 utf16_input.data(), utf16_input.size(), utf8_output.data());
2203 utf16_input.data(), utf16_input.size(),
2204 reinterpret_cast<char *
>(utf8_output.data()));
2226 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2228simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2230 std::span<const char16_t> utf16_input,
2231 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2232 #if SIMDUTF_CPLUSPLUS23
2234 return scalar::utf16_to_utf8::convert_with_errors<endianness::LITTLE>(
2235 utf16_input.data(), utf16_input.size(), utf8_output.data());
2240 utf16_input.data(), utf16_input.size(),
2241 reinterpret_cast<char *
>(utf8_output.data()));
2263 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2265simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2267 std::span<const char16_t> utf16_input,
2268 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2269 #if SIMDUTF_CPLUSPLUS23
2271 return scalar::utf16_to_utf8::convert_with_errors<endianness::BIG>(
2272 utf16_input.data(), utf16_input.size(), utf8_output.data());
2277 utf16_input.data(), utf16_input.size(),
2278 reinterpret_cast<char *
>(utf8_output.data()));
2298 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2300simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2302 std::span<const char16_t> utf16_input,
2303 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2304 #if SIMDUTF_CPLUSPLUS23
2306 return scalar::utf16_to_utf8::convert_with_replacement<endianness::LITTLE>(
2307 utf16_input.data(), utf16_input.size(), utf8_output.data());
2312 utf16_input.data(), utf16_input.size(),
2313 reinterpret_cast<char *
>(utf8_output.data()));
2333 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2335simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2337 std::span<const char16_t> utf16_input,
2338 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2339 #if SIMDUTF_CPLUSPLUS23
2341 return scalar::utf16_to_utf8::convert_with_replacement<endianness::BIG>(
2342 utf16_input.data(), utf16_input.size(), utf8_output.data());
2347 utf16_input.data(), utf16_input.size(),
2348 reinterpret_cast<char *
>(utf8_output.data()));
2368 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2370simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2372 std::span<const char16_t> utf16_input,
2373 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2374 #if SIMDUTF_CPLUSPLUS23
2376 return scalar::utf16_to_utf8::convert_with_replacement<endianness::NATIVE>(
2377 utf16_input.data(), utf16_input.size(), utf8_output.data());
2382 utf16_input.data(), utf16_input.size(),
2383 reinterpret_cast<char *
>(utf8_output.data()));
2389#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
2404 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2406simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2408 std::span<const char16_t> valid_utf16_input,
2409 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2410 #if SIMDUTF_CPLUSPLUS23
2412 return scalar::utf16_to_utf8::convert_valid<endianness::NATIVE>(
2413 valid_utf16_input.data(), valid_utf16_input.size(), utf8_output.data());
2418 valid_utf16_input.data(), valid_utf16_input.size(),
2419 reinterpret_cast<char *
>(utf8_output.data()));
2425#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
2446 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2448simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2450 std::span<const char16_t> valid_utf16_input,
2451 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2452 #if SIMDUTF_CPLUSPLUS23
2454 return scalar::utf16_to_latin1::convert_valid_impl<endianness::NATIVE>(
2455 detail::constexpr_cast_ptr<uint16_t>(valid_utf16_input.data()),
2456 valid_utf16_input.size(),
2457 detail::constexpr_cast_writeptr<char>(latin1_output.data()));
2462 valid_utf16_input.data(), valid_utf16_input.size(),
2463 reinterpret_cast<char *
>(latin1_output.data()));
2488 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2490simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
size_t
2492 std::span<const char16_t> valid_utf16_input,
2493 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2494 #if SIMDUTF_CPLUSPLUS23
2496 return scalar::utf16_to_latin1::convert_valid_impl<endianness::LITTLE>(
2497 detail::constexpr_cast_ptr<uint16_t>(valid_utf16_input.data()),
2498 valid_utf16_input.size(),
2499 detail::constexpr_cast_writeptr<char>(latin1_output.data()));
2504 valid_utf16_input.data(), valid_utf16_input.size(),
2505 reinterpret_cast<char *
>(latin1_output.data()));
2530 const char16_t *input,
size_t length,
char *latin1_buffer)
noexcept;
2532simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
size_t
2534 std::span<const char16_t> valid_utf16_input,
2535 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
2536 #if SIMDUTF_CPLUSPLUS23
2538 return scalar::utf16_to_latin1::convert_valid_impl<endianness::BIG>(
2539 detail::constexpr_cast_ptr<uint16_t>(valid_utf16_input.data()),
2540 valid_utf16_input.size(),
2541 detail::constexpr_cast_writeptr<char>(latin1_output.data()));
2546 valid_utf16_input.data(), valid_utf16_input.size(),
2547 reinterpret_cast<char *
>(latin1_output.data()));
2553#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
2568 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2570simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2572 std::span<const char16_t> valid_utf16_input,
2573 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2574 #if SIMDUTF_CPLUSPLUS23
2576 return scalar::utf16_to_utf8::convert_valid<endianness::NATIVE>(
2577 valid_utf16_input.data(), valid_utf16_input.size(), utf8_output.data());
2582 valid_utf16_input.data(), valid_utf16_input.size(),
2583 reinterpret_cast<char *
>(utf8_output.data()));
2602 const char16_t *input,
size_t length,
char *utf8_buffer)
noexcept;
2604simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2606 std::span<const char16_t> valid_utf16_input,
2607 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
2608 #if SIMDUTF_CPLUSPLUS23
2610 return scalar::utf16_to_utf8::convert_valid<endianness::BIG>(
2611 valid_utf16_input.data(), valid_utf16_input.size(), utf8_output.data());
2616 valid_utf16_input.data(), valid_utf16_input.size(),
2617 reinterpret_cast<char *
>(utf8_output.data()));
2623#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
2640 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
2642simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2644 std::span<char32_t> utf32_output)
noexcept {
2646 #if SIMDUTF_CPLUSPLUS23
2648 return scalar::utf16_to_utf32::convert<endianness::NATIVE>(
2649 utf16_input.data(), utf16_input.size(), utf32_output.data());
2654 utf32_output.data());
2674 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
2676simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2678 std::span<char32_t> utf32_output)
noexcept {
2679 #if SIMDUTF_CPLUSPLUS23
2681 return scalar::utf16_to_utf32::convert<endianness::LITTLE>(
2682 utf16_input.data(), utf16_input.size(), utf32_output.data());
2687 utf32_output.data());
2707 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
2709simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2711 std::span<char32_t> utf32_output)
noexcept {
2712 #if SIMDUTF_CPLUSPLUS23
2714 return scalar::utf16_to_utf32::convert<endianness::BIG>(
2715 utf16_input.data(), utf16_input.size(), utf32_output.data());
2720 utf32_output.data());
2743 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
2745simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2747 std::span<char32_t> utf32_output)
noexcept {
2748 #if SIMDUTF_CPLUSPLUS23
2750 return scalar::utf16_to_utf32::convert_with_errors<endianness::NATIVE>(
2751 utf16_input.data(), utf16_input.size(), utf32_output.data());
2756 utf16_input.data(), utf16_input.size(), utf32_output.data());
2778 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
2780simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2782 std::span<const char16_t> utf16_input,
2783 std::span<char32_t> utf32_output)
noexcept {
2784 #if SIMDUTF_CPLUSPLUS23
2786 return scalar::utf16_to_utf32::convert_with_errors<endianness::LITTLE>(
2787 utf16_input.data(), utf16_input.size(), utf32_output.data());
2792 utf16_input.data(), utf16_input.size(), utf32_output.data());
2814 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
2816simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2818 std::span<const char16_t> utf16_input,
2819 std::span<char32_t> utf32_output)
noexcept {
2820 #if SIMDUTF_CPLUSPLUS23
2822 return scalar::utf16_to_utf32::convert_with_errors<endianness::BIG>(
2823 utf16_input.data(), utf16_input.size(), utf32_output.data());
2828 utf16_input.data(), utf16_input.size(), utf32_output.data());
2848 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
2850simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2852 std::span<char32_t> utf32_output)
noexcept {
2853 #if SIMDUTF_CPLUSPLUS23
2855 return scalar::utf16_to_utf32::convert_valid<endianness::NATIVE>(
2856 valid_utf16_input.data(), valid_utf16_input.size(),
2857 utf32_output.data());
2862 valid_utf16_input.size(),
2863 utf32_output.data());
2882 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
2884simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2886 std::span<char32_t> utf32_output)
noexcept {
2887 #if SIMDUTF_CPLUSPLUS23
2889 return scalar::utf16_to_utf32::convert_valid<endianness::LITTLE>(
2890 valid_utf16_input.data(), valid_utf16_input.size(),
2891 utf32_output.data());
2896 valid_utf16_input.size(),
2897 utf32_output.data());
2916 const char16_t *input,
size_t length,
char32_t *utf32_buffer)
noexcept;
2918simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2920 std::span<char32_t> utf32_output)
noexcept {
2921 #if SIMDUTF_CPLUSPLUS23
2923 return scalar::utf16_to_utf32::convert_valid<endianness::BIG>(
2924 valid_utf16_input.data(), valid_utf16_input.size(),
2925 utf32_output.data());
2930 valid_utf16_input.size(),
2931 utf32_output.data());
2937#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
2950 size_t length)
noexcept;
2952simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
2954 #if SIMDUTF_CPLUSPLUS23
2956 return scalar::utf16::utf8_length_from_utf16<endianness::NATIVE>(
2957 valid_utf16_input.data(), valid_utf16_input.size());
2962 valid_utf16_input.size());
2986 const char16_t *input,
size_t length)
noexcept;
2988simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
2990 std::span<const char16_t> valid_utf16_input)
noexcept {
2991 #if SIMDUTF_CPLUSPLUS23
2993 return scalar::utf16::utf8_length_from_utf16_with_replacement<
2994 endianness::NATIVE>(valid_utf16_input.data(), valid_utf16_input.size());
2999 valid_utf16_input.size());
3016 size_t length)
noexcept;
3018simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
size_t
3020 #if SIMDUTF_CPLUSPLUS23
3022 return scalar::utf16::utf8_length_from_utf16<endianness::LITTLE>(
3023 valid_utf16_input.data(), valid_utf16_input.size());
3028 valid_utf16_input.size());
3045 size_t length)
noexcept;
3047simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3049 #if SIMDUTF_CPLUSPLUS23
3051 return scalar::utf16::utf8_length_from_utf16<endianness::BIG>(
3052 valid_utf16_input.data(), valid_utf16_input.size());
3057 valid_utf16_input.size());
3063#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
3079 char *utf8_buffer)
noexcept;
3081simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3083 std::span<const char32_t> utf32_input,
3084 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
3085 #if SIMDUTF_CPLUSPLUS23
3087 return scalar::utf32_to_utf8::convert(
3088 utf32_input.data(), utf32_input.size(), utf8_output.data());
3093 reinterpret_cast<char *
>(utf8_output.data()));
3115 const char32_t *input,
size_t length,
char *utf8_buffer)
noexcept;
3117simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3119 std::span<const char32_t> utf32_input,
3120 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
3121 #if SIMDUTF_CPLUSPLUS23
3123 return scalar::utf32_to_utf8::convert_with_errors(
3124 utf32_input.data(), utf32_input.size(), utf8_output.data());
3129 utf32_input.data(), utf32_input.size(),
3130 reinterpret_cast<char *
>(utf8_output.data()));
3149 const char32_t *input,
size_t length,
char *utf8_buffer)
noexcept;
3151simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3153 std::span<const char32_t> valid_utf32_input,
3154 detail::output_span_of_byte_like
auto &&utf8_output)
noexcept {
3155 #if SIMDUTF_CPLUSPLUS23
3157 return scalar::utf32_to_utf8::convert_valid(
3158 valid_utf32_input.data(), valid_utf32_input.size(), utf8_output.data());
3163 valid_utf32_input.data(), valid_utf32_input.size(),
3164 reinterpret_cast<char *
>(utf8_output.data()));
3170#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
3186 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3188simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3190 std::span<char16_t> utf16_output)
noexcept {
3191 #if SIMDUTF_CPLUSPLUS23
3193 return scalar::utf32_to_utf16::convert<endianness::NATIVE>(
3194 utf32_input.data(), utf32_input.size(), utf16_output.data());
3199 utf16_output.data());
3218 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3220simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3222 std::span<char16_t> utf16_output)
noexcept {
3223 #if SIMDUTF_CPLUSPLUS23
3225 return scalar::utf32_to_utf16::convert<endianness::LITTLE>(
3226 utf32_input.data(), utf32_input.size(), utf16_output.data());
3231 utf16_output.data());
3237#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
3253 const char32_t *input,
size_t length,
char *latin1_buffer)
noexcept;
3255simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3257 std::span<const char32_t> utf32_input,
3258 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
3259 #if SIMDUTF_CPLUSPLUS23
3261 return scalar::utf32_to_latin1::convert(
3262 utf32_input.data(), utf32_input.size(), latin1_output.data());
3267 utf32_input.data(), utf32_input.size(),
3268 reinterpret_cast<char *
>(latin1_output.data()));
3291 const char32_t *input,
size_t length,
char *latin1_buffer)
noexcept;
3293simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3295 std::span<const char32_t> utf32_input,
3296 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
3297 #if SIMDUTF_CPLUSPLUS23
3299 return scalar::utf32_to_latin1::convert_with_errors(
3300 utf32_input.data(), utf32_input.size(), latin1_output.data());
3305 utf32_input.data(), utf32_input.size(),
3306 reinterpret_cast<char *
>(latin1_output.data()));
3332 const char32_t *input,
size_t length,
char *latin1_buffer)
noexcept;
3334simdutf_really_inline simdutf_constexpr23 simdutf_warn_unused
size_t
3336 std::span<const char32_t> valid_utf32_input,
3337 detail::output_span_of_byte_like
auto &&latin1_output)
noexcept {
3338 #if SIMDUTF_CPLUSPLUS23
3340 return scalar::utf32_to_latin1::convert_valid(
3341 detail::constexpr_cast_ptr<uint32_t>(valid_utf32_input.data()),
3342 valid_utf32_input.size(),
3343 detail::constexpr_cast_writeptr<char>(latin1_output.data()));
3348 valid_utf32_input.data(), valid_utf32_input.size(),
3349 reinterpret_cast<char *
>(latin1_output.data()));
3366simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
size_t
3379simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
size_t
3385#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
3400 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3402simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3404 std::span<char16_t> utf16_output)
noexcept {
3405 #if SIMDUTF_CPLUSPLUS23
3407 return scalar::utf32_to_utf16::convert<endianness::BIG>(
3408 utf32_input.data(), utf32_input.size(), utf16_output.data());
3413 utf16_output.data());
3436 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3438simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3440 std::span<char16_t> utf16_output)
noexcept {
3441 #if SIMDUTF_CPLUSPLUS23
3443 return scalar::utf32_to_utf16::convert_with_errors<endianness::NATIVE>(
3444 utf32_input.data(), utf32_input.size(), utf16_output.data());
3449 utf32_input.data(), utf32_input.size(), utf16_output.data());
3471 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3473simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3475 std::span<const char32_t> utf32_input,
3476 std::span<char16_t> utf16_output)
noexcept {
3477 #if SIMDUTF_CPLUSPLUS23
3479 return scalar::utf32_to_utf16::convert_with_errors<endianness::LITTLE>(
3480 utf32_input.data(), utf32_input.size(), utf16_output.data());
3485 utf32_input.data(), utf32_input.size(), utf16_output.data());
3507 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3509simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
3511 std::span<const char32_t> utf32_input,
3512 std::span<char16_t> utf16_output)
noexcept {
3513 #if SIMDUTF_CPLUSPLUS23
3515 return scalar::utf32_to_utf16::convert_with_errors<endianness::BIG>(
3516 utf32_input.data(), utf32_input.size(), utf16_output.data());
3521 utf32_input.data(), utf32_input.size(), utf16_output.data());
3540 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3542simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3544 std::span<char16_t> utf16_output)
noexcept {
3546 #if SIMDUTF_CPLUSPLUS23
3548 return scalar::utf32_to_utf16::convert_valid<endianness::NATIVE>(
3549 valid_utf32_input.data(), valid_utf32_input.size(),
3550 utf16_output.data());
3555 valid_utf32_input.size(),
3556 utf16_output.data());
3575 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3577simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3579 std::span<char16_t> utf16_output)
noexcept {
3580 #if SIMDUTF_CPLUSPLUS23
3582 return scalar::utf32_to_utf16::convert_valid<endianness::LITTLE>(
3583 valid_utf32_input.data(), valid_utf32_input.size(),
3584 utf16_output.data());
3589 valid_utf32_input.size(),
3590 utf16_output.data());
3609 const char32_t *input,
size_t length,
char16_t *utf16_buffer)
noexcept;
3611simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3613 std::span<char16_t> utf16_output)
noexcept {
3614 #if SIMDUTF_CPLUSPLUS23
3616 return scalar::utf32_to_utf16::convert_valid<endianness::BIG>(
3617 valid_utf32_input.data(), valid_utf32_input.size(),
3618 utf16_output.data());
3623 valid_utf32_input.size(),
3624 utf16_output.data());
3630#if SIMDUTF_FEATURE_UTF16
3645 char16_t *output)
noexcept;
3647simdutf_really_inline simdutf_constexpr23
void
3649 std::span<char16_t> utf16_output)
noexcept {
3650 #if SIMDUTF_CPLUSPLUS23
3652 return scalar::utf16::change_endianness_utf16(
3653 utf16_input.data(), utf16_input.size(), utf16_output.data());
3658 utf16_output.data());
3664#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
3677 size_t length)
noexcept;
3679simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3681 #if SIMDUTF_CPLUSPLUS23
3683 return scalar::utf32::utf8_length_from_utf32(valid_utf32_input.data(),
3684 valid_utf32_input.size());
3689 valid_utf32_input.size());
3695#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
3708 size_t length)
noexcept;
3710simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3712 #if SIMDUTF_CPLUSPLUS23
3714 return scalar::utf32::utf16_length_from_utf32(valid_utf32_input.data(),
3715 valid_utf32_input.size());
3720 valid_utf32_input.size());
3741 size_t length)
noexcept;
3743simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3745 #if SIMDUTF_CPLUSPLUS23
3747 return scalar::utf16::utf32_length_from_utf16<endianness::NATIVE>(
3748 valid_utf16_input.data(), valid_utf16_input.size());
3753 valid_utf16_input.size());
3774 size_t length)
noexcept;
3776simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3778 std::span<const char16_t> valid_utf16_input)
noexcept {
3779 #if SIMDUTF_CPLUSPLUS23
3781 return scalar::utf16::utf32_length_from_utf16<endianness::LITTLE>(
3782 valid_utf16_input.data(), valid_utf16_input.size());
3787 valid_utf16_input.size());
3808 size_t length)
noexcept;
3810simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3812 std::span<const char16_t> valid_utf16_input)
noexcept {
3813 #if SIMDUTF_CPLUSPLUS23
3815 return scalar::utf16::utf32_length_from_utf16<endianness::BIG>(
3816 valid_utf16_input.data(), valid_utf16_input.size());
3821 valid_utf16_input.size());
3827#if SIMDUTF_FEATURE_UTF16
3843 size_t length)
noexcept;
3845simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3846count_utf16(std::span<const char16_t> valid_utf16_input)
noexcept {
3847 #if SIMDUTF_CPLUSPLUS23
3849 return scalar::utf16::count_code_points<endianness::NATIVE>(
3850 valid_utf16_input.data(), valid_utf16_input.size());
3854 return count_utf16(valid_utf16_input.data(), valid_utf16_input.size());
3874 size_t length)
noexcept;
3876simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3877count_utf16le(std::span<const char16_t> valid_utf16_input)
noexcept {
3878 #if SIMDUTF_CPLUSPLUS23
3880 return scalar::utf16::count_code_points<endianness::LITTLE>(
3881 valid_utf16_input.data(), valid_utf16_input.size());
3885 return count_utf16le(valid_utf16_input.data(), valid_utf16_input.size());
3905 size_t length)
noexcept;
3907simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3908count_utf16be(std::span<const char16_t> valid_utf16_input)
noexcept {
3909 #if SIMDUTF_CPLUSPLUS23
3911 return scalar::utf16::count_code_points<endianness::BIG>(
3912 valid_utf16_input.data(), valid_utf16_input.size());
3916 return count_utf16be(valid_utf16_input.data(), valid_utf16_input.size());
3922#if SIMDUTF_FEATURE_UTF8
3936 size_t length)
noexcept;
3938simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t count_utf8(
3939 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
3940 #if SIMDUTF_CPLUSPLUS23
3942 return scalar::utf8::count_code_points(valid_utf8_input.data(),
3943 valid_utf8_input.size());
3947 return count_utf8(
reinterpret_cast<const char *
>(valid_utf8_input.data()),
3948 valid_utf8_input.size());
3969simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
3971 const detail::input_span_of_byte_like
auto &valid_utf8_input)
noexcept {
3972 #if SIMDUTF_CPLUSPLUS23
3974 return scalar::utf8::trim_partial_utf8(valid_utf8_input.data(),
3975 valid_utf8_input.size());
3980 reinterpret_cast<const char *
>(valid_utf8_input.data()),
3981 valid_utf8_input.size());
3987#if SIMDUTF_FEATURE_UTF16
4005simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4007 #if SIMDUTF_CPLUSPLUS23
4009 return scalar::utf16::trim_partial_utf16<endianness::BIG>(
4010 valid_utf16_input.data(), valid_utf16_input.size());
4015 valid_utf16_input.size());
4037simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4039 #if SIMDUTF_CPLUSPLUS23
4041 return scalar::utf16::trim_partial_utf16<endianness::LITTLE>(
4042 valid_utf16_input.data(), valid_utf16_input.size());
4047 valid_utf16_input.size());
4069simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4071 #if SIMDUTF_CPLUSPLUS23
4073 return scalar::utf16::trim_partial_utf16<endianness::NATIVE>(
4074 valid_utf16_input.data(), valid_utf16_input.size());
4079 valid_utf16_input.size());
4085#if SIMDUTF_FEATURE_BASE64 || SIMDUTF_FEATURE_UTF16 || \
4086 SIMDUTF_FEATURE_DETECT_ENCODING
4087 #ifndef SIMDUTF_NEED_TRAILING_ZEROES
4088 #define SIMDUTF_NEED_TRAILING_ZEROES 1
4093#if SIMDUTF_FEATURE_BASE64
4098constexpr uint64_t base64_reverse_padding =
4100enum base64_options : uint64_t {
4103 base64_default_no_padding =
4105 base64_reverse_padding,
4106 base64_url_with_padding =
4107 base64_url | base64_reverse_padding,
4108 base64_default_accept_garbage =
4111 base64_url_accept_garbage =
4114 base64_default_or_url =
4116 base64_default_or_url_accept_garbage =
4125enum last_chunk_handling_options : uint64_t {
4129 stop_before_partial =
4135inline simdutf_constexpr23
bool
4136is_partial(last_chunk_handling_options options) {
4137 return (options == stop_before_partial) || (options == only_full_chunks);
4141simdutf_warn_unused
const char *find(
const char *start,
const char *end,
4142 char character)
noexcept;
4143simdutf_warn_unused
const char16_t *
4144find(
const char16_t *start,
const char16_t *end,
char16_t character)
noexcept;
4157simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
const char *
4158find(
const char *start,
const char *end,
char character)
noexcept {
4159 #if SIMDUTF_CPLUSPLUS23
4161 for (; start != end; ++start)
4162 if (*start == character)
4168 return detail::find(start, end, character);
4171simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
const char16_t *
4172find(
const char16_t *start,
const char16_t *end,
char16_t character)
noexcept {
4175 #if SIMDUTF_CPLUSPLUS23
4177 for (; start != end; ++start)
4178 if (*start == character)
4184 return detail::find(start, end, character);
4189 #include <simdutf/base64_tables.h>
4190 #include <simdutf/scalar/base64.h>
4194inline std::string_view to_string(base64_options options) {
4196 case base64_default:
4197 return "base64_default";
4199 return "base64_url";
4200 case base64_reverse_padding:
4201 return "base64_reverse_padding";
4202 case base64_url_with_padding:
4203 return "base64_url_with_padding";
4204 case base64_default_accept_garbage:
4205 return "base64_default_accept_garbage";
4206 case base64_url_accept_garbage:
4207 return "base64_url_accept_garbage";
4208 case base64_default_or_url:
4209 return "base64_default_or_url";
4210 case base64_default_or_url_accept_garbage:
4211 return "base64_default_or_url_accept_garbage";
4216inline std::string_view to_string(last_chunk_handling_options options) {
4222 case stop_before_partial:
4223 return "stop_before_partial";
4224 case only_full_chunks:
4225 return "only_full_chunks";
4243simdutf_warn_unused
size_t
4246simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4248 const detail::input_span_of_byte_like
auto &input)
noexcept {
4249 #if SIMDUTF_CPLUSPLUS23
4251 return scalar::base64::maximal_binary_length_from_base64(
4252 detail::constexpr_cast_ptr<uint8_t>(input.data()), input.size());
4257 reinterpret_cast<const char *
>(input.data()), input.size());
4277 const char16_t *input,
size_t length)
noexcept;
4279simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4281 #if SIMDUTF_CPLUSPLUS23
4283 return scalar::base64::maximal_binary_length_from_base64(input.data(),
4308 size_t length)
noexcept;
4310simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4312 const detail::input_span_of_byte_like
auto &input)
noexcept {
4313 #if SIMDUTF_CPLUSPLUS23
4315 return scalar::base64::binary_length_from_base64(input.data(),
4321 reinterpret_cast<const char *
>(input.data()), input.size());
4342 size_t length)
noexcept;
4344simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4346 #if SIMDUTF_CPLUSPLUS23
4348 return scalar::base64::binary_length_from_base64(input.data(),
4413 const char *input,
size_t length,
char *output,
4414 base64_options options = base64_default,
4415 last_chunk_handling_options last_chunk_options = loose)
noexcept;
4417simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
4419 const detail::input_span_of_byte_like
auto &input,
4420 detail::output_span_of_byte_like
auto &&binary_output,
4421 base64_options options = base64_default,
4422 last_chunk_handling_options last_chunk_options = loose)
noexcept {
4423 #if SIMDUTF_CPLUSPLUS23
4425 return scalar::base64::base64_to_binary_details_impl(
4426 input.data(), input.size(), binary_output.data(), options,
4427 last_chunk_options);
4433 reinterpret_cast<char *
>(binary_output.data()),
4434 options, last_chunk_options);
4447 size_t length, base64_options options = base64_default)
noexcept {
4448 return scalar::base64::base64_length_from_binary(length, options);
4461inline simdutf_warn_unused simdutf_constexpr23
size_t
4463 size_t length, base64_options options = base64_default,
4465 return scalar::base64::base64_length_from_binary_with_lines(length, options,
4491 base64_options options = base64_default)
noexcept;
4493simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4495 detail::output_span_of_byte_like
auto &&binary_output,
4496 base64_options options = base64_default)
noexcept {
4497 #if SIMDUTF_CPLUSPLUS23
4499 return scalar::base64::tail_encode_base64(
4500 binary_output.data(), input.data(), input.size(), options);
4505 reinterpret_cast<const char *
>(input.data()), input.size(),
4506 reinterpret_cast<char *
>(binary_output.data()), options);
4538 base64_options options = base64_default)
noexcept;
4540simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
size_t
4542 const detail::input_span_of_byte_like
auto &input,
4543 detail::output_span_of_byte_like
auto &&binary_output,
4545 base64_options options = base64_default)
noexcept {
4546 #if SIMDUTF_CPLUSPLUS23
4548 return scalar::base64::tail_encode_base64_impl<true>(
4549 binary_output.data(), input.data(), input.size(), options, line_length);
4554 reinterpret_cast<const char *
>(input.data()), input.size(),
4555 reinterpret_cast<char *
>(binary_output.data()), line_length, options);
4560 #if SIMDUTF_ATOMIC_REF
4603atomic_binary_to_base64(
const char *input,
size_t length,
char *output,
4604 base64_options options = base64_default)
noexcept;
4606simdutf_really_inline simdutf_warn_unused
size_t
4607atomic_binary_to_base64(
const detail::input_span_of_byte_like
auto &input,
4608 detail::output_span_of_byte_like
auto &&binary_output,
4609 base64_options options = base64_default)
noexcept {
4610 return atomic_binary_to_base64(
4611 reinterpret_cast<const char *
>(input.data()), input.size(),
4612 reinterpret_cast<char *
>(binary_output.data()), options);
4673simdutf_warn_unused result
4675 base64_options options = base64_default,
4676 last_chunk_handling_options last_chunk_options =
4677 last_chunk_handling_options::loose)
noexcept;
4679simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
result
4681 std::span<const char16_t> input,
4682 detail::output_span_of_byte_like
auto &&binary_output,
4683 base64_options options = base64_default,
4684 last_chunk_handling_options last_chunk_options = loose)
noexcept {
4685 #if SIMDUTF_CPLUSPLUS23
4687 return scalar::base64::base64_to_binary_details_impl(
4688 input.data(), input.size(), binary_output.data(), options,
4689 last_chunk_options);
4694 reinterpret_cast<char *
>(binary_output.data()),
4695 options, last_chunk_options);
4747simdutf_warn_unused full_result
4749 base64_options options = base64_default,
4750 last_chunk_handling_options last_chunk_options =
4751 last_chunk_handling_options::loose)
noexcept;
4753simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
full_result
4755 const detail::input_span_of_byte_like
auto &input,
4756 detail::output_span_of_byte_like
auto &&binary_output,
4757 base64_options options = base64_default,
4758 last_chunk_handling_options last_chunk_options = loose)
noexcept {
4759 #if SIMDUTF_CPLUSPLUS23
4761 return scalar::base64::base64_to_binary_details_impl(
4762 input.data(), input.size(), binary_output.data(), options,
4763 last_chunk_options);
4768 reinterpret_cast<const char *
>(input.data()), input.size(),
4769 reinterpret_cast<char *
>(binary_output.data()), options,
4770 last_chunk_options);
4823simdutf_warn_unused full_result
4825 base64_options options = base64_default,
4826 last_chunk_handling_options last_chunk_options =
4827 last_chunk_handling_options::loose)
noexcept;
4829simdutf_really_inline simdutf_warn_unused simdutf_constexpr23
full_result
4831 std::span<const char16_t> input,
4832 detail::output_span_of_byte_like
auto &&binary_output,
4833 base64_options options = base64_default,
4834 last_chunk_handling_options last_chunk_options = loose)
noexcept {
4835 #if SIMDUTF_CPLUSPLUS23
4837 return scalar::base64::base64_to_binary_details_impl(
4838 input.data(), input.size(), binary_output.data(), options,
4839 last_chunk_options);
4844 input.data(), input.size(),
4845 reinterpret_cast<char *
>(binary_output.data()), options,
4846 last_chunk_options);
4861simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
bool
4863 return scalar::base64::is_ignorable(input, options);
4865simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
bool
4867 base64_options options = base64_default)
noexcept {
4868 return scalar::base64::is_ignorable(input, options);
4882simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
bool
4883base64_valid(
char input, base64_options options = base64_default)
noexcept {
4884 return scalar::base64::is_base64(input, options);
4886simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
bool
4887base64_valid(
char16_t input, base64_options options = base64_default)
noexcept {
4888 return scalar::base64::is_base64(input, options);
4900simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
bool
4902 base64_options options = base64_default)
noexcept {
4903 return scalar::base64::is_base64_or_padding(input, options);
4905simdutf_warn_unused simdutf_really_inline simdutf_constexpr23
bool
4907 base64_options options = base64_default)
noexcept {
4908 return scalar::base64::is_base64_or_padding(input, options);
4978simdutf_warn_unused result
4980 size_t &outlen, base64_options options = base64_default,
4981 last_chunk_handling_options last_chunk_options =
4982 last_chunk_handling_options::loose,
4983 bool decode_up_to_bad_char =
false) noexcept;
4986simdutf_warn_unused
result
4988 size_t &outlen, base64_options options = base64_default,
4989 last_chunk_handling_options last_chunk_options =
4990 last_chunk_handling_options::loose,
4991 bool decode_up_to_bad_char = false) noexcept;
4994 #if SIMDUTF_ATOMIC_REF
5034simdutf_warn_unused
result atomic_base64_to_binary_safe(
5035 const char *input,
size_t length,
char *output,
size_t &outlen,
5036 base64_options options = base64_default,
5037 last_chunk_handling_options last_chunk_options =
5038 last_chunk_handling_options::loose,
5039 bool decode_up_to_bad_char =
false) noexcept;
5040simdutf_warn_unused
result atomic_base64_to_binary_safe(
5041 const
char16_t *input,
size_t length,
char *output,
size_t &outlen,
5042 base64_options options = base64_default,
5043 last_chunk_handling_options last_chunk_options = loose,
5044 bool decode_up_to_bad_char = false) noexcept;
5050simdutf_really_inline simdutf_warn_unused std::tuple<result, std::size_t>
5051atomic_base64_to_binary_safe(
5052 const detail::input_span_of_byte_like
auto &binary_input,
5053 detail::output_span_of_byte_like
auto &&output,
5054 base64_options options = base64_default,
5055 last_chunk_handling_options last_chunk_options =
5056 last_chunk_handling_options::loose,
5057 bool decode_up_to_bad_char =
false) noexcept {
5058 size_t outlen = output.size();
5059 auto ret = atomic_base64_to_binary_safe(
5060 reinterpret_cast<const char *
>(binary_input.data()), binary_input.size(),
5061 reinterpret_cast<char *
>(output.data()), outlen, options,
5062 last_chunk_options, decode_up_to_bad_char);
5063 return {ret, outlen};
5069simdutf_warn_unused std::tuple<result, std::size_t>
5070atomic_base64_to_binary_safe(
5071 std::span<const char16_t> base64_input,
5072 detail::output_span_of_byte_like
auto &&binary_output,
5073 base64_options options = base64_default,
5074 last_chunk_handling_options last_chunk_options = loose,
5075 bool decode_up_to_bad_char =
false) noexcept {
5076 size_t outlen = binary_output.size();
5077 auto ret = atomic_base64_to_binary_safe(
5078 base64_input.data(), base64_input.size(),
5079 reinterpret_cast<char *
>(binary_output.data()), outlen, options,
5080 last_chunk_options, decode_up_to_bad_char);
5081 return {ret, outlen};
5106 virtual std::string_view
name() const noexcept {
return _name; }
5117 virtual std::string_view
description() const noexcept {
return _description; }
5130#if SIMDUTF_FEATURE_DETECT_ENCODING
5138 size_t length)
const noexcept;
5147 size_t length)
const noexcept = 0;
5157 virtual uint32_t required_instruction_sets()
const {
5158 return _required_instruction_sets;
5161#if SIMDUTF_FEATURE_UTF8 || SIMDUTF_FEATURE_DETECT_ENCODING
5172 size_t len)
const noexcept = 0;
5175#if SIMDUTF_FEATURE_UTF8
5188 simdutf_warn_unused
virtual result
5192#if SIMDUTF_FEATURE_ASCII
5202 simdutf_warn_unused
virtual bool
5217 simdutf_warn_unused
virtual result
5222#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_ASCII
5234 simdutf_warn_unused
virtual bool
5248 simdutf_warn_unused
virtual bool
5252#if SIMDUTF_FEATURE_UTF16 || SIMDUTF_FEATURE_DETECT_ENCODING
5267 simdutf_warn_unused
virtual bool
5271#if SIMDUTF_FEATURE_UTF16
5286 simdutf_warn_unused
virtual bool
5305 simdutf_warn_unused
virtual result
5307 size_t len)
const noexcept = 0;
5325 simdutf_warn_unused
virtual result
5327 size_t len)
const noexcept = 0;
5341 char16_t *output)
const noexcept = 0;
5355 char16_t *output)
const noexcept = 0;
5358#if SIMDUTF_FEATURE_UTF32 || SIMDUTF_FEATURE_DETECT_ENCODING
5371 simdutf_warn_unused
virtual bool
5375#if SIMDUTF_FEATURE_UTF32
5391 simdutf_warn_unused
virtual result
5393 size_t len)
const noexcept = 0;
5396#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
5407 simdutf_warn_unused
virtual size_t
5409 char *utf8_output)
const noexcept = 0;
5412#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
5423 simdutf_warn_unused
virtual size_t
5425 char16_t *utf16_output)
const noexcept = 0;
5437 simdutf_warn_unused
virtual size_t
5439 char16_t *utf16_output)
const noexcept = 0;
5442#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
5453 simdutf_warn_unused
virtual size_t
5455 char32_t *utf32_buffer)
const noexcept = 0;
5458#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
5471 simdutf_warn_unused
virtual size_t
5473 char *latin1_output)
const noexcept = 0;
5491 simdutf_warn_unused
virtual result
5493 char *latin1_output)
const noexcept = 0;
5514 simdutf_warn_unused
virtual size_t
5516 char *latin1_output)
const noexcept = 0;
5519#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
5532 simdutf_warn_unused
virtual size_t
5534 char16_t *utf16_output)
const noexcept = 0;
5548 simdutf_warn_unused
virtual size_t
5550 char16_t *utf16_output)
const noexcept = 0;
5568 const char *input,
size_t length,
5569 char16_t *utf16_output)
const noexcept = 0;
5587 const char *input,
size_t length,
5588 char16_t *utf16_output)
const noexcept = 0;
5609 const char16_t *input,
size_t length)
const noexcept = 0;
5631 const char16_t *input,
size_t length)
const noexcept = 0;
5635#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
5648 simdutf_warn_unused
virtual size_t
5650 char32_t *utf32_output)
const noexcept = 0;
5666 simdutf_warn_unused
virtual result
5668 char32_t *utf32_output)
const noexcept = 0;
5671#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
5682 simdutf_warn_unused
virtual size_t
5684 char16_t *utf16_buffer)
const noexcept = 0;
5696 simdutf_warn_unused
virtual size_t
5698 char16_t *utf16_buffer)
const noexcept = 0;
5701#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
5712 simdutf_warn_unused
virtual size_t
5714 char32_t *utf32_buffer)
const noexcept = 0;
5717#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
5730 simdutf_warn_unused
virtual size_t
5734#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
5749 simdutf_warn_unused
virtual size_t
5753#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
5770 simdutf_warn_unused
virtual size_t
5772 char *latin1_buffer)
const noexcept = 0;
5790 simdutf_warn_unused
virtual size_t
5792 char *latin1_buffer)
const noexcept = 0;
5813 simdutf_warn_unused
virtual result
5815 char *latin1_buffer)
const noexcept = 0;
5836 simdutf_warn_unused
virtual result
5838 char *latin1_buffer)
const noexcept = 0;
5860 simdutf_warn_unused
virtual size_t
5862 char *latin1_buffer)
const noexcept = 0;
5884 simdutf_warn_unused
virtual size_t
5886 char *latin1_buffer)
const noexcept = 0;
5889#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
5905 simdutf_warn_unused
virtual size_t
5907 char *utf8_buffer)
const noexcept = 0;
5924 simdutf_warn_unused
virtual size_t
5926 char *utf8_buffer)
const noexcept = 0;
5946 simdutf_warn_unused
virtual result
5948 char *utf8_buffer)
const noexcept = 0;
5968 simdutf_warn_unused
virtual result
5970 char *utf8_buffer)
const noexcept = 0;
5988 const char16_t *input,
size_t length,
5989 char *utf8_buffer)
const noexcept = 0;
6007 const char16_t *input,
size_t length,
6008 char *utf8_buffer)
const noexcept = 0;
6024 simdutf_warn_unused
virtual size_t
6026 char *utf8_buffer)
const noexcept = 0;
6042 simdutf_warn_unused
virtual size_t
6044 char *utf8_buffer)
const noexcept = 0;
6047#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
6063 simdutf_warn_unused
virtual size_t
6065 char32_t *utf32_buffer)
const noexcept = 0;
6082 simdutf_warn_unused
virtual size_t
6084 char32_t *utf32_buffer)
const noexcept = 0;
6105 const char16_t *input,
size_t length,
6106 char32_t *utf32_buffer)
const noexcept = 0;
6127 const char16_t *input,
size_t length,
6128 char32_t *utf32_buffer)
const noexcept = 0;
6144 simdutf_warn_unused
virtual size_t
6146 char32_t *utf32_buffer)
const noexcept = 0;
6162 simdutf_warn_unused
virtual size_t
6164 char32_t *utf32_buffer)
const noexcept = 0;
6167#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF16
6182 simdutf_warn_unused
virtual size_t
6184 size_t length)
const noexcept = 0;
6200 simdutf_warn_unused
virtual size_t
6202 size_t length)
const noexcept = 0;
6205#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
6222 simdutf_warn_unused
virtual size_t
6224 char *latin1_buffer)
const noexcept = 0;
6227#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
6247 simdutf_warn_unused
virtual result
6249 char *latin1_buffer)
const noexcept = 0;
6271 simdutf_warn_unused
virtual size_t
6273 char *latin1_buffer)
const noexcept = 0;
6276#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
6292 simdutf_warn_unused
virtual size_t
6294 char *utf8_buffer)
const noexcept = 0;
6313 simdutf_warn_unused
virtual result
6315 char *utf8_buffer)
const noexcept = 0;
6331 simdutf_warn_unused
virtual size_t
6333 char *utf8_buffer)
const noexcept = 0;
6336#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
6346 simdutf_warn_unused
virtual size_t
6352#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
6368 simdutf_warn_unused
virtual size_t
6370 char16_t *utf16_buffer)
const noexcept = 0;
6387 simdutf_warn_unused
virtual size_t
6389 char16_t *utf16_buffer)
const noexcept = 0;
6410 const char32_t *input,
size_t length,
6411 char16_t *utf16_buffer)
const noexcept = 0;
6432 const char32_t *input,
size_t length,
6433 char16_t *utf16_buffer)
const noexcept = 0;
6449 simdutf_warn_unused
virtual size_t
6451 char16_t *utf16_buffer)
const noexcept = 0;
6467 simdutf_warn_unused
virtual size_t
6469 char16_t *utf16_buffer)
const noexcept = 0;
6472#if SIMDUTF_FEATURE_UTF16
6488 char16_t *output)
const noexcept = 0;
6491#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
6500 simdutf_warn_unused
virtual size_t
6504#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_UTF32
6517 simdutf_warn_unused
virtual size_t
6519 size_t length)
const noexcept = 0;
6522#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
6534 simdutf_warn_unused
virtual size_t
6540#if SIMDUTF_FEATURE_UTF8 && SIMDUTF_FEATURE_LATIN1
6552 simdutf_warn_unused
virtual size_t
6556#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_LATIN1
6571 simdutf_warn_unused
virtual size_t
6577#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
6590 simdutf_warn_unused
virtual size_t
6592 size_t length)
const noexcept = 0;
6595#if SIMDUTF_FEATURE_UTF32 && SIMDUTF_FEATURE_LATIN1
6604 simdutf_warn_unused
virtual size_t
6610#if SIMDUTF_FEATURE_UTF16 && SIMDUTF_FEATURE_UTF32
6628 simdutf_warn_unused
virtual size_t
6630 size_t length)
const noexcept = 0;
6649 simdutf_warn_unused
virtual size_t
6651 size_t length)
const noexcept = 0;
6654#if SIMDUTF_FEATURE_UTF16
6670 simdutf_warn_unused
virtual size_t
6688 simdutf_warn_unused
virtual size_t
6692#if SIMDUTF_FEATURE_UTF8
6705 simdutf_warn_unused
virtual size_t
6709#if SIMDUTF_FEATURE_BASE64
6724 const char *input,
size_t length)
const noexcept;
6741 const char16_t *input,
size_t length)
const noexcept;
6755 simdutf_warn_unused
virtual size_t
6771 simdutf_warn_unused
virtual size_t
6773 size_t length)
const noexcept;
6808 simdutf_warn_unused
virtual result
6810 base64_options options = base64_default,
6811 last_chunk_handling_options last_chunk_options =
6812 last_chunk_handling_options::loose)
const noexcept = 0;
6847 const char *input,
size_t length,
char *output,
6848 base64_options options = base64_default,
6849 last_chunk_handling_options last_chunk_options =
6850 last_chunk_handling_options::loose)
const noexcept = 0;
6886 simdutf_warn_unused
virtual result
6888 base64_options options = base64_default,
6889 last_chunk_handling_options last_chunk_options =
6890 last_chunk_handling_options::loose)
const noexcept = 0;
6925 const char16_t *input,
size_t length,
char *output,
6926 base64_options options = base64_default,
6927 last_chunk_handling_options last_chunk_options =
6928 last_chunk_handling_options::loose)
const noexcept = 0;
6939 size_t length, base64_options options = base64_default)
const noexcept;
6964 base64_options options = base64_default)
const noexcept = 0;
6992 const char *input,
size_t length,
char *output,
6994 base64_options options = base64_default)
const noexcept = 0;
7006 virtual const char *
find(
const char *start,
const char *end,
7007 char character)
const noexcept = 0;
7008 virtual const char16_t *
find(
const char16_t *start,
const char16_t *end,
7009 char16_t character)
const noexcept = 0;
7012#ifdef SIMDUTF_INTERNAL_TESTS
7021 struct TestProcedure {
7023 std::string_view name;
7029 virtual std::vector<TestProcedure> internal_tests()
const;
7042 uint32_t required_instruction_sets)
7044 _required_instruction_sets(required_instruction_sets) {}
7047 ~implementation() =
default;
7058 const char *_description;
7063 const uint32_t _required_instruction_sets;
7072class available_implementation_list {
7075 simdutf_really_inline available_implementation_list() {}
7077 size_t size() const noexcept;
7079 const implementation *const *begin() const noexcept;
7081 const implementation *const *end() const noexcept;
7096 const implementation *operator[](std::string_view name) const noexcept {
7097 for (
const implementation *impl : *this) {
7098 if (impl->name() == name) {
7118 const implementation *detect_best_supported() const noexcept;
7121template <typename T> class atomic_ptr {
7123 atomic_ptr(T *_ptr) : ptr{_ptr} {}
7125#if defined(SIMDUTF_NO_THREADS)
7126 operator const T *()
const {
return ptr; }
7127 const T &operator*()
const {
return *ptr; }
7128 const T *operator->()
const {
return ptr; }
7130 operator T *() {
return ptr; }
7131 T &operator*() {
return *ptr; }
7132 T *operator->() {
return ptr; }
7133 atomic_ptr &operator=(T *_ptr) {
7139 operator const T *()
const {
return ptr.load(); }
7140 const T &operator*()
const {
return *ptr; }
7141 const T *operator->()
const {
return ptr.load(); }
7143 operator T *() {
return ptr.load(); }
7144 T &operator*() {
return *ptr; }
7145 T *operator->() {
return ptr.load(); }
7146 atomic_ptr &operator=(T *_ptr) {
7154#if defined(SIMDUTF_NO_THREADS)
7157 std::atomic<T *> ptr;
7161class detect_best_supported_implementation_on_first_use;
7168extern SIMDUTF_DLLIMPORTEXPORT
const internal::available_implementation_list &
7177extern SIMDUTF_DLLIMPORTEXPORT internal::atomic_ptr<const implementation> &
7182#if SIMDUTF_FEATURE_BASE64
7184 #include <simdutf/base64_implementation.h>
7192simdutf_really_inline
7193 simdutf_constexpr23 simdutf_warn_unused std::tuple<result, std::size_t>
7195 const detail::input_span_of_byte_like
auto &input,
7196 detail::output_span_of_byte_like
auto &&binary_output,
7197 base64_options options = base64_default,
7198 last_chunk_handling_options last_chunk_options = loose,
7199 bool decode_up_to_bad_char =
false) noexcept {
7200 size_t outlen = binary_output.size();
7201 #if SIMDUTF_CPLUSPLUS23
7203 using CInput = std::decay_t<
decltype(*input.data())>;
7204 static_assert(std::is_same_v<CInput, char>,
7205 "sorry, the constexpr implementation is for now limited to "
7206 "input of type char");
7207 using COutput = std::decay_t<
decltype(*binary_output.data())>;
7208 static_assert(std::is_same_v<COutput, char>,
7209 "sorry, the constexpr implementation is for now limited to "
7210 "output of type char");
7211 auto r = base64_to_binary_safe_impl(
7212 input.data(), input.size(), binary_output.data(), outlen, options,
7213 last_chunk_options, decode_up_to_bad_char);
7218 auto r = base64_to_binary_safe_impl<char>(
7219 reinterpret_cast<const char *
>(input.data()), input.size(),
7220 reinterpret_cast<char *
>(binary_output.data()), outlen, options,
7221 last_chunk_options, decode_up_to_bad_char);
7231simdutf_really_inline
7232 simdutf_warn_unused simdutf_constexpr23 std::tuple<result, std::size_t>
7234 std::span<const char16_t> input,
7235 detail::output_span_of_byte_like
auto &&binary_output,
7236 base64_options options = base64_default,
7237 last_chunk_handling_options last_chunk_options = loose,
7238 bool decode_up_to_bad_char =
false) noexcept {
7239 size_t outlen = binary_output.size();
7240 #if SIMDUTF_CPLUSPLUS23
7242 auto r = base64_to_binary_safe_impl(
7243 input.data(), input.size(), binary_output.data(), outlen, options,
7244 last_chunk_options, decode_up_to_bad_char);
7250 input.data(), input.size(),
7251 reinterpret_cast<char *
>(binary_output.data()), outlen, options,
7252 last_chunk_options, decode_up_to_bad_char);
7263#if SIMDUTF_CPLUSPLUS23 && SIMDUTF_FEATURE_BASE64
7272template <std::
size_t N>
struct base64_literal_helper {
7273 std::array<char, N - 1> storage{};
7274 static constexpr std::size_t size() noexcept {
return N - 1; }
7275 consteval base64_literal_helper(
const char (&str)[N]) {
7276 for (std::size_t i = 0; i < size(); i++) {
7277 storage[i] = str[i];
7282template <std::
size_t InputLen>
struct base64_decode_result {
7283 static constexpr std::size_t max_out = (InputLen + 3) / 4 * 3;
7284 std::array<char, max_out> buffer{};
7285 std::size_t output_count{};
7288template <std::
size_t InputLen>
7289consteval auto base64_decode_literal(
const char *str) {
7290 base64_decode_result<InputLen> result{};
7291 auto r = scalar::base64::base64_to_binary_details_impl(
7292 str, InputLen, result.buffer.data(), base64_default, loose);
7293 if (r.error != error_code::SUCCESS) {
7294 #if __cpp_lib_unreachable >= 202202L
7298 throw "invalid base64 input in _base64 literal";
7301 result.output_count = r.output_count;
7305template <base64_literal_helper a>
consteval auto base64_make_array() {
7306 constexpr auto decoded = base64_decode_literal<a.size()>(a.storage.data());
7307 std::array<char, decoded.output_count> ret{};
7308 for (std::size_t i = 0; i < decoded.output_count; i++) {
7309 ret[i] = decoded.buffer[i];
7327template <detail::base64_literal_helper a>
consteval auto operator""_base64() {
7328 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 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 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 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 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 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 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 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 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_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.