QTextStream: use new QString::resize(int, QChar) for padding

Change-Id: I17c90ea32614c45f038f5f3386749dfa74bad438
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
This commit is contained in:
Marc Mutz 2015-10-21 22:21:03 +02:00
parent 8f166ccf40
commit 17504a7b32
2 changed files with 26 additions and 20 deletions

View File

@ -859,6 +859,21 @@ void QTextStreamPrivate::write(QLatin1String data)
} }
} }
/*!
\internal
*/
void QTextStreamPrivate::writePadding(int len)
{
if (string) {
// ### What about seek()??
string->resize(string->size() + len, params.padChar);
} else {
writeBuffer.resize(writeBuffer.size() + len, params.padChar);
if (writeBuffer.size() > QTEXTSTREAM_BUFFERSIZE)
flushWriteBuffer();
}
}
/*! /*!
\internal \internal
*/ */
@ -916,31 +931,24 @@ QTextStreamPrivate::PaddingResult QTextStreamPrivate::padding(int len) const
{ {
Q_ASSERT(params.fieldWidth > len); // calling padding() when no padding is needed is an error Q_ASSERT(params.fieldWidth > len); // calling padding() when no padding is needed is an error
// Do NOT break NRVO in this function or kittens will die! int left = 0, right = 0;
PaddingResult result;
const int padSize = params.fieldWidth - len; const int padSize = params.fieldWidth - len;
result.padding.resize(padSize);
std::fill_n(result.padding.begin(), padSize, params.padChar);
switch (params.fieldAlignment) { switch (params.fieldAlignment) {
case QTextStream::AlignLeft: case QTextStream::AlignLeft:
result.left = 0; right = padSize;
result.right = padSize;
break; break;
case QTextStream::AlignRight: case QTextStream::AlignRight:
case QTextStream::AlignAccountingStyle: case QTextStream::AlignAccountingStyle:
result.left = padSize; left = padSize;
result.right = 0;
break; break;
case QTextStream::AlignCenter: case QTextStream::AlignCenter:
result.left = padSize/2; left = padSize/2;
result.right = padSize - padSize/2; right = padSize - padSize/2;
break; break;
} }
const PaddingResult result = { left, right };
return result; return result;
} }
@ -965,9 +973,9 @@ void QTextStreamPrivate::putString(const QChar *data, int len, bool number)
} }
} }
write(pad.padding.constData(), pad.left); writePadding(pad.left);
write(data, len); write(data, len);
write(pad.padding.constData(), pad.right); writePadding(pad.right);
} else { } else {
write(data, len); write(data, len);
} }
@ -993,9 +1001,9 @@ void QTextStreamPrivate::putString(QLatin1String data, bool number)
} }
} }
write(pad.padding.constData(), pad.left); writePadding(pad.left);
write(data); write(data);
write(pad.padding.constData(), pad.right); writePadding(pad.right);
} else { } else {
write(data); write(data);
} }

View File

@ -169,6 +169,7 @@ public:
inline void write(QChar ch); inline void write(QChar ch);
void write(const QChar *data, int len); void write(const QChar *data, int len);
void write(QLatin1String data); void write(QLatin1String data);
void writePadding(int len);
inline void putString(const QString &ch, bool number = false) { putString(ch.constData(), ch.length(), number); } inline void putString(const QString &ch, bool number = false) { putString(ch.constData(), ch.length(), number); }
void putString(const QChar *data, int len, bool number = false); void putString(const QChar *data, int len, bool number = false);
void putString(QLatin1String data, bool number = false); void putString(QLatin1String data, bool number = false);
@ -176,10 +177,7 @@ public:
void putNumber(qulonglong number, bool negative); void putNumber(qulonglong number, bool negative);
struct PaddingResult { struct PaddingResult {
enum { PreallocatedPadding = 80 }; // typical line length
int left, right; int left, right;
QVarLengthArray<QChar, PreallocatedPadding> padding;
}; };
PaddingResult padding(int len) const; PaddingResult padding(int len) const;