51 QByteArray XStringMap::_nullValue;
61 : _keyList( other._keyList)
62 , _valList( other._valList)
89 _keyList = other._keyList;
90 _valList = other._valList;
97 void XStringMap::init()
117 _keyList.resize( _size);
118 _valList.resize( _size);
132 _options = newOptions;
138 if (
key == arnNullptr)
return -1;
140 for (
int i = from; i < _size; ++i) {
141 if (_keyList.at(i) ==
key) {
151 for (
int i = from; i < _size; ++i) {
152 if (_keyList.at(i) ==
key) {
168 for (
int i = from; i < _size; ++i) {
169 if (_valList.at(i) ==
value) {
186 int keyPrefixLen = int( strlen( keyPrefix));
188 for (
int i = 0; i < _size; ++i) {
189 if (_keyList.at(i).startsWith( keyPrefix)) {
190 int num = _keyList.at(i).mid( keyPrefixLen).toInt( &isOk);
191 if (isOk && (num > maxEnum))
201 if (
key == arnNullptr)
return *
this;
204 _keyList[ _size].resize(0);
205 _valList[ _size].resize(0);
206 _keyList[ _size] +=
key;
207 _valList[ _size] += val;
216 return add(
key, QByteArray( val));
224 key += QByteArray::number( eNum);
226 return add(
key.constData(), val);
232 return add(
key.constData(), val);
238 return add(
key, val.toUtf8());
244 return add( keyPrefix, eNum, val.toUtf8());
250 return add(
key, val.toUtf8());
256 return add(
key.toUtf8(), val.toUtf8());
262 for (
int i = 0; i < other._size; ++i) {
263 add( other._keyList.at(i), other._valList.at(i));
272 QMapIterator<QString,QVariant> i( variantMap);
274 while (i.hasNext()) {
276 const QVariant&
value = i.value();
277 QByteArray valBytes =
value.type() == int(QMetaType::QByteArray) ?
value.toByteArray()
278 :
value.toString().toUtf8();
279 add( i.key().toUtf8(), valBytes);
288 return add(
key, QByteArray::number( val, 10));
294 return add(
key, QByteArray::number( val, 10));
300 return add(
key, QString::number( val, 10));
306 return add(
key, QByteArray::number( val, 10));
312 return add(
key, QByteArray::number( val, 10));
318 return add(
key, QString::number( val, 10));
324 int prec = precision >= 0 ? precision : std::numeric_limits<double>::digits10;
325 return add(
key, QByteArray::number( val,
'g', prec));
331 int prec = precision >= 0 ? precision : std::numeric_limits<double>::digits10;
332 return add(
key, QByteArray::number( val,
'g', prec));
338 int prec = precision >= 0 ? precision : std::numeric_limits<double>::digits10;
339 return add(
key, QString::number( val,
'g', prec));
345 foreach (
const QString& str, stringList) {
355 if ((i < 0) || (i >= _size))
return *
this;
357 _valList[i].resize(0);
366 return set( i, val.toUtf8());
384 return set(
key, QByteArray( val));
390 return set(
key.constData(), val);
396 return set(
key, val.toUtf8());
402 return set(
key, val.toUtf8());
408 return set(
key.toUtf8(), val.toUtf8());
414 if ((i < 0) || (i >= _size))
return *
this;
416 _keyList[i].resize(0);
425 if ((i < 0) || (i >= _size))
return _nullValue;
427 return _keyList.at(i);
433 if ((i < 0) || (i >= _size))
return def ? QByteArray( def) : QByteArray();
435 return _keyList.at(i);
442 if (i < 0)
return def ? QByteArray( def) : QByteArray();
444 return _keyList.at(i);
456 if ((i < 0) || (i >= _size))
return def;
458 const QByteArray&
key = _keyList.at(i);
459 return QString::fromUtf8(
key.constData(),
key.size());
472 if ((i < 0) || (i >= _size))
return _nullValue;
474 return _valList.at(i);
480 if ((i < 0) || (i >= _size))
return def ? QByteArray( def) : QByteArray();
482 return _valList.at(i);
489 if (i < 0)
return def ? QByteArray( def) : QByteArray();
491 return _valList.at(i);
502 key += QByteArray::number( eNum);
511 if (i < 0)
return def ? QByteArray( def) : QByteArray();
513 return _valList.at(i);
523 return _valList.at(i);
529 if ((i < 0) || (i >= _size))
return def;
531 const QByteArray& val = _valList.at(i);
532 return QString::fromUtf8( val.constData(), val.size());
545 if (!keyPrefix) keyPrefix =
"";
549 key += QByteArray::number( eNum);
571 if ((index < 0) || (index >= _size))
return *
this;
573 for (
int i = index; i < _size - 1; ++i) {
574 _keyList[i].resize(0);
575 _valList[i].resize(0);
576 _keyList[i] += _keyList.at(i + 1);
577 _valList[i] += _valList.at(i + 1);
617 for (
int i = 0; i < _size; ++i) {
618 if (_keyList.at(i).isEmpty()) {
619 _keyList[i].resize(0);
620 _keyList[i] += _valList.at(i);
628 if (_size <= 1)
return;
631 for (
int i = 0; i < _size / 2; ++i) {
632 int ir = _size - i - 1;
633 key = _keyList.at( i);
634 val = _valList.at( i);
635 _keyList[ i].resize( 0);
636 _valList[ i].resize( 0);
637 _keyList[ i] += _keyList.at( ir);
638 _valList[ i] += _valList.at( ir);
639 _keyList[ ir].resize( 0);
640 _valList[ ir].resize( 0);
641 _keyList[ ir] +=
key;
642 _valList[ ir] += val;
650 for (
int i = 0; i < _size; ++i) {
651 const QByteArray&
key = _keyList.at(i);
652 retList += QString::fromUtf8(
key.constData(),
key.size());
660 if (!keyPrefix) keyPrefix =
"";
663 for (
int i = 0; i < _size; ++i) {
664 if (*keyPrefix && !_keyList.at(i).startsWith( keyPrefix))
continue;
666 const QByteArray&
value = _valList.at(i);
667 retList += QString::fromUtf8(
value.constData(),
value.size());
677 for (
int i = 0; i < _size; ++i) {
678 const QByteArray&
key = _keyList.at(i);
679 const QByteArray&
value = _valList.at(i);
680 retMap.insert( QString::fromUtf8(
key.constData(),
key.size()),
681 useStringVal ? QVariant( QString::fromUtf8(
value))
692 QByteArray outXString;
694 for (
int i = 0; i < _size; ++i) {
697 const QByteArray&
key = _keyList.at(i);
698 const QByteArray& val = _valList.at(i);
699 bool useOrgKey =
true;
704 outXString += txtCoded;
712 if (optFrame && !_hasBinCode) {
713 QByteArray valLenTxt = QByteArray::number( val.size());
714 bool useFrame = txtCoded.size() > val.size() + valLenTxt.size() + 4;
717 outXString += valLenTxt;
724 if (!
key.isEmpty() || val.isEmpty() || _hasEqChar) {
727 outXString += txtCoded;
736 return QString::fromUtf8( xstr.constData(), xstr.size());
742 if ((
size < 0) || (
size > inXString.size())) {
743 size = inXString.size();
746 if (
size == 0)
return true;
754 bool isFrame =
false;
755 if (startPos >=
size) {
758 while ( inXString.at( startPos) ==
' ') {
764 int posEq = inXString.indexOf(
'=', startPos);
765 int posSep = inXString.indexOf(
' ', startPos);
766 if (posSep < 0 || posSep >=
size) {
769 if ((posEq >= 0) && (posEq < posSep)) {
770 int keyOrgStart = startPos;
772 if ((posEq > startPos) && (inXString.at( posEq - 1) ==
'|')) {
774 int posFrSt = inXString.indexOf(
'<', posEq + 1);
776 bool frameLenOk =
false;
777 if ((posFrSt > posEq) && (posFrSt <
size - 1)) {
778 frameLen = inXString.mid( posEq + 1, posFrSt - posEq - 1).toInt( &frameLenOk);
780 int posFrEn = posFrSt + frameLen + 1;
781 if (frameLenOk && (posFrEn <
size) && (inXString.at( posFrEn) ==
'>')) {
782 keyOrgLen = posEq - startPos - 1;
783 startPos = posFrSt + 1;
784 posSep = posFrEn + 1;
789 keyOrgLen = posEq - startPos;
790 startPos = posEq + 1;
792 if ((keyOrgLen >= 2) && (inXString.at( keyOrgStart) ==
'^') && (inXString.at( keyOrgStart + 1) ==
':')) {
794 txtCoded.append( inXString.constData() + keyOrgStart + 2, keyOrgLen - 2);
798 key.append( inXString.constData() + keyOrgStart, keyOrgLen);
805 val.append( inXString.constData() + startPos, posSep - startPos - 1);
809 txtCoded.append( inXString.constData() + startPos, posSep - startPos);
812 startPos = posSep + 1;
835 int srcSize = src.size();
836 const char* srcP = src.constData();
838 dst.resize( 2 * srcSize);
839 char* dstStart = dst.data();
840 char* dstP = dstStart;
841 char* dstP0 = dstStart;
842 const char* srcRepLim = arnNullptr;
844 bool actNullTilde =
false;
845 qint16 lastChar = -1;
846 uchar lastCharInc = 1;
849 for (
int i = 0; i < srcSize; ++i) {
850 srcChar = uchar( *srcP++);
851 if (optRepeatLen && (srcP >= srcRepLim)) {
852 if (srcChar == lastChar) {
854 if ((sameCount < 9) && (i < srcSize - 1))
continue;
855 if (sameCount * lastCharInc > 2 ) {
857 *dstP++ =
'0' + sameCount;
863 srcP -= sameCount - 1;
868 else if (sameCount >= 1) {
869 if (sameCount * lastCharInc > 2 ) {
871 *dstP++ =
'0' + sameCount;
941 else if (optNullTilde) {
955 *dstP++ = char(
'A' + srcChar - 1);
959 *dstP++ = char(srcChar);
963 lastCharInc = dstP - dstP0;
965 dst.resize(
int( dstP - dstStart));
966 _hasChgCode |= _hasBinCode;
972 int srcSize = src.size();
973 const char* srcP = src.constData();
975 dst.resize( srcSize * 5);
976 char* dstStart = dst.data();
977 char* dstP = dstStart;
979 bool actNullTilde =
false;
980 bool escapeFlag =
false;
981 bool ctrlFlag =
false;
982 qint16 lastChar = -1;
986 for (
int i = 0; i < srcSize; ++i) {
989 srcChar = uchar( *srcP++);
1006 if ((srcChar >=
'1') && (srcChar <=
'9')) {
1008 repeatCount = srcChar -
'0';
1015 else if (ctrlFlag) {
1020 actNullTilde =
true;
1023 if ((srcChar >=
'A') && (srcChar <=
'A' + 30)) {
1024 dstChar = uchar( srcChar -
'A' + 1);
1052 for (uchar i = 0; i < repeatCount; ++i) {
1053 *dstP++ = uchar( dstChar);
1058 dst.resize(
int( dstP - dstStart));
1080 void XStringMap::checkSpace()
1082 if (_size >= _keyList.size()) {
1083 int newCapacity = (_size > 0) ? (2 * _size) : 8;
1084 _keyList.reserve( newCapacity);
1085 _valList.reserve( newCapacity);
1086 _keyList.resize( newCapacity);
1087 _valList.resize( newCapacity);
void setEmptyKeysToValue()
int maxEnumOf(const char *keyPrefix) const
int indexOf(const char *key, int from=0) const
#define ARNXSTRINGMAP_VER
bool fromXString(const QByteArray &inXString, int size=-1)
QStringList values(const char *keyPrefix=arnNullptr) const
void stringCode(QByteArray &dst, const QByteArray &src) const
QMultiMap< QString, QVariant > MQVariantMap
Container class with string representation for serialized data.
XStringMap & set(int i, const QByteArray &val)
QString keyString(int i, const QString &def=QString()) const
XStringMap & addValues(const QStringList &stringList)
const QByteArray & keyRef(int i) const
XStringMap & setKey(int i, const QByteArray &key)
void stringDecode(QByteArray &dst, const QByteArray &src) const
void setOptions(const Options &newOptions)
const Options & options() const
QByteArray value(int i, const char *def=arnNullptr) const
const QByteArray & valueRef(int i) const
void clear(bool freeMem=false)
MQVariantMap toVariantMap(bool useStringVal) const
XStringMap & addNum(const char *key, int val)
QByteArray toXString() const
XStringMap & operator+=(const XStringMap &other)
XStringMap & operator=(const XStringMap &other)
Make shallow copy (Qt style)
XStringMap & removeValue(const QByteArray &val)
QString valueString(int i, const QString &def=QString()) const
QByteArray key(int i, const char *def=arnNullptr) const
int indexOfValue(const QByteArray &value, int from=0) const
XStringMap & remove(int index)
QString toXStringString() const
XStringMap & add(const char *key, const QByteArray &val)