From 4915ced6ce32dd96fadb897b97d0da58c0561e9f Mon Sep 17 00:00:00 2001 From: Jason Volk Date: Sun, 21 Feb 2021 11:23:09 -0800 Subject: [PATCH] ircd::icu: Add bulk vector utility overloads. --- include/ircd/icu.h | 5 +++++ ircd/icu.cc | 44 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 49 insertions(+) diff --git a/include/ircd/icu.h b/include/ircd/icu.h index d43bcb9d9..777432484 100644 --- a/include/ircd/icu.h +++ b/include/ircd/icu.h @@ -21,6 +21,11 @@ namespace ircd::icu bool is_nonchar(const char32_t &) noexcept; bool is_char(const char32_t &) noexcept; + i32x16 category(const c32x16) noexcept; + i32x16 block(const c32x16) noexcept; + u32x16 is_nonchar(const c32x16) noexcept; // returns mask + u32x16 is_char(const c32x16) noexcept; // returns mask + char32_t toupper(const char32_t &) noexcept; char32_t tolower(const char32_t &) noexcept; diff --git a/ircd/icu.cc b/ircd/icu.cc index 5c4dcd4be..bf3bc7d47 100644 --- a/ircd/icu.cc +++ b/ircd/icu.cc @@ -171,6 +171,50 @@ noexcept return u_toupper(ch); } +ircd::u32x16 +ircd::icu::is_char(const c32x16 ch) +noexcept +{ + u32x16 ret{0}; + for(size_t i{0}; i < 16; ++i) + ret[i] = boolmask(is_char(ch[i])); + + return ret; +} + +ircd::u32x16 +ircd::icu::is_nonchar(const c32x16 ch) +noexcept +{ + u32x16 ret{0}; + for(size_t i{0}; i < 16; ++i) + ret[i] = boolmask(is_nonchar(ch[i])); + + return ret; +} + +ircd::i32x16 +ircd::icu::block(const c32x16 ch) +noexcept +{ + i32x16 ret{0}; + for(size_t i{0}; i < 16; ++i) + ret[i] = ch[i]? (1U << block(ch[i])): 0; + + return ret; +} + +ircd::i32x16 +ircd::icu::category(const c32x16 ch) +noexcept +{ + i32x16 ret{0}; + for(size_t i{0}; i < 16; ++i) + ret[i] = ch[i]? (1U << category(ch[i])): 0; + + return ret; +} + bool ircd::icu::is_char(const char32_t &ch) noexcept