8template <
typename InputPtr>
10 requires simdutf::detail::indexes_into_uint32<InputPtr>
12simdutf_warn_unused simdutf_constexpr23
bool validate(InputPtr data,
13 size_t len)
noexcept {
15 for (; pos < len; pos++) {
16 uint32_t word = data[pos];
17 if (word > 0x10FFFF || (word >= 0xD800 && word <= 0xDFFF)) {
24simdutf_warn_unused simdutf_really_inline
bool validate(
const char32_t *buf,
25 size_t len)
noexcept {
26 return validate(
reinterpret_cast<const uint32_t *
>(buf), len);
29template <
typename InputPtr>
30#if SIMDUTF_CPLUSPLUS20
31 requires simdutf::detail::indexes_into_uint32<InputPtr>
33simdutf_warn_unused simdutf_constexpr23 result
34validate_with_errors(InputPtr data,
size_t len)
noexcept {
36 for (; pos < len; pos++) {
37 uint32_t word = data[pos];
38 if (word > 0x10FFFF) {
39 return result(error_code::TOO_LARGE, pos);
41 if (word >= 0xD800 && word <= 0xDFFF) {
42 return result(error_code::SURROGATE, pos);
45 return result(error_code::SUCCESS, pos);
48simdutf_warn_unused simdutf_really_inline result
49validate_with_errors(
const char32_t *buf,
size_t len)
noexcept {
50 return validate_with_errors(
reinterpret_cast<const uint32_t *
>(buf), len);
53inline simdutf_constexpr23
size_t utf8_length_from_utf32(
const char32_t *p,
57 for (
size_t i = 0; i < len; i++) {
60 counter +=
static_cast<size_t>(p[i] > 0x7F);
61 counter +=
static_cast<size_t>(p[i] > 0x7FF);
62 counter +=
static_cast<size_t>(p[i] > 0xFFFF);
67inline simdutf_warn_unused simdutf_constexpr23
size_t
68utf16_length_from_utf32(
const char32_t *p,
size_t len) {
71 for (
size_t i = 0; i < len; i++) {
73 counter +=
static_cast<size_t>(p[i] > 0xFFFF);