mirror of https://github.com/orefkov/simstr.git
- Сделан workaround бага в MSVC, когда он не иногда плохо умеет в consteval
- Уточнено описание работы upper, lower.
This commit is contained in:
parent
a4eb796220
commit
2938a4188f
|
|
@ -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.
|
||||||
|
|
||||||
### Классы строк.
|
### Классы строк.
|
||||||
|
|
|
||||||
|
|
@ -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};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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 (см. предыдущий пункт)).
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue