diff --git a/libs/main/core/pistring.cpp b/libs/main/core/pistring.cpp index 34fd1a26..5c6d293c 100644 --- a/libs/main/core/pistring.cpp +++ b/libs/main/core/pistring.cpp @@ -483,59 +483,65 @@ bool PIString::operator >(const PIString & str) const { //! \~\details //! \~english //! If "len" < 0 then returns substring from symbol "start" to end. +//! "start" should be >= 0. //! \~russian //! Если "len" < 0 тогда возвращается подстрока от символа "start" и до конца. +//! "start" должен быть >= 0. //! \~\code //! PIString s("0123456789"); -//! piCout << s.mid(-2, -1); // s = "0123456789" -//! piCout << s.mid(-2, 4); // s = "01" -//! piCout << s.mid(3, -1); // s = "3456789" +//! piCout << s.mid(0, -1); // s = "0123456789" +//! piCout << s.mid(0, 2); // s = "01" +//! piCout << s.mid(3); // s = "3456789" //! piCout << s.mid(3, 4); // s = "3456" //! piCout << s.mid(7, 1); // s = "7" //! piCout << s.mid(7, 4); // s = "789" +//! piCout << s.mid(-1); // s = "" //! \endcode //! \~\sa \a left(), \a right() -PIString PIString::mid(const int start, const int len) const { - //PIString str; - int s = start, l = len; - if (l == 0 || s >= length()) return PIString(); - if (s < 0) { - l += s; - s = 0; +PIString PIString::mid(int start, int len) const { + if (len == 0 || start >= length()) return PIString(); + if (start < 0) { + return PIString(); } - if (l < 0) { - return PIString(d.data(s), size_s() - s); + if (len < 0) { + return PIString(d.data(start), size_s() - start); } else { - if (l > length() - s) l = length() - s; - return PIString(d.data(s), l); + if (len > length() - start) len = length() - start; + return PIString(d.data(start), len); } return PIString(); } //! \~\details +//! \~english +//! If "len" < 0 then remove substring from symbol "start" to end. +//! "start" should be >= 0. +//! \~russian +//! Если "len" < 0 тогда удаляется подстрока от символа "start" и до конца. +//! "start" должен быть >= 0. //! \~\code //! PIString s("0123456789"); //! s.cutMid(1, 3); //! piCout << s; // s = "0456789" -//! s.cutMid(-1, 3); +//! s.cutMid(0, 2); //! piCout << s; // s = "56789" //! s.cutMid(3, -1); //! piCout << s; // s = "567" +//! s.cutMid(-1, -1); +//! piCout << s; // s = "567" //! \endcode //! \~\sa \a cutLeft(), \a cutRight() -PIString & PIString::cutMid(const int start, const int len) { - int s = start, l = len; - if (l == 0) return *this; - if (s < 0) { - l += s; - s = 0; +PIString & PIString::cutMid(int start, int len) { + if (len == 0) return *this; + if (start < 0) { + return *this; } - if (l < 0) { - d.remove(s, size() - s); + if (len < 0) { + d.remove(start, size() - start); } else { - if (l > length() - s) l = length() - s; - d.remove(s, l); + if (len > length() - start) len = length() - start; + d.remove(start, len); } return *this; } diff --git a/libs/main/core/pistring.h b/libs/main/core/pistring.h index 98557968..9266de92 100644 --- a/libs/main/core/pistring.h +++ b/libs/main/core/pistring.h @@ -433,11 +433,11 @@ public: //! \~english Returns part of string from character at index "start" and maximum length "len". //! \~russian Возвращает подстроку от символа "start" и максимальной длиной "len". - PIString mid(const int start, const int len = -1) const; + PIString mid(int start, int len = -1) const; //! \~english Synonym of \a mid(). //! \~russian Аналог \a mid(). - PIString subString(const int start, const int len = -1) const {return mid(start, len);} + PIString subString(int start, int len = -1) const {return mid(start, len);} //! \~english Returns part of string from start and maximum length "len". //! \~russian Возвращает подстроку от начала и максимальной длиной "len". @@ -450,7 +450,7 @@ public: //! piCout << s.left(15); // s = "0123456789" //! \endcode //! \~\sa \a mid(), \a right() - PIString left(const int len) const {return len <= 0 ? PIString() : mid(0, len);} + PIString left(int len) const {return len <= 0 ? PIString() : mid(0, len);} //! \~english Returns part of string at end and maximum length "len". //! \~russian Возвращает подстроку максимальной длиной "len" и до конца. @@ -463,11 +463,11 @@ public: //! piCout << s.right(15); // s = "0123456789" //! \endcode //! \~\sa \a mid(), \a left() - PIString right(const int len) const {return len <= 0 ? PIString() : mid(size() - len, len);} + PIString right(int len) const {return len <= 0 ? PIString() : mid(size() - len, len);} //! \~english Remove part of string from character as index "start" and maximum length "len" and return this string. //! \~russian Удаляет часть строки от символа "start" и максимальной длины "len", возвращает эту строку. - PIString & cutMid(const int start, const int len); + PIString & cutMid(int start, int len); //! \~english Remove part of string from start and maximum length "len" and return this string. //! \~russian Удаляет часть строки от начала и максимальной длины "len", возвращает эту строку. @@ -482,7 +482,7 @@ public: //! piCout << s; // s = "" //! \endcode //! \~\sa \a cutMid(), \a cutRight() - PIString & cutLeft(const int len) {return len <= 0 ? *this : cutMid(0, len);} + PIString & cutLeft(int len) {return len <= 0 ? *this : cutMid(0, len);} //! \~english Remove part of string at end and maximum length "len" and return this string. //! \~russian Удаляет часть строки максимальной длины "len" от конца, возвращает эту строку. @@ -497,7 +497,7 @@ public: //! piCout << s; // s = "" //! \endcode //! \~\sa \a cutMid(), \a cutLeft() - PIString & cutRight(const int len) {return len <= 0 ? *this : cutMid(size() - len, len);} + PIString & cutRight(int len) {return len <= 0 ? *this : cutMid(size() - len, len);} //! \~english Remove spaces at the start and at the end of string and return this string. //! \~russian Удаляет пробельные символы с начала и конца строки и возвращает эту строку. diff --git a/main.cpp b/main.cpp index ec000d11..56562d12 100644 --- a/main.cpp +++ b/main.cpp @@ -1,35 +1,32 @@ #include "pip.h" +#include "piiostream.h" using namespace PICoutManipulators; int main(int argc, char * argv[]) { - PIByteArray ba = PIByteArray::fromHex("AA1122BB11233AA4455"); - PIIOByteArray b; - b.open(ba); - PIPacketExtractor p(&b); - p.setSplitMode(PIPacketExtractor::Header); - p.setHeader(PIByteArray::fromHex("00")); - p.setFooter(PIByteArray::fromHex("AA")); - p.setPayloadSize(2); - p.setThreadedReadSlot([](const uchar * data, int size, void * d) { - return true; - }); - p.setHeaderCheckSlot([](const uchar * src, const uchar * rec, int size)->int { - if (*src == *rec) { - if (rec[0] == 0xAA) return 2; - if (rec[0] == 0xBB) return 3; - } - return -1; - }); -// p.setPayloadCheckSlot([](const uchar * data, int size) { -// return data[1] == 0xFF; -// }); - CONNECTL(&p, packetReceived, ([](const uchar * data, int size){ - piCout << PIByteArray(data, size).toHex(); - })); - p.startThreadedRead(); - piMSleep(100); - p.stop(); - return 0; + { + PIString s("0123456789"); + piCout << s.mid(0, -1); // s = "0123456789" + piCout << s.mid(0, 2); // s = "01" + piCout << s.mid(3, -1); // s = "3456789" + piCout << s.mid(3, 4); // s = "3456" + piCout << s.mid(7, 1); // s = "7" + piCout << s.mid(7, 4); // s = "789" + piCout << s.mid(-1); // s = "" + //! \endcode + //! \~\sa \a left(), \a right() + } + + //! \~\details + //! \~\code + PIString s("0123456789"); + s.cutMid(1, 3); + piCout << s; // s = "0456789" + s.cutMid(0, 2); + piCout << s; // s = "56789" + s.cutMid(3, -1); + piCout << s; // s = "567" + s.cutMid(-1, -1); + piCout << s; // s = "567" }