From 2938a4188ffe61ba99f150fc7f322531746bcc94 Mon Sep 17 00:00:00 2001 From: Aleksandr Orefkov Date: Sun, 10 Aug 2025 13:01:39 +0300 Subject: [PATCH] =?UTF-8?q?-=20=D0=A1=D0=B4=D0=B5=D0=BB=D0=B0=D0=BD=20work?= =?UTF-8?q?around=20=D0=B1=D0=B0=D0=B3=D0=B0=20=D0=B2=20MSVC,=20=D0=BA?= =?UTF-8?q?=D0=BE=D0=B3=D0=B4=D0=B0=20=D0=BE=D0=BD=20=D0=BD=D0=B5=20=D0=B8?= =?UTF-8?q?=D0=BD=D0=BE=D0=B3=D0=B4=D0=B0=20=D0=BF=D0=BB=D0=BE=D1=85=D0=BE?= =?UTF-8?q?=20=D1=83=D0=BC=D0=B5=D0=B5=D1=82=20=D0=B2=20consteval=20-=20?= =?UTF-8?q?=D0=A3=D1=82=D0=BE=D1=87=D0=BD=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=BF?= =?UTF-8?q?=D0=B8=D1=81=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D1=8B=20upper,=20lower.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/overview.md | 2 ++ include/simstr/sstring.h | 18 ++++++++++++++---- readme.md | 2 +- 3 files changed, 17 insertions(+), 5 deletions(-) diff --git a/docs/overview.md b/docs/overview.md index 336ead3..a75182d 100644 --- a/docs/overview.md +++ b/docs/overview.md @@ -196,6 +196,8 @@ - Для смены регистра символов и сравнения строк без учёта регистра используются встроенные таблицы для первой плоскости юникода (до 0xFFFF). Строки считаются представленными в кодировке UTF-8, UTF-16, UTF-32 соответственно. Однако не делается нормализация строк и не обрабатываются ситуации, когда смена регистра символа приводит к изменению их количества. + То есть преобразование регистра символов соответствует `std::towupper`, `std::towlower` для unicode локали, + только быстрее и может работать с любым видом символов. Если вам нужна строгая работа с юникодом, используйте другие средства, например ICU. ### Классы строк. diff --git a/include/simstr/sstring.h b/include/simstr/sstring.h index 5064746..10aeeef 100644 --- a/include/simstr/sstring.h +++ b/include/simstr/sstring.h @@ -6064,13 +6064,23 @@ inline constexpr simple_str_nt utf8_bom{"\xEF\xBB\xBF", 3}; // NOLINT inline namespace literals { +#ifdef _MSC_VER +/* MSVC иногда не может сделать "text"_ss consteval, выдает ошибку C7595. +Находил подобное https://developercommunity.visualstudio.com/t/User-defined-literals-not-constant-expre/10108165 +Пишут, что баг исправлен, но видимо не до конца. +Без этого в тестах в двух местах не понимает "text"_ss, хотя в других местах - нормально работает*/ +#define SS_CONSTEVAL constexpr +#else +#define SS_CONSTEVAL consteval +#endif + /*! * @brief Оператор литерал в simple_str_nt * @param ptr - указатель на строку * @param l - длина строки * @return simple_str_nt */ -consteval simple_str_nt operator""_ss(const u8s* ptr, size_t l) { +SS_CONSTEVAL simple_str_nt operator""_ss(const u8s* ptr, size_t l) { return simple_str_nt{ptr, l}; } @@ -6080,7 +6090,7 @@ consteval simple_str_nt operator""_ss(const u8s* ptr, size_t l) { * @param l - длина строки * @return simple_str_nt */ -consteval simple_str_nt operator""_ss(const uws* ptr, size_t l) { +SS_CONSTEVAL simple_str_nt operator""_ss(const uws* ptr, size_t l) { return simple_str_nt{ptr, l}; } @@ -6090,7 +6100,7 @@ consteval simple_str_nt operator""_ss(const uws* ptr, size_t l) { * @param l - длина строки * @return simple_str_nt */ -consteval simple_str_nt operator""_ss(const u16s* ptr, size_t l) { +SS_CONSTEVAL simple_str_nt operator""_ss(const u16s* ptr, size_t l) { return simple_str_nt{ptr, l}; } @@ -6100,7 +6110,7 @@ consteval simple_str_nt operator""_ss(const u16s* ptr, size_t l) { * @param l - длина строки * @return simple_str_nt */ -consteval simple_str_nt operator""_ss(const u32s* ptr, size_t l) { +SS_CONSTEVAL simple_str_nt operator""_ss(const u32s* ptr, size_t l) { return simple_str_nt{ptr, l}; } diff --git a/readme.md b/readme.md index 634ef5d..719f93c 100644 --- a/readme.md +++ b/readme.md @@ -47,7 +47,7 @@ `wchar_t` по размеру типов. - Содержится минимальная поддержка Unicode при преобразовании `upper`, `lower` и регистро-независимом сравнении строк. Работает только для символов первой плоскости Unicode (до 0xFFFF), а при смене регистра не учитываются случаи, когда один code point - может преобразовываться в несколько. + может преобразовываться в несколько, то есть преобразование регистра символов соответствует `std::towupper`, `std::towlower` для unicode локали, только быстрее и может работать с любым видом символов. - Реализован `hash map` для ключей строкового типа, на базе `std::unordered_map`, с возможностью более эффективного хранения и сравнения ключей по сравнению с ключами `std::string`. Поддерживается возможность регистро-независимого сравнения ключей (Ascii или минимальный Unicode (см. предыдущий пункт)).