version 3.17.0

finally properly works PIIOString inside PIIOStream
This commit is contained in:
2024-04-05 15:34:38 +03:00
parent 8d585439bb
commit 9283c88b4e
6 changed files with 155 additions and 47 deletions

View File

@@ -2,8 +2,8 @@ cmake_minimum_required(VERSION 3.0)
cmake_policy(SET CMP0017 NEW) # need include() with .cmake cmake_policy(SET CMP0017 NEW) # need include() with .cmake
project(PIP) project(PIP)
set(PIP_MAJOR 3) set(PIP_MAJOR 3)
set(PIP_MINOR 16) set(PIP_MINOR 17)
set(PIP_REVISION 1) set(PIP_REVISION 0)
set(PIP_SUFFIX ) set(PIP_SUFFIX )
set(PIP_COMPANY SHS) set(PIP_COMPANY SHS)
set(PIP_DOMAIN org.SHS) set(PIP_DOMAIN org.SHS)

View File

@@ -41,7 +41,18 @@ PIIOString::PIIOString(const PIString & string) {
} }
void PIIOString::clear() {
if (str) str->clear();
pos = 0;
}
bool PIIOString::open(PIString * string, PIIODevice::DeviceMode mode) { bool PIIOString::open(PIString * string, PIIODevice::DeviceMode mode) {
if (mode == PIIODevice::ReadWrite) {
piCoutObj << "Error: ReadWrite mode not supported, use WriteOnly or ReadOnly";
str = nullptr;
return false;
}
str = string; str = string;
return PIIODevice::open(mode); return PIIODevice::open(mode);
} }
@@ -53,26 +64,57 @@ bool PIIOString::open(const PIString & string) {
} }
bool PIIOString::isEnd() const {
if (!str) return true;
if (mode_ == PIIODevice::WriteOnly)
return pos >= str->size_s();
else {
str->dataUTF8();
return pos >= static_cast<ssize_t>(str->lastDataSize());
}
}
void PIIOString::seekToBegin() {
if (!str) return;
pos = 0;
}
void PIIOString::seekToEnd() {
if (!str) return;
if (mode_ == PIIODevice::WriteOnly)
pos = str->size_s();
else {
str->dataUTF8();
pos = str->lastDataSize();
}
}
PIString PIIOString::readLine() { PIString PIIOString::readLine() {
if (!canRead() || !str) return PIString(); if (!canRead() || !str) return PIString();
int np = pos; auto utf8_data = str->dataUTF8();
while (++np < str->size_s()) { ssize_t utf8_size = str->lastDataSize();
if ((*str)[np] == '\n') break; int pp = pos;
while (++pp < utf8_size) {
if (utf8_data[pp] == '\n') break;
} }
PIString ret = str->mid(pos, np - pos); PIString ret = PIString::fromUTF8(&(utf8_data[pos]), pp - pos);
pos = piMini(np + 1, str->size_s()); pos = piMini(pp + 1, utf8_size);
return ret; return ret;
} }
ssize_t PIIOString::readDevice(void * read_to, ssize_t max_size) { ssize_t PIIOString::readDevice(void * read_to, ssize_t max_size) {
if (!canRead() || !str || max_size <= 0) return -1; if (!canRead() || !str || max_size <= 0) return -1;
PIString rs = str->mid(pos, max_size); auto utf8_data = str->dataUTF8();
pos += max_size; ssize_t utf8_size = str->lastDataSize();
if (pos > str->size_s()) pos = str->size_s(); if (pos >= utf8_size) return 0;
const char * cc = rs.data(); int ret = piMini(max_size, utf8_size - pos);
int ret = strlen(cc); if (ret <= 0) return 0;
memcpy(read_to, cc, ret); memcpy(read_to, &(utf8_data[pos]), ret);
pos += ret;
return ret; return ret;
} }
@@ -98,6 +140,12 @@ int PIIOString::writeString(const PIString & string) {
} }
ssize_t PIIOString::bytesAvailable() const {
if (!str) return 0;
return str->size() - pos;
}
bool PIIOString::openDevice() { bool PIIOString::openDevice() {
pos = 0; pos = 0;
return (str != 0); return (str != 0);

View File

@@ -39,7 +39,7 @@ class PIP_EXPORT PIIOString: public PIIODevice {
public: public:
//! \~english Contructs %PIIOString with "string" content and "mode" open mode //! \~english Contructs %PIIOString with "string" content and "mode" open mode
//! \~russian Создает %PIIOString с содержимым "string" и режимом открытия "mode" //! \~russian Создает %PIIOString с содержимым "string" и режимом открытия "mode"
explicit PIIOString(PIString * string = 0, PIIODevice::DeviceMode mode = PIIODevice::ReadWrite); explicit PIIOString(PIString * string = 0, PIIODevice::DeviceMode mode = PIIODevice::ReadOnly);
//! \~english Contructs %PIIOString with "string" content only for read //! \~english Contructs %PIIOString with "string" content only for read
//! \~russian Создает %PIIOString с содержимым "string" только для чтения //! \~russian Создает %PIIOString с содержимым "string" только для чтения
@@ -51,10 +51,7 @@ public:
//! \~english Clear content string //! \~english Clear content string
//! \~russian Очищает содержимое строки //! \~russian Очищает содержимое строки
void clear() { void clear();
if (str) str->clear();
pos = 0;
}
//! \~english Open "string" content with "mode" open mode //! \~english Open "string" content with "mode" open mode
//! \~russian Открывает содержимое "string" с режимом открытия "mode" //! \~russian Открывает содержимое "string" с режимом открытия "mode"
@@ -66,10 +63,7 @@ public:
//! \~english Returns if position is at the end of content //! \~english Returns if position is at the end of content
//! \~russian Возвращает в конце содержимого ли позиция //! \~russian Возвращает в конце содержимого ли позиция
bool isEnd() const { bool isEnd() const;
if (!str) return true;
return pos >= str->size_s();
}
//! \~english Move read/write position to "position" //! \~english Move read/write position to "position"
@@ -78,15 +72,11 @@ public:
//! \~english Move read/write position to the beginning of the string //! \~english Move read/write position to the beginning of the string
//! \~russian Перемещает позицию чтения/записи на начало строки //! \~russian Перемещает позицию чтения/записи на начало строки
void seekToBegin() { void seekToBegin();
if (str) pos = 0;
}
//! \~english Move read/write position to the end of the string //! \~english Move read/write position to the end of the string
//! \~russian Перемещает позицию чтения/записи на конец строки //! \~russian Перемещает позицию чтения/записи на конец строки
void seekToEnd() { void seekToEnd();
if (str) pos = str->size_s();
}
//! \~english Read one text line and return it //! \~english Read one text line and return it
@@ -97,12 +87,7 @@ public:
//! \~russian Вставляет строку "string" в содержимое буфера в текущую позицию //! \~russian Вставляет строку "string" в содержимое буфера в текущую позицию
int writeString(const PIString & string); int writeString(const PIString & string);
ssize_t bytesAvailable() const override { ssize_t bytesAvailable() const override;
if (str)
return str->size() - pos;
else
return 0;
}
protected: protected:
bool openDevice() override; bool openDevice() override;

View File

@@ -770,8 +770,8 @@ void PISerial::applySettings() {
GetCommMask(PRIVATE->hCom, &PRIVATE->mask); GetCommMask(PRIVATE->hCom, &PRIVATE->mask);
SetCommMask(PRIVATE->hCom, EV_RXCHAR); SetCommMask(PRIVATE->hCom, EV_RXCHAR);
GetCommState(PRIVATE->hCom, &PRIVATE->sdesc); GetCommState(PRIVATE->hCom, &PRIVATE->sdesc);
piCoutObj << PRIVATE->sdesc.fBinary << PRIVATE->sdesc.fAbortOnError << PRIVATE->sdesc.fDsrSensitivity << PRIVATE->sdesc.fDtrControl // piCoutObj << PRIVATE->sdesc.fBinary << PRIVATE->sdesc.fAbortOnError << PRIVATE->sdesc.fDsrSensitivity << PRIVATE->sdesc.fDtrControl
<< PRIVATE->sdesc.fDummy2 << PRIVATE->sdesc.fErrorChar; // << PRIVATE->sdesc.fDummy2 << PRIVATE->sdesc.fErrorChar;
PRIVATE->desc = PRIVATE->sdesc; PRIVATE->desc = PRIVATE->sdesc;
PRIVATE->desc.DCBlength = sizeof(PRIVATE->desc); PRIVATE->desc.DCBlength = sizeof(PRIVATE->desc);
PRIVATE->desc.BaudRate = convertSpeed(outSpeed()); PRIVATE->desc.BaudRate = convertSpeed(outSpeed());

View File

@@ -324,6 +324,7 @@ void PIString::appendFromChars(const char * c, int s, const char * codepage) {
ucs2.copy((char16_t *)d.data(old_sz), ucs2.size()); ucs2.copy((char16_t *)d.data(old_sz), ucs2.size());
# endif # endif
#endif #endif
changed_ = true;
} }
@@ -455,6 +456,9 @@ PIString PIString::readableSize(llong bytes) {
void PIString::buildData(const char * cp) const { void PIString::buildData(const char * cp) const {
if (!changed_ && (last_loc_ == cp) && data_) return;
last_loc_ = cp;
changed_ = false;
deleteData(); deleteData();
#ifdef PIP_ICU #ifdef PIP_ICU
UErrorCode e((UErrorCode)0); UErrorCode e((UErrorCode)0);
@@ -464,7 +468,8 @@ void PIString::buildData(const char * cp) const {
data_ = (char *)malloc(len); data_ = (char *)malloc(len);
int sz = ucnv_fromUChars(cc, data_, len, (const UChar *)(d.data()), d.size_s(), &e); int sz = ucnv_fromUChars(cc, data_, len, (const UChar *)(d.data()), d.size_s(), &e);
ucnv_close(cc); ucnv_close(cc);
data_[sz] = '\0'; data_[sz] = '\0';
data_size_ = sz;
return; return;
} }
#else #else
@@ -477,13 +482,15 @@ void PIString::buildData(const char * cp) const {
} }
data_ = (char *)malloc(sz + 1); data_ = (char *)malloc(sz + 1);
WideCharToMultiByte((uint)(uintptr_t)cp, 0, (LPCWCH)d.data(), d.size_s(), (LPSTR)data_, sz, NULL, NULL); WideCharToMultiByte((uint)(uintptr_t)cp, 0, (LPCWCH)d.data(), d.size_s(), (LPSTR)data_, sz, NULL, NULL);
data_[sz] = '\0'; data_[sz] = '\0';
data_size_ = sz;
return; return;
# else # else
std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> ucs2conv; std::wstring_convert<std::codecvt_utf8<char16_t>, char16_t> ucs2conv;
std::string u8str = ucs2conv.to_bytes((char16_t *)d.data(), (char16_t *)d.data() + d.size()); std::string u8str = ucs2conv.to_bytes((char16_t *)d.data(), (char16_t *)d.data() + d.size());
data_ = (char *)malloc(u8str.size() + 1); data_ = (char *)malloc(u8str.size() + 1);
strcpy(data_, u8str.c_str()); strcpy(data_, u8str.c_str());
data_size_ = u8str.size();
# endif # endif
#endif #endif
} }
@@ -492,7 +499,8 @@ void PIString::buildData(const char * cp) const {
void PIString::deleteData() const { void PIString::deleteData() const {
if (!data_) return; if (!data_) return;
free(data_); free(data_);
data_ = nullptr; data_ = nullptr;
data_size_ = 0;
} }
@@ -594,6 +602,7 @@ PIString & PIString::operator+=(const wchar_t * str) {
while (str[++i]) { while (str[++i]) {
d.push_back(PIChar(str[i])); d.push_back(PIChar(str[i]));
} }
changed_ = true;
return *this; return *this;
} }
@@ -604,12 +613,14 @@ PIString & PIString::operator+=(const char16_t * str) {
while (str[++i]) { while (str[++i]) {
d.push_back(PIChar(str[i])); d.push_back(PIChar(str[i]));
} }
changed_ = true;
return *this; return *this;
} }
PIString & PIString::operator+=(const PIString & str) { PIString & PIString::operator+=(const PIString & str) {
d.append(str.d); d.append(str.d);
changed_ = true;
return *this; return *this;
} }
@@ -622,6 +633,7 @@ PIString & PIString::operator+=(const PIConstChars & str) {
d[os + l] = str[l]; d[os + l] = str[l];
} }
} }
changed_ = true;
return *this; return *this;
} }
@@ -729,6 +741,7 @@ PIString & PIString::cutMid(int start, int len) {
if (len > length() - start) len = length() - start; if (len > length() - start) len = length() - start;
d.remove(start, len); d.remove(start, len);
} }
changed_ = true;
return *this; return *this;
} }
@@ -781,6 +794,7 @@ PIString & PIString::replace(int from, int count, const PIString & with) {
d.remove(from, count); d.remove(from, count);
d.insert(from, with.d); d.insert(from, with.d);
} }
changed_ = true;
return *this; return *this;
} }
@@ -837,6 +851,7 @@ PIString & PIString::replaceAll(const PIString & what, const PIString & with) {
i += dl; i += dl;
} }
} }
changed_ = true;
return *this; return *this;
} }
@@ -863,6 +878,7 @@ PIString & PIString::replaceAll(const PIString & what, const char with) {
if (dl > 0) d.remove(i, dl); if (dl > 0) d.remove(i, dl);
d[i] = PIChar(with); d[i] = PIChar(with);
} }
changed_ = true;
return *this; return *this;
} }
@@ -879,6 +895,7 @@ PIString & PIString::replaceAll(const char what, const char with) {
for (int i = 0; i < l; ++i) { for (int i = 0; i < l; ++i) {
if (at(i) == what) d[i] = with; if (at(i) == what) d[i] = with;
} }
changed_ = true;
return *this; return *this;
} }
@@ -898,12 +915,14 @@ PIString & PIString::removeAll(const PIString & str) {
d.remove(i, l); d.remove(i, l);
i -= l; i -= l;
} }
changed_ = true;
return *this; return *this;
} }
PIString & PIString::insert(int index, const PIString & str) { PIString & PIString::insert(int index, const PIString & str) {
d.insert(index, str.d); d.insert(index, str.d);
changed_ = true;
return *this; return *this;
} }
@@ -920,6 +939,7 @@ PIString & PIString::elide(int size, float pos) {
int ls = piRoundf(ns * pos); int ls = piRoundf(ns * pos);
d.remove(ls, length() - ns); d.remove(ls, length() - ns);
d.insert(ls, s_dotdot.d); d.insert(ls, s_dotdot.d);
changed_ = true;
return *this; return *this;
} }

View File

@@ -71,10 +71,12 @@ public:
PIString & operator+=(const PIChar & c) { PIString & operator+=(const PIChar & c) {
d.push_back(c); d.push_back(c);
changed_ = true;
return *this; return *this;
} }
PIString & operator+=(const char c) { PIString & operator+=(const char c) {
d.push_back(PIChar(c)); d.push_back(PIChar(c));
changed_ = true;
return *this; return *this;
} }
PIString & operator+=(const char * str); PIString & operator+=(const char * str);
@@ -105,11 +107,17 @@ public:
//! \~english Contructs a copy of string. //! \~english Contructs a copy of string.
//! \~russian Создает копию строки. //! \~russian Создает копию строки.
PIString(const PIString & o) { d = o.d; } PIString(const PIString & o) {
d = o.d;
changed_ = true;
}
//! \~english Move constructor. //! \~english Move constructor.
//! \~russian Перемещающий конструктор. //! \~russian Перемещающий конструктор.
PIString(PIString && o): d(std::move(o.d)) { piSwap(data_, o.data_); } PIString(PIString && o): d(std::move(o.d)) {
piSwap(data_, o.data_);
changed_ = true;
}
//! \~english Contructs string with single character "c". //! \~english Contructs string with single character "c".
//! \~russian Создает строку из одного символа "c". //! \~russian Создает строку из одного символа "c".
@@ -197,7 +205,8 @@ public:
//! \~russian Оператор присваивания. //! \~russian Оператор присваивания.
PIString & operator=(const PIString & o) { PIString & operator=(const PIString & o) {
if (this == &o) return *this; if (this == &o) return *this;
d = o.d; d = o.d;
changed_ = true;
return *this; return *this;
} }
@@ -206,6 +215,7 @@ public:
PIString & operator=(PIString && o) { PIString & operator=(PIString && o) {
d.swap(o.d); d.swap(o.d);
piSwap(data_, o.data_); piSwap(data_, o.data_);
changed_ = true;
return *this; return *this;
} }
@@ -367,7 +377,10 @@ public:
//! \~russian Индекс элемента считается от `0`. //! \~russian Индекс элемента считается от `0`.
//! Индекс символа должен лежать в пределах от `0` до `size()-1`. //! Индекс символа должен лежать в пределах от `0` до `size()-1`.
//! Иначе это приведёт к неопределённому поведению программы и ошибкам памяти. //! Иначе это приведёт к неопределённому поведению программы и ошибкам памяти.
inline PIChar & operator[](size_t index) { return d[index]; } inline PIChar & operator[](size_t index) {
changed_ = true;
return d[index];
}
inline PIChar operator[](size_t index) const { return d[index]; } inline PIChar operator[](size_t index) const { return d[index]; }
//! \~english Read only access to character by `index`. //! \~english Read only access to character by `index`.
@@ -383,10 +396,16 @@ public:
//! \~english Returns the last character of the string. //! \~english Returns the last character of the string.
//! \~russian Возвращает последний символ строки. //! \~russian Возвращает последний символ строки.
inline PIChar & back() { return d.back(); } inline PIChar & back() {
changed_ = true;
return d.back();
}
inline PIChar back() const { return d.back(); } inline PIChar back() const { return d.back(); }
inline PIChar & front() { return d.front(); } inline PIChar & front() {
changed_ = true;
return d.front();
}
inline PIChar front() const { return d.front(); } inline PIChar front() const { return d.front(); }
//! \~english Sets size of the string, new characters are copied from `c`. //! \~english Sets size of the string, new characters are copied from `c`.
@@ -402,6 +421,7 @@ public:
//! \~\sa \a size(), \a clear() //! \~\sa \a size(), \a clear()
inline PIString & resize(size_t new_size, PIChar c = PIChar()) { inline PIString & resize(size_t new_size, PIChar c = PIChar()) {
d.resize(new_size, c); d.resize(new_size, c);
changed_ = true;
return *this; return *this;
} }
@@ -409,6 +429,7 @@ public:
//! \~russian Удаляет один символ с конца строки. //! \~russian Удаляет один символ с конца строки.
inline PIString & pop_back() { inline PIString & pop_back() {
d.pop_back(); d.pop_back();
changed_ = true;
return *this; return *this;
} }
@@ -416,6 +437,7 @@ public:
//! \~russian Удаляет один символ с начала строки. //! \~russian Удаляет один символ с начала строки.
inline PIString & pop_front() { inline PIString & pop_front() {
d.pop_front(); d.pop_front();
changed_ = true;
return *this; return *this;
} }
@@ -423,6 +445,7 @@ public:
//! \~russian Удаляет символы из строки, начиная с позиции `index` в количестве `count`. //! \~russian Удаляет символы из строки, начиная с позиции `index` в количестве `count`.
inline PIString & remove(size_t index, size_t count = 1) { inline PIString & remove(size_t index, size_t count = 1) {
d.remove(index, count); d.remove(index, count);
changed_ = true;
return *this; return *this;
} }
@@ -430,6 +453,7 @@ public:
//! \~russian Заполняет всю строку символами `c`. //! \~russian Заполняет всю строку символами `c`.
inline PIString & fill(PIChar c = PIChar()) { inline PIString & fill(PIChar c = PIChar()) {
d.fill(c); d.fill(c);
changed_ = true;
return *this; return *this;
} }
@@ -444,6 +468,7 @@ public:
//! \~russian Вставляет "str" в начало строки. //! \~russian Вставляет "str" в начало строки.
PIString & prepend(const PIString & str) { PIString & prepend(const PIString & str) {
d.prepend(str.d); d.prepend(str.d);
changed_ = true;
return *this; return *this;
} }
@@ -451,6 +476,7 @@ public:
//! \~russian Вставляет символ `c` в начало строки. //! \~russian Вставляет символ `c` в начало строки.
PIString & prepend(const PIChar c) { PIString & prepend(const PIChar c) {
d.prepend(c); d.prepend(c);
changed_ = true;
return *this; return *this;
} }
@@ -458,6 +484,7 @@ public:
//! \~russian Вставляет символ `c` в начало строки. //! \~russian Вставляет символ `c` в начало строки.
PIString & prepend(const char c) { PIString & prepend(const char c) {
d.prepend(PIChar(c)); d.prepend(PIChar(c));
changed_ = true;
return *this; return *this;
} }
@@ -465,6 +492,7 @@ public:
//! \~russian Вставляет "str" в начало строки. //! \~russian Вставляет "str" в начало строки.
PIString & push_front(const char * str) { PIString & push_front(const char * str) {
insert(0, str); insert(0, str);
changed_ = true;
return *this; return *this;
} }
@@ -479,6 +507,7 @@ public:
//! \~russian Вставляет "str" в начало строки. //! \~russian Вставляет "str" в начало строки.
PIString & push_front(const PIString & str) { PIString & push_front(const PIString & str) {
d.push_front(str.d); d.push_front(str.d);
changed_ = true;
return *this; return *this;
} }
@@ -486,6 +515,7 @@ public:
//! \~russian Вставляет символ `c` в начало строки. //! \~russian Вставляет символ `c` в начало строки.
PIString & push_front(const PIChar c) { PIString & push_front(const PIChar c) {
d.push_front(c); d.push_front(c);
changed_ = true;
return *this; return *this;
} }
@@ -493,6 +523,7 @@ public:
//! \~russian Вставляет символ `c` в начало строки. //! \~russian Вставляет символ `c` в начало строки.
PIString & push_front(const char c) { PIString & push_front(const char c) {
d.push_front(PIChar(c)); d.push_front(PIChar(c));
changed_ = true;
return *this; return *this;
} }
@@ -514,6 +545,7 @@ public:
//! \~russian Вставляет "str" в конец строки. //! \~russian Вставляет "str" в конец строки.
PIString & append(const PIString & str) { PIString & append(const PIString & str) {
d.append(str.d); d.append(str.d);
changed_ = true;
return *this; return *this;
} }
@@ -526,6 +558,7 @@ public:
//! \~russian Вставляет символ `c` в конец строки. //! \~russian Вставляет символ `c` в конец строки.
PIString & append(const PIChar c) { PIString & append(const PIChar c) {
d.append(c); d.append(c);
changed_ = true;
return *this; return *this;
} }
@@ -533,6 +566,7 @@ public:
//! \~russian Вставляет символ `c` в конец строки. //! \~russian Вставляет символ `c` в конец строки.
PIString & append(const char c) { PIString & append(const char c) {
d.append(PIChar(c)); d.append(PIChar(c));
changed_ = true;
return *this; return *this;
} }
@@ -547,6 +581,7 @@ public:
//! \~russian Вставляет "str" в конец строки. //! \~russian Вставляет "str" в конец строки.
PIString & push_back(const PIString & str) { PIString & push_back(const PIString & str) {
d.push_back(str.d); d.push_back(str.d);
changed_ = true;
return *this; return *this;
} }
@@ -559,6 +594,7 @@ public:
//! \~russian Вставляет символ `c` в конец строки. //! \~russian Вставляет символ `c` в конец строки.
PIString & push_back(const PIChar c) { PIString & push_back(const PIChar c) {
d.push_back(c); d.push_back(c);
changed_ = true;
return *this; return *this;
} }
@@ -566,6 +602,7 @@ public:
//! \~russian Вставляет символ `c` в конец строки. //! \~russian Вставляет символ `c` в конец строки.
PIString & push_back(const char c) { PIString & push_back(const char c) {
d.push_back(PIChar(c)); d.push_back(PIChar(c));
changed_ = true;
return *this; return *this;
} }
@@ -741,6 +778,7 @@ public:
//! \~russian Удаляет все найденные символы "what", возвращает эту строку. //! \~russian Удаляет все найденные символы "what", возвращает эту строку.
PIString & removeAll(char c) { PIString & removeAll(char c) {
d.removeAll(PIChar(c)); d.removeAll(PIChar(c));
changed_ = true;
return *this; return *this;
} }
@@ -757,6 +795,7 @@ public:
PIString ss(*this); PIString ss(*this);
times--; times--;
piForTimes(times) * this += ss; piForTimes(times) * this += ss;
changed_ = true;
return *this; return *this;
} }
@@ -784,6 +823,7 @@ public:
//! \endcode //! \endcode
PIString & insert(const int index, const PIChar c) { PIString & insert(const int index, const PIChar c) {
d.insert(index, c); d.insert(index, c);
changed_ = true;
return *this; return *this;
} }
@@ -840,6 +880,7 @@ public:
//! \~\sa \a expandLeftTo(), \a expandedRightTo(), \a expandedLeftTo() //! \~\sa \a expandLeftTo(), \a expandedRightTo(), \a expandedLeftTo()
PIString & expandRightTo(const int len, const PIChar c) { PIString & expandRightTo(const int len, const PIChar c) {
if (len > d.size_s()) d.resize(len, c); if (len > d.size_s()) d.resize(len, c);
changed_ = true;
return *this; return *this;
} }
@@ -856,6 +897,7 @@ public:
//! \~\sa \a expandRightTo(), \a expandedRightTo(), \a expandedLeftTo() //! \~\sa \a expandRightTo(), \a expandedRightTo(), \a expandedLeftTo()
PIString & expandLeftTo(const int len, const PIChar c) { PIString & expandLeftTo(const int len, const PIChar c) {
if (len > d.size_s()) insert(0, PIString(len - d.size_s(), c)); if (len > d.size_s()) insert(0, PIString(len - d.size_s(), c));
changed_ = true;
return *this; return *this;
} }
@@ -893,6 +935,7 @@ public:
PIString & quote(PIChar c = PIChar('"')) { PIString & quote(PIChar c = PIChar('"')) {
d.prepend(c); d.prepend(c);
d.append(c); d.append(c);
changed_ = true;
return *this; return *this;
} }
@@ -918,6 +961,7 @@ public:
//! \~\sa \a reversed() //! \~\sa \a reversed()
PIString & reverse() { PIString & reverse() {
d.reverse(); d.reverse();
changed_ = true;
return *this; return *this;
} }
@@ -1051,6 +1095,10 @@ public:
//! \~russian Возвращает \c char * представление строки в кодировке ASCII. //! \~russian Возвращает \c char * представление строки в кодировке ASCII.
const char * dataAscii() const; const char * dataAscii() const;
//! \~english Returns data size of last data*() call.
//! \~russian Возвращает размер данных последнего вызова data*().
const size_t lastDataSize() const { return data_size_; }
//! \~english Returns hash of string //! \~english Returns hash of string
//! \~russian Возвращает хэш строки //! \~russian Возвращает хэш строки
uint hash() const; uint hash() const;
@@ -1279,7 +1327,10 @@ public:
//! \~english Reserved memory will not be released. //! \~english Reserved memory will not be released.
//! \~russian Зарезервированная память не освободится. //! \~russian Зарезервированная память не освободится.
//! \~\sa \a resize() //! \~\sa \a resize()
void clear() { d.clear(); } void clear() {
d.clear();
changed_ = true;
}
//! \~english Returns \c true if string equal "true", "yes", "on" or positive not null numeric value. //! \~english Returns \c true if string equal "true", "yes", "on" or positive not null numeric value.
//! \~russian Возвращает \c true если строка равна "true", "yes", "on" или числу > 0. //! \~russian Возвращает \c true если строка равна "true", "yes", "on" или числу > 0.
@@ -1804,7 +1855,10 @@ private:
void trimsubstr(int & st, int & fn) const; void trimsubstr(int & st, int & fn) const;
PIDeque<PIChar> d; PIDeque<PIChar> d;
mutable char * data_ = nullptr; mutable bool changed_ = true;
mutable const char * last_loc_ = nullptr;
mutable char * data_ = nullptr;
mutable size_t data_size_ = 0;
}; };
//! \relatesalso PIBinaryStream //! \relatesalso PIBinaryStream
@@ -1820,6 +1874,7 @@ BINARY_STREAM_WRITE(PIString) {
//! \~russian Оператор извлечения. //! \~russian Оператор извлечения.
BINARY_STREAM_READ(PIString) { BINARY_STREAM_READ(PIString) {
s >> v.d; s >> v.d;
v.changed_ = true;
if (s.wasReadError()) v.clear(); if (s.wasReadError()) v.clear();
return s; return s;
} }