19#include <QtCore/private/qglobal_p.h>
20#include <QtCore/qbytearray.h>
21#include <QtCore/qlist.h>
25#ifndef QRINGBUFFER_CHUNKSIZE
26#define QRINGBUFFER_CHUNKSIZE 4096
33 QRingChunk()
noexcept =
default;
34 explicit inline QRingChunk(qsizetype alloc) :
35 chunk(alloc, Qt::Uninitialized), tailOffset(0)
38 explicit inline QRingChunk(
const QByteArray &qba)
noexcept :
39 chunk(qba), tailOffset(qba.size())
42 explicit QRingChunk(QByteArray &&qba)
noexcept :
43 chunk(std::move(qba)), tailOffset(chunk.size())
47 inline void swap(QRingChunk &other)
noexcept
49 chunk.swap(other.chunk);
50 qSwap(headOffset, other.headOffset);
51 qSwap(tailOffset, other.tailOffset);
55 void allocate(qsizetype alloc);
56 inline bool isShared()
const
58 return !chunk.isDetached();
60 Q_CORE_EXPORT
void detach();
61 QByteArray toByteArray() &&;
64 inline qsizetype head()
const
68 inline qsizetype size()
const
70 return tailOffset - headOffset;
72 inline qsizetype capacity()
const
76 inline qsizetype available()
const
78 return chunk.size() - tailOffset;
80 inline const char *data()
const
82 return chunk.constData() + headOffset;
88 return chunk.data() + headOffset;
92 inline void advance(qsizetype offset)
94 Q_ASSERT(headOffset + offset >= 0);
95 Q_ASSERT(size() - offset > 0);
99 inline void grow(qsizetype offset)
101 Q_ASSERT(size() + offset > 0);
102 Q_ASSERT(head() + size() + offset <= capacity());
104 tailOffset += offset;
106 inline void assign(
const QByteArray &qba)
110 tailOffset = qba.size();
112 void assign(QByteArray &&qba)
114 chunk = std::move(qba);
116 tailOffset = chunk.size();
120 headOffset = tailOffset = 0;
129 qsizetype headOffset = 0;
130 qsizetype tailOffset = 0;
132Q_DECLARE_SHARED(QRingChunk)
145 basicBlockSize = size;
149 return basicBlockSize;
153 return bufferSize == 0 ? Q_INT64_C(0) : buffers.first().size();
157 return bufferSize == 0 ?
nullptr : buffers.first().data();
166 Q_ASSERT(pos >= 0 && pos <= size());
174 return bufferSize == 0;
182 return int(uchar(c));
186 char *ptr = reserve(1);
192 char *ptr = reserveFront(1);
205 Q_CORE_EXPORT QByteArray
read();
212 qint64 bytesToSkip = qMin(length, bufferSize);
222 return indexOf(
'\n') >= 0;
226 QList<QRingChunk> buffers;
Q_CORE_EXPORT void free(qint64 bytes)
QRingBuffer & operator=(QRingBuffer &&) noexcept=default
const char * readPointer() const
Q_CORE_EXPORT void append(const QByteArray &qba)
Q_CORE_EXPORT const char * readPointerAtPosition(qint64 pos, qint64 &length) const
qint64 skip(qint64 length)
Q_CORE_EXPORT void chop(qint64 bytes)
Q_CORE_EXPORT char * reserve(qint64 bytes)
void setChunkSize(int size)
void truncate(qint64 pos)
Q_CORE_EXPORT void append(const char *data, qint64 size)
Q_CORE_EXPORT char * reserveFront(qint64 bytes)
qint64 indexOf(char c) const
Q_CORE_EXPORT void clear()
qint64 nextDataBlockSize() const
Q_CORE_EXPORT void append(QByteArray &&qba)
#define QRINGBUFFER_CHUNKSIZE
Q_DECLARE_TYPEINFO(QRingBuffer, Q_RELOCATABLE_TYPE)