- Сделан 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 соответственно.
Однако не делается нормализация строк и не обрабатываются ситуации, когда смена регистра символа приводит к изменению их количества.
То есть преобразование регистра символов соответствует `std::towupper`, `std::towlower` для unicode локали,
только быстрее и может работать с любым видом символов.
Если вам нужна строгая работа с юникодом, используйте другие средства, например ICU.
### Классы строк.

View File

@ -6064,13 +6064,23 @@ inline constexpr simple_str_nt<u8s> 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<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};
}
@ -6080,7 +6090,7 @@ consteval simple_str_nt<u8s> operator""_ss(const u8s* ptr, size_t l) {
* @param l - длина строки
* @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};
}
@ -6090,7 +6100,7 @@ consteval simple_str_nt<uws> operator""_ss(const uws* ptr, size_t l) {
* @param l - длина строки
* @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};
}
@ -6100,7 +6110,7 @@ consteval simple_str_nt<u16s> operator""_ss(const u16s* ptr, size_t l) {
* @param l - длина строки
* @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};
}

View File

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