1 #ifndef INCLUDE_AL_SINGLE_READER_WRITER_RING_BUFFER_HPP
2 #define INCLUDE_AL_SINGLE_READER_WRITER_RING_BUFFER_HPP
81 size_t write(
const char* src,
size_t sz);
86 size_t read(
char* dst,
size_t sz);
91 size_t peek(
char* dst,
size_t sz);
95 void clear() { mRead = mWrite; }
103 inline uint32_t next_power_of_two(uint32_t v) {
114 : mSize(size_t(next_power_of_two(uint32_t(sz)))),
118 mData =
new char[mSize];
121 inline SingleRWRingBuffer ::~SingleRWRingBuffer() {
delete[] mData; }
124 const size_t r = mRead;
125 const size_t w = mWrite;
126 if (r == w)
return mWrap;
127 return ((mSize + (r - w)) & mWrap) - 1;
131 const size_t r = mRead;
132 const size_t w = mWrite;
133 return (mSize + (w - r)) & mWrap;
138 sz = sz > space ? space : sz;
139 if (sz == 0)
return 0;
145 memcpy(mData + w, src, sz);
147 size_t split = mSize - w;
149 memcpy(mData + w, src, split);
150 memcpy(mData, src + split, end);
159 sz = sz > space ? space : sz;
160 if (sz == 0)
return 0;
166 memcpy(dst, mData + r, sz);
168 size_t split = mSize - r;
170 memcpy(dst, mData + r, split);
171 memcpy(dst + split, mData, end);
180 sz = sz > space ? space : sz;
181 if (sz == 0)
return 0;
187 memcpy(dst, mData + r, sz);
189 size_t split = mSize - r;
191 memcpy(dst, mData + r, split);
192 memcpy(dst + split, mData, end);
SingleRWRingBuffer(size_t sz=256)
size_t peek(char *dst, size_t sz)
size_t read(char *dst, size_t sz)
size_t writeSpace() const
size_t write(const char *src, size_t sz)