Files
pip/libs/main/text/pichar.h
2026-03-12 14:46:57 +03:00

274 lines
11 KiB
C++

/*! \file pichar.h
* \ingroup Text
* \~\brief
* \~english UTF-16 character type
* \~russian Тип UTF-16 символа
*/
/*
PIP - Platform Independent Primitives
Unicode char
Ivan Pelipenko peri4ko@yandex.ru, Andrey Bychkov work.a.b@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#ifndef PICHAR_H
#define PICHAR_H
#include "piincludes.h"
extern PIP_EXPORT char * __syslocname__;
extern PIP_EXPORT char * __sysoemname__;
extern PIP_EXPORT char * __utf8name__;
//! \~\ingroup Text
//! \~\brief
//! \~english Single UTF-16 character.
//! \~russian Один UTF-16 символ.
class PIP_EXPORT PIChar {
friend class PIString;
friend PIP_EXPORT PICout operator<<(PICout s, const PIChar & v);
public:
//! \~english Constructs a character from an ASCII byte.
//! \~russian Создает символ из ASCII байта.
PIChar(char c) { ch = c; }
//! \~english Constructs a character from an ASCII byte.
//! \~russian Создает символ из ASCII байта.
PIChar(uchar c) { ch = c; }
//! \~english Constructs a character from a UTF-16 code unit.
//! \~russian Создает символ из UTF-16 кодовой единицы.
PIChar(ushort c = 0) { ch = c; }
//! \~english Constructs a character from `wchar_t`.
//! \~russian Создает символ из `wchar_t`.
PIChar(wchar_t c) { ch = c; }
//! \~english Constructs a character from `char16_t`.
//! \~russian Создает символ из `char16_t`.
PIChar(char16_t c) { ch = c; }
//! \~english Assigns an ASCII byte.
//! \~russian Присваивает ASCII байт.
PIChar & operator=(const char v) {
ch = v;
return *this;
}
//! \~english Assigns a `wchar_t` character.
//! \~russian Присваивает символ `wchar_t`.
PIChar & operator=(const wchar_t v) {
ch = v;
return *this;
}
//! \~english Returns `true` if characters are equal.
//! \~russian Возвращает `true`, если символы равны.
bool operator==(const PIChar & o) const;
//! \~english Returns `true` if characters are not equal.
//! \~russian Возвращает `true`, если символы не равны.
bool operator!=(const PIChar & o) const { return !(*this == o); }
//! \~english Returns `true` if this character is greater than `o`.
//! \~russian Возвращает `true`, если этот символ больше `o`.
bool operator>(const PIChar & o) const;
//! \~english Returns `true` if this character is less than `o`.
//! \~russian Возвращает `true`, если этот символ меньше `o`.
bool operator<(const PIChar & o) const;
//! \~english Returns `true` if this character is greater than or equal to `o`.
//! \~russian Возвращает `true`, если этот символ больше либо равен `o`.
bool operator>=(const PIChar & o) const;
//! \~english Returns `true` if this character is less than or equal to `o`.
//! \~russian Возвращает `true`, если этот символ меньше либо равен `o`.
bool operator<=(const PIChar & o) const;
//! \~english Returns `true` if the character is a digit.
//! \~russian Возвращает `true`, если символ является цифрой.
bool isDigit() const;
//! \~english Returns `true` if the character is a hexadecimal digit.
//! \~russian Возвращает `true`, если символ является шестнадцатеричной цифрой.
bool isHex() const;
//! \~english Returns `true` if the character is visible and not a space.
//! \~russian Возвращает `true`, если символ является графическим и не является пробельным.
bool isGraphical() const;
//! \~english Returns `true` if the character is a control character.
//! \~russian Возвращает `true`, если символ является управляющим.
bool isControl() const;
//! \~english Returns `true` if the character is lowercase.
//! \~russian Возвращает `true`, если символ в нижнем регистре.
bool isLower() const;
//! \~english Returns `true` if the character is uppercase.
//! \~russian Возвращает `true`, если символ в верхнем регистре.
bool isUpper() const;
//! \~english Returns `true` if the character is printable.
//! \~russian Возвращает `true`, если символ является печатным.
bool isPrint() const;
//! \~english Returns `true` if the character is whitespace.
//! \~russian Возвращает `true`, если символ является пробельным.
bool isSpace() const;
//! \~english Returns `true` if the character is alphabetic.
//! \~russian Возвращает `true`, если символ является буквой.
bool isAlpha() const;
//! \~english Returns `true` if the character is ASCII.
//! \~russian Возвращает `true`, если символ входит в ASCII.
bool isAscii() const;
//! \~english Returns a `wchar_t` view of the internal single-character storage.
//! \~russian Возвращает представление внутреннего буфера одного символа как `wchar_t`.
const wchar_t * toWCharPtr() const;
//! \~english Returns a `char` view of the internal single-character storage.
//! \~russian Возвращает представление внутреннего буфера одного символа как `char`.
const char * toCharPtr() const;
//! \~english Returns the character as `wchar_t`.
//! \~russian Возвращает символ как `wchar_t`.
wchar_t toWChar() const;
//! \~english Returns the low ASCII byte of the character.
//! \~russian Возвращает младший ASCII байт символа.
char toAscii() const { return ch % 256; }
//! \~english Returns the character as a single byte in console codepage.
//! \~russian Возвращает символ как один байт в консольной кодировке.
char toConsole1Byte() const;
//! \~english Returns the character as a single byte in system codepage.
//! \~russian Возвращает символ как один байт в системной кодировке.
char toSystem() const;
//! \~english Returns the UTF-16 code unit of the character.
//! \~russian Возвращает UTF-16 кодовую единицу символа.
ushort unicode16Code() const { return ch; }
//! \~english Returns an uppercase copy of the character.
//! \~russian Возвращает копию символа в верхнем регистре.
PIChar toUpper() const;
//! \~english Returns a lowercase copy of the character.
//! \~russian Возвращает копию символа в нижнем регистре.
PIChar toLower() const;
//! \~english Creates a character from a single console-codepage byte.
//! \~russian Создает символ из одного байта консольной кодировки.
static PIChar fromConsole(char c);
//! \~english Creates a character from a single system-codepage byte.
//! \~russian Создает символ из одного байта системной кодировки.
static PIChar fromSystem(char c);
//! \~english Creates a character from the first system-codepage character in `c`.
//! \~russian Создает символ из первого символа в `c` в системной кодировке.
static PIChar fromSystem(const char * c);
//! \~english Creates a character from the first UTF-8 character in `c`.
//! \~russian Создает символ из первого UTF-8 символа в `c`.
static PIChar fromUTF8(const char * c);
private:
ushort ch;
};
//! \relatesalso PIChar
//! \~english Writes the character to \a PICout.
//! \~russian Записывает символ в \a PICout.
PIP_EXPORT PICout operator<<(PICout s, const PIChar & v);
//! \relatesalso PIChar
//! \~english Returns `true` if the ASCII byte `v` is equal to `c`.
//! \~russian Возвращает `true`, если ASCII байт `v` равен `c`.
inline bool operator==(const char v, const PIChar & c) {
return (PIChar(v) == c);
}
//! \relatesalso PIChar
//! \~english Returns `true` if the ASCII byte `v` is greater than `c`.
//! \~russian Возвращает `true`, если ASCII байт `v` больше `c`.
inline bool operator>(const char v, const PIChar & c) {
return (PIChar(v) > c);
}
//! \relatesalso PIChar
//! \~english Returns `true` if the ASCII byte `v` is less than `c`.
//! \~russian Возвращает `true`, если ASCII байт `v` меньше `c`.
inline bool operator<(const char v, const PIChar & c) {
return (PIChar(v) < c);
}
//! \relatesalso PIChar
//! \~english Returns `true` if the ASCII byte `v` is greater than or equal to `c`.
//! \~russian Возвращает `true`, если ASCII байт `v` больше либо равен `c`.
inline bool operator>=(const char v, const PIChar & c) {
return (PIChar(v) >= c);
}
//! \relatesalso PIChar
//! \~english Returns `true` if the ASCII byte `v` is less than or equal to `c`.
//! \~russian Возвращает `true`, если ASCII байт `v` меньше либо равен `c`.
inline bool operator<=(const char v, const PIChar & c) {
return (PIChar(v) <= c);
}
//! \relatesalso PIChar
//! \~english Returns `true` if the UTF-16 code unit `v` is equal to `c`.
//! \~russian Возвращает `true`, если UTF-16 кодовая единица `v` равна `c`.
inline bool operator==(ushort v, const PIChar & c) {
return (PIChar(v) == c);
}
//! \relatesalso PIChar
//! \~english Returns `true` if the UTF-16 code unit `v` is greater than `c`.
//! \~russian Возвращает `true`, если UTF-16 кодовая единица `v` больше `c`.
inline bool operator>(ushort v, const PIChar & c) {
return (PIChar(v) > c);
}
//! \relatesalso PIChar
//! \~english Returns `true` if the UTF-16 code unit `v` is less than `c`.
//! \~russian Возвращает `true`, если UTF-16 кодовая единица `v` меньше `c`.
inline bool operator<(ushort v, const PIChar & c) {
return (PIChar(v) < c);
}
//! \relatesalso PIChar
//! \~english Returns `true` if the UTF-16 code unit `v` is greater than or equal to `c`.
//! \~russian Возвращает `true`, если UTF-16 кодовая единица `v` больше либо равна `c`.
inline bool operator>=(ushort v, const PIChar & c) {
return (PIChar(v) >= c);
}
//! \relatesalso PIChar
//! \~english Returns `true` if the UTF-16 code unit `v` is less than or equal to `c`.
//! \~russian Возвращает `true`, если UTF-16 кодовая единица `v` меньше либо равна `c`.
inline bool operator<=(ushort v, const PIChar & c) {
return (PIChar(v) <= c);
}
#endif // PICHAR_H