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 (см. предыдущий пункт)).