diff options
Diffstat (limited to 'src/corelib/io')
-rw-r--r-- | src/corelib/io/qtextstream.cpp | 42 | ||||
-rw-r--r-- | src/corelib/io/qtextstream_p.h | 4 |
2 files changed, 26 insertions, 20 deletions
diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp index adf9e1aa55..9f0a8c08ed 100644 --- a/src/corelib/io/qtextstream.cpp +++ b/src/corelib/io/qtextstream.cpp @@ -862,6 +862,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 +*/ inline bool QTextStreamPrivate::getChar(QChar *ch) { if ((string && stringOffset == string->size()) @@ -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 - // Do NOT break NRVO in this function or kittens will die! - - PaddingResult result; + int left = 0, right = 0; const int padSize = params.fieldWidth - len; - result.padding.resize(padSize); - std::fill_n(result.padding.begin(), padSize, params.padChar); - switch (params.fieldAlignment) { case QTextStream::AlignLeft: - result.left = 0; - result.right = padSize; + right = padSize; break; case QTextStream::AlignRight: case QTextStream::AlignAccountingStyle: - result.left = padSize; - result.right = 0; + left = padSize; break; case QTextStream::AlignCenter: - result.left = padSize/2; - result.right = padSize - padSize/2; + left = padSize/2; + right = padSize - padSize/2; break; } - + const PaddingResult result = { left, right }; 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(pad.padding.constData(), pad.right); + writePadding(pad.right); } else { 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(pad.padding.constData(), pad.right); + writePadding(pad.right); } else { write(data); } diff --git a/src/corelib/io/qtextstream_p.h b/src/corelib/io/qtextstream_p.h index 115408a6dd..6c6cbe1e6e 100644 --- a/src/corelib/io/qtextstream_p.h +++ b/src/corelib/io/qtextstream_p.h @@ -169,6 +169,7 @@ public: inline void write(QChar ch); void write(const QChar *data, int len); void write(QLatin1String data); + void writePadding(int len); 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(QLatin1String data, bool number = false); @@ -176,10 +177,7 @@ public: void putNumber(qulonglong number, bool negative); struct PaddingResult { - enum { PreallocatedPadding = 80 }; // typical line length - int left, right; - QVarLengthArray<QChar, PreallocatedPadding> padding; }; PaddingResult padding(int len) const; |