diff options
author | Alex Trotsenko <alex1973tr@gmail.com> | 2016-07-12 16:14:11 +0300 |
---|---|---|
committer | Alex Trotsenko <alex1973tr@gmail.com> | 2016-07-23 09:05:13 +0000 |
commit | 3c6a7a96ef17d5bd1fbea1d9e06617d281c6ca20 (patch) | |
tree | fa9927bdf77e682b2efed3098d6fb663915cc48d /src/corelib/tools/qringbuffer.cpp | |
parent | 3605fc653b3f54c9cda59fb3bf29b97d85ae0737 (diff) |
QRingBuffer: add packet mode
As a special case, setting the value of chunk size to zero forces
QRingBuffer to produce a separate QByteArray on each call which
appends the data. So, this enables a packet mode where portions of
data are stored independently from each other.
Change-Id: I2d0b331211901a289da7d4533e974f06830b5590
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/corelib/tools/qringbuffer.cpp')
-rw-r--r-- | src/corelib/tools/qringbuffer.cpp | 46 |
1 files changed, 24 insertions, 22 deletions
diff --git a/src/corelib/tools/qringbuffer.cpp b/src/corelib/tools/qringbuffer.cpp index 4a2dfdec2b..cb11e72435 100644 --- a/src/corelib/tools/qringbuffer.cpp +++ b/src/corelib/tools/qringbuffer.cpp @@ -108,24 +108,25 @@ char *QRingBuffer::reserve(qint64 bytes) if (bytes <= 0 || bytes >= MaxByteArraySize) return 0; - if (buffers.isEmpty()) { - buffers.append(QByteArray()); - buffers.first().resize(qMax(basicBlockSize, int(bytes))); + if (bufferSize == 0) { + if (buffers.isEmpty()) + buffers.append(QByteArray(qMax(basicBlockSize, int(bytes)), Qt::Uninitialized)); + else + buffers.first().resize(qMax(basicBlockSize, int(bytes))); } else { const qint64 newSize = bytes + tail; - // if need buffer reallocation - if (newSize > buffers.constLast().size()) { - if (newSize > buffers.constLast().capacity() && (tail >= basicBlockSize - || newSize >= MaxByteArraySize)) { - // shrink this buffer to its current size - buffers.last().resize(tail); - - // create a new QByteArray - buffers.append(QByteArray()); - ++tailBuffer; - tail = 0; - } - buffers.last().resize(qMax(basicBlockSize, tail + int(bytes))); + // if need a new buffer + if (basicBlockSize == 0 || (newSize > buffers.constLast().capacity() + && (tail >= basicBlockSize || newSize >= MaxByteArraySize))) { + // shrink this buffer to its current size + buffers.last().resize(tail); + + // create a new QByteArray + buffers.append(QByteArray(qMax(basicBlockSize, int(bytes)), Qt::Uninitialized)); + ++tailBuffer; + tail = 0; + } else if (newSize > buffers.constLast().size()) { + buffers.last().resize(qMax(basicBlockSize, int(newSize))); } } @@ -146,10 +147,8 @@ char *QRingBuffer::reserveFront(qint64 bytes) if (bytes <= 0 || bytes >= MaxByteArraySize) return 0; - if (head < bytes) { - if (buffers.isEmpty()) { - buffers.append(QByteArray()); - } else { + if (head < bytes || basicBlockSize == 0) { + if (head > 0) { buffers.first().remove(0, head); if (tailBuffer == 0) tail -= head; @@ -157,12 +156,15 @@ char *QRingBuffer::reserveFront(qint64 bytes) head = qMax(basicBlockSize, int(bytes)); if (bufferSize == 0) { + if (buffers.isEmpty()) + buffers.prepend(QByteArray(head, Qt::Uninitialized)); + else + buffers.first().resize(head); tail = head; } else { - buffers.prepend(QByteArray()); + buffers.prepend(QByteArray(head, Qt::Uninitialized)); ++tailBuffer; } - buffers.first().resize(head); } head -= int(bytes); |