diff options
author | Andreas Kling <andreas.kling@nokia.com> | 2010-06-17 01:22:38 (GMT) |
---|---|---|
committer | Andreas Kling <andreas.kling@nokia.com> | 2010-06-17 15:04:38 (GMT) |
commit | 21af6bbee63bdac4907013d0abb0908086d85217 (patch) | |
tree | 3d27c28bbebe9ec3a51621ae263230bab983ccaa | |
parent | 0610902bcd722605f10840a6a3d1600e1e07f771 (diff) | |
download | Qt-21af6bbee63bdac4907013d0abb0908086d85217.zip Qt-21af6bbee63bdac4907013d0abb0908086d85217.tar.gz Qt-21af6bbee63bdac4907013d0abb0908086d85217.tar.bz2 |
Specialize peek() for QBuffer
This avoids going through the generic implementation in QIODevice
and avoids a 16kB buffer allocation from QIODevicePrivateLinearBuffer.
Reviewed-by: João Abecasis <joao.abecasis@nokia.com>
-rw-r--r-- | src/corelib/io/qbuffer.cpp | 18 | ||||
-rw-r--r-- | src/corelib/io/qiodevice.cpp | 49 | ||||
-rw-r--r-- | src/corelib/io/qiodevice_p.h | 4 |
3 files changed, 52 insertions, 19 deletions
diff --git a/src/corelib/io/qbuffer.cpp b/src/corelib/io/qbuffer.cpp index c1ff353..73c71ea 100644 --- a/src/corelib/io/qbuffer.cpp +++ b/src/corelib/io/qbuffer.cpp @@ -62,6 +62,9 @@ public: QByteArray defaultBuf; int ioIndex; + virtual qint64 peek(char *data, qint64 maxSize); + virtual QByteArray peek(qint64 maxSize); + #ifndef QT_NO_QOBJECT // private slots void _q_emitSignals(); @@ -83,6 +86,21 @@ void QBufferPrivate::_q_emitSignals() } #endif +qint64 QBufferPrivate::peek(char *data, qint64 maxSize) +{ + qint64 readBytes = qMin(maxSize, static_cast<qint64>(buf->size()) - pos); + memcpy(data, buf->constData() + pos, readBytes); + return readBytes; +} + +QByteArray QBufferPrivate::peek(qint64 maxSize) +{ + qint64 readBytes = qMin(maxSize, static_cast<qint64>(buf->size()) - pos); + if (pos == 0 && maxSize >= buf->size()) + return *buf; + return QByteArray(buf->constData() + pos, readBytes); +} + /*! \class QBuffer \reentrant diff --git a/src/corelib/io/qiodevice.cpp b/src/corelib/io/qiodevice.cpp index d2e4f75..ea60792 100644 --- a/src/corelib/io/qiodevice.cpp +++ b/src/corelib/io/qiodevice.cpp @@ -1442,6 +1442,35 @@ bool QIODevicePrivate::putCharHelper(char c) return q_func()->write(&c, 1) == 1; } +/*! + \internal +*/ +qint64 QIODevicePrivate::peek(char *data, qint64 maxSize) +{ + qint64 readBytes = q_func()->read(data, maxSize); + if (readBytes <= 0) + return readBytes; + + buffer.ungetBlock(data, readBytes); + pos -= readBytes; + return readBytes; +} + +/*! + \internal +*/ +QByteArray QIODevicePrivate::peek(qint64 maxSize) +{ + QByteArray result = q_func()->read(maxSize); + + if (result.isEmpty()) + return result; + + buffer.ungetBlock(result.constData(), result.size()); + pos -= result.size(); + return result; +} + /*! \fn bool QIODevice::getChar(char *c) Reads one character from the device and stores it in \a c. If \a c @@ -1476,14 +1505,7 @@ bool QIODevice::getChar(char *c) */ qint64 QIODevice::peek(char *data, qint64 maxSize) { - Q_D(QIODevice); - qint64 readBytes = read(data, maxSize); - if (readBytes <= 0) - return readBytes; - - d->buffer.ungetBlock(data, readBytes); - d->pos -= readBytes; - return readBytes; + return d_func()->peek(data, maxSize); } /*! @@ -1505,16 +1527,7 @@ qint64 QIODevice::peek(char *data, qint64 maxSize) */ QByteArray QIODevice::peek(qint64 maxSize) { - Q_D(QIODevice); - QByteArray result = read(maxSize); - - if (result.isEmpty()) - return result; - - d->buffer.ungetBlock(result.constData(), result.size()); - d->pos -= result.size(); - - return result; + return d_func()->peek(maxSize); } /*! diff --git a/src/corelib/io/qiodevice_p.h b/src/corelib/io/qiodevice_p.h index 225a0b9..4a25562 100644 --- a/src/corelib/io/qiodevice_p.h +++ b/src/corelib/io/qiodevice_p.h @@ -231,7 +231,9 @@ public: accessMode = q_func()->isSequential() ? Sequential : RandomAccess; return accessMode == Sequential; } - + + virtual qint64 peek(char *data, qint64 maxSize); + virtual QByteArray peek(qint64 maxSize); #ifdef QT_NO_QOBJECT QIODevice *q_ptr; |