- Сделан workaround бага в MSVC, когда он не иногда плохо умеет в consteval

- Уточнено описание работы upper, lower.
This commit is contained in:
Aleksandr Orefkov 2025-08-10 13:01:39 +03:00
parent a4eb796220
commit 2938a4188f
3 changed files with 17 additions and 5 deletions

View File

@ -196,6 +196,8 @@
- Для смены регистра символов и сравнения строк без учёта регистра используются встроенные таблицы для первой плоскости юникода - Для смены регистра символов и сравнения строк без учёта регистра используются встроенные таблицы для первой плоскости юникода
(до 0xFFFF). Строки считаются представленными в кодировке UTF-8, UTF-16, UTF-32 соответственно. (до 0xFFFF). Строки считаются представленными в кодировке UTF-8, UTF-16, UTF-32 соответственно.
Однако не делается нормализация строк и не обрабатываются ситуации, когда смена регистра символа приводит к изменению их количества. Однако не делается нормализация строк и не обрабатываются ситуации, когда смена регистра символа приводит к изменению их количества.
То есть преобразование регистра символов соответствует `std::towupper`, `std::towlower` для unicode локали,
только быстрее и может работать с любым видом символов.
Если вам нужна строгая работа с юникодом, используйте другие средства, например ICU. Если вам нужна строгая работа с юникодом, используйте другие средства, например ICU.
### Классы строк. ### Классы строк.

View File

@ -6064,13 +6064,23 @@ inline constexpr simple_str_nt<u8s> utf8_bom{"\xEF\xBB\xBF", 3}; // NOLINT
inline namespace literals { 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 * @brief Оператор литерал в simple_str_nt
* @param ptr - указатель на строку * @param ptr - указатель на строку
* @param l - длина строки * @param l - длина строки
* @return simple_str_nt * @return simple_str_nt
*/ */
consteval simple_str_nt<u8s> operator""_ss(const u8s* ptr, size_t l) { SS_CONSTEVAL simple_str_nt<u8s> operator""_ss(const u8s* ptr, size_t l) {
return simple_str_nt<u8s>{ptr, l}; return simple_str_nt<u8s>{ptr, l};
} }
@ -6080,7 +6090,7 @@ consteval simple_str_nt<u8s> operator""_ss(const u8s* ptr, size_t l) {
* @param l - длина строки * @param l - длина строки
* @return simple_str_nt * @return simple_str_nt
*/ */
consteval simple_str_nt<uws> operator""_ss(const uws* ptr, size_t l) { SS_CONSTEVAL simple_str_nt<uws> operator""_ss(const uws* ptr, size_t l) {
return simple_str_nt<uws>{ptr, l}; return simple_str_nt<uws>{ptr, l};
} }
@ -6090,7 +6100,7 @@ consteval simple_str_nt<uws> operator""_ss(const uws* ptr, size_t l) {
* @param l - длина строки * @param l - длина строки
* @return simple_str_nt * @return simple_str_nt
*/ */
consteval simple_str_nt<u16s> operator""_ss(const u16s* ptr, size_t l) { SS_CONSTEVAL simple_str_nt<u16s> operator""_ss(const u16s* ptr, size_t l) {
return simple_str_nt<u16s>{ptr, l}; return simple_str_nt<u16s>{ptr, l};
} }
@ -6100,7 +6110,7 @@ consteval simple_str_nt<u16s> operator""_ss(const u16s* ptr, size_t l) {
* @param l - длина строки * @param l - длина строки
* @return simple_str_nt * @return simple_str_nt
*/ */
consteval simple_str_nt<u32s> operator""_ss(const u32s* ptr, size_t l) { SS_CONSTEVAL simple_str_nt<u32s> operator""_ss(const u32s* ptr, size_t l) {
return simple_str_nt<u32s>{ptr, l}; return simple_str_nt<u32s>{ptr, l};
} }

View File

@ -47,7 +47,7 @@
`wchar_t` по размеру типов. `wchar_t` по размеру типов.
- Содержится минимальная поддержка Unicode при преобразовании `upper`, `lower` и регистро-независимом сравнении строк. - Содержится минимальная поддержка Unicode при преобразовании `upper`, `lower` и регистро-независимом сравнении строк.
Работает только для символов первой плоскости Unicode (до 0xFFFF), а при смене регистра не учитываются случаи, когда один code point Работает только для символов первой плоскости Unicode (до 0xFFFF), а при смене регистра не учитываются случаи, когда один code point
может преобразовываться в несколько. может преобразовываться в несколько, то есть преобразование регистра символов соответствует `std::towupper`, `std::towlower` для unicode локали, только быстрее и может работать с любым видом символов.
- Реализован `hash map` для ключей строкового типа, на базе `std::unordered_map`, с возможностью более эффективного хранения и - Реализован `hash map` для ключей строкового типа, на базе `std::unordered_map`, с возможностью более эффективного хранения и
сравнения ключей по сравнению с ключами `std::string`. Поддерживается возможность регистро-независимого сравнения ключей (Ascii или сравнения ключей по сравнению с ключами `std::string`. Поддерживается возможность регистро-независимого сравнения ключей (Ascii или
минимальный Unicode (см. предыдущий пункт)). минимальный Unicode (см. предыдущий пункт)).