18#include <QtCore/private/qglobal_p.h>
19#include <QtCore/qbytearray.h>
20#include <QtCore/qlist.h>
24#ifndef QRINGBUFFER_CHUNKSIZE
25#define QRINGBUFFER_CHUNKSIZE 4096
32 QRingChunk()
noexcept =
default;
33 explicit inline QRingChunk(qsizetype alloc) :
34 chunk(alloc, Qt::Uninitialized), tailOffset(0)
37 explicit inline QRingChunk(
const QByteArray &qba)
noexcept :
38 chunk(qba), tailOffset(qba.size())
41 explicit QRingChunk(QByteArray &&qba)
noexcept :
42 chunk(std::move(qba)), tailOffset(chunk.size())
46 inline void swap(QRingChunk &other)
noexcept
48 chunk.swap(other.chunk);
49 qSwap(headOffset, other.headOffset);
50 qSwap(tailOffset, other.tailOffset);
54 void allocate(qsizetype alloc);
55 inline bool isShared()
const
57 return !chunk.isDetached();
59 Q_CORE_EXPORT
void detach();
60 QByteArray toByteArray() &&;
63 inline qsizetype head()
const
67 inline qsizetype size()
const
69 return tailOffset - headOffset;
71 inline qsizetype capacity()
const
75 inline qsizetype available()
const
77 return chunk.size() - tailOffset;
79 inline const char *data()
const
81 return chunk.constData() + headOffset;
87 return chunk.data() + headOffset;
91 inline void advance(qsizetype offset)
93 Q_ASSERT(headOffset + offset >= 0);
94 Q_ASSERT(size() - offset > 0);
98 inline void grow(qsizetype offset)
100 Q_ASSERT(size() + offset > 0);
101 Q_ASSERT(head() + size() + offset <= capacity());
103 tailOffset += offset;
105 inline void assign(
const QByteArray &qba)
109 tailOffset = qba.size();
111 void assign(QByteArray &&qba)
113 chunk = std::move(qba);
115 tailOffset = chunk.size();
119 headOffset = tailOffset = 0;
128 qsizetype headOffset = 0;
129 qsizetype tailOffset = 0;
131Q_DECLARE_SHARED(QRingChunk)
144 basicBlockSize = size;
148 return basicBlockSize;
152 return bufferSize == 0 ? Q_INT64_C(0) : buffers.first().size();
156 return bufferSize == 0 ?
nullptr : buffers.first().data();
165 Q_ASSERT(pos >= 0 && pos <= size());
173 return bufferSize == 0;
181 return int(uchar(c));
185 char *ptr = reserve(1);
191 char *ptr = reserveFront(1);
204 Q_CORE_EXPORT QByteArray
read();
211 qint64 bytesToSkip = qMin(length, bufferSize);
221 return indexOf(
'\n') >= 0;
225 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)