diff options
-rw-r--r-- | src/corelib/io/qtextstream.cpp | 30 | ||||
-rw-r--r-- | src/corelib/io/qtextstream_p.h | 2 | ||||
-rw-r--r-- | tests/benchmarks/corelib/io/io.pro | 3 | ||||
-rw-r--r-- | tests/benchmarks/corelib/io/qtextstream/main.cpp | 133 | ||||
-rw-r--r-- | tests/benchmarks/corelib/io/qtextstream/qtextstream.pro | 9 |
5 files changed, 174 insertions, 3 deletions
diff --git a/src/corelib/io/qtextstream.cpp b/src/corelib/io/qtextstream.cpp index 4002ce8694..ab2bf98d15 100644 --- a/src/corelib/io/qtextstream.cpp +++ b/src/corelib/io/qtextstream.cpp @@ -835,6 +835,21 @@ inline void QTextStreamPrivate::write(const QString &data) /*! \internal */ +inline void QTextStreamPrivate::write(QChar ch) +{ + if (string) { + // ### What about seek()?? + string->append(ch); + } else { + writeBuffer += ch; + if (writeBuffer.size() > QTEXTSTREAM_BUFFERSIZE) + flushWriteBuffer(); + } +} + +/*! + \internal +*/ inline bool QTextStreamPrivate::getChar(QChar *ch) { if ((string && stringOffset == string->size()) @@ -873,6 +888,17 @@ inline void QTextStreamPrivate::ungetChar(QChar ch) /*! \internal */ +inline void QTextStreamPrivate::putChar(QChar ch) +{ + if (params.fieldWidth > 0) + putString(QString(ch)); + else + write(ch); +} + +/*! + \internal +*/ inline void QTextStreamPrivate::putString(const QString &s, bool number) { QString tmp = s; @@ -2240,7 +2266,7 @@ QTextStream &QTextStream::operator<<(QChar c) { Q_D(QTextStream); CHECK_VALID_STREAM(*this); - d->putString(QString(c)); + d->putChar(c); return *this; } @@ -2253,7 +2279,7 @@ QTextStream &QTextStream::operator<<(char c) { Q_D(QTextStream); CHECK_VALID_STREAM(*this); - d->putString(QString(QChar::fromLatin1(c))); + d->putChar(QChar::fromLatin1(c)); return *this; } diff --git a/src/corelib/io/qtextstream_p.h b/src/corelib/io/qtextstream_p.h index ac6529e195..ea431a4620 100644 --- a/src/corelib/io/qtextstream_p.h +++ b/src/corelib/io/qtextstream_p.h @@ -174,7 +174,9 @@ public: bool getReal(double *f); inline void write(const QString &data); + inline void write(QChar ch); inline void putString(const QString &ch, bool number = false); + inline void putChar(QChar ch); void putNumber(qulonglong number, bool negative); // buffers diff --git a/tests/benchmarks/corelib/io/io.pro b/tests/benchmarks/corelib/io/io.pro index 487171ac5e..38a1f6b15b 100644 --- a/tests/benchmarks/corelib/io/io.pro +++ b/tests/benchmarks/corelib/io/io.pro @@ -6,5 +6,6 @@ SUBDIRS = \ qfileinfo \ qiodevice \ qprocess \ - qtemporaryfile + qtemporaryfile \ + qtextstream diff --git a/tests/benchmarks/corelib/io/qtextstream/main.cpp b/tests/benchmarks/corelib/io/qtextstream/main.cpp new file mode 100644 index 0000000000..45c0297516 --- /dev/null +++ b/tests/benchmarks/corelib/io/qtextstream/main.cpp @@ -0,0 +1,133 @@ +/**************************************************************************** +** +** Copyright (C) 2014 David Faure <david.faure@kdab.com> +** Contact: http://www.qt-project.org/legal +** +** This file is part of the test suite of the Qt Toolkit. +** +** $QT_BEGIN_LICENSE:LGPL$ +** Commercial License Usage +** Licensees holding valid commercial Qt licenses may use this file in +** accordance with the commercial license agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Digia. For licensing terms and +** conditions see http://qt.digia.com/licensing. For further information +** use the contact form at http://qt.digia.com/contact-us. +** +** GNU Lesser General Public License Usage +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** In addition, as a special exception, Digia gives you certain additional +** rights. These rights are described in the Digia Qt LGPL Exception +** version 1.1, included in the file LGPL_EXCEPTION.txt in this package. +** +** GNU General Public License Usage +** Alternatively, this file may be used under the terms of the GNU +** General Public License version 3.0 as published by the Free Software +** Foundation and appearing in the file LICENSE.GPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU General Public License version 3.0 requirements will be +** met: http://www.gnu.org/copyleft/gpl.html. +** +** +** $QT_END_LICENSE$ +** +****************************************************************************/ + +#include <QDebug> +#include <QIODevice> +#include <QString> +#include <QBuffer> +#include <qtest.h> + +class tst_qtextstream : public QObject +{ + Q_OBJECT +private slots: + void writeSingleChar_data(); + void writeSingleChar(); + +private: +}; + +enum Output { StringOutput, DeviceOutput }; +Q_DECLARE_METATYPE(Output); + +enum Input { CharStarInput, QStringInput, CharInput, QCharInput }; +Q_DECLARE_METATYPE(Input); + +void tst_qtextstream::writeSingleChar_data() +{ + QTest::addColumn<Output>("output"); + QTest::addColumn<Input>("input"); + + QTest::newRow("string_charstar") << StringOutput << CharStarInput; + QTest::newRow("string_string") << StringOutput << QStringInput; + QTest::newRow("string_char") << StringOutput << CharInput; + QTest::newRow("string_qchar") << StringOutput << QCharInput; + QTest::newRow("device_charstar") << DeviceOutput << CharStarInput; + QTest::newRow("device_string") << DeviceOutput << QStringInput; + QTest::newRow("device_char") << DeviceOutput << CharInput; + QTest::newRow("device_qchar") << DeviceOutput << QCharInput; +} + +void tst_qtextstream::writeSingleChar() +{ + QFETCH(Output, output); + QFETCH(Input, input); + + QString str; + QBuffer buffer; + QTextStream stream; + if (output == StringOutput) { + stream.setString(&str, QIODevice::WriteOnly); + } else { + QVERIFY(buffer.open(QIODevice::WriteOnly)); + stream.setDevice(&buffer); + } + // Test many different ways to write a single char into a QTextStream + QString inputString = "h"; + const int amount = 100000; + switch (input) { + case CharStarInput: + QBENCHMARK { + for (qint64 i = 0; i < amount; ++i) + stream << "h"; + } + break; + case QStringInput: + QBENCHMARK { + for (qint64 i = 0; i < amount; ++i) + stream << inputString; + } + break; + case CharInput: + QBENCHMARK { + for (qint64 i = 0; i < amount; ++i) + stream << 'h'; + } + break; + case QCharInput: + QBENCHMARK { + for (qint64 i = 0; i < amount; ++i) + stream << QChar('h'); + } + break; + } + QString result; + if (output == StringOutput) + result = str; + else + result = QString(buffer.data()); + + QCOMPARE(result.left(10), QString("hhhhhhhhhh")); +} + +QTEST_MAIN(tst_qtextstream) + +#include "main.moc" diff --git a/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro b/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro new file mode 100644 index 0000000000..3dcba655f2 --- /dev/null +++ b/tests/benchmarks/corelib/io/qtextstream/qtextstream.pro @@ -0,0 +1,9 @@ +TEMPLATE = app +TARGET = tst_bench_qtemporaryfile + +QT = core testlib + +CONFIG += release + +SOURCES += main.cpp +DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0 |