From 17504a7b32a71e91ceae37cd8023ae0557b45cb6 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 21 Oct 2015 22:21:03 +0200 Subject: [PATCH] QTextStream: use new QString::resize(int, QChar) for padding Change-Id: I17c90ea32614c45f038f5f3386749dfa74bad438 Reviewed-by: Oswald Buddenhagen --- src/corelib/io/qtextstream.cpp | 42 ++++++++++++++++++++-------------- 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 adf9e1aa55b..9f0a8c08ede 100644 --- a/src/corelib/io/qtextstream.cpp +++ b/src/corelib/io/qtextstream.cpp @@ -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 */ @@ -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 115408a6dd5..6c6cbe1e6ec 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 padding; }; PaddingResult padding(int len) const;