20 unsigned m_iBlockSize = 0;
24 volatile unsigned read_pos, write_pos;
37 std::swap(size, rhs.size);
38 std::swap(m_iBlockSize, rhs.m_iBlockSize);
39 std::swap(read_pos, rhs.read_pos);
40 std::swap(write_pos, rhs.write_pos);
41 std::swap(buf, rhs.buf);
54 read_pos = cpy.read_pos;
55 write_pos = cpy.write_pos;
56 m_iBlockSize = cpy.m_iBlockSize;
59 memcpy(buf, cpy.buf, size *
sizeof(T));
66 unsigned num_readable()
const
68 const int rpos = read_pos;
69 const int wpos = write_pos;
75 return size - (rpos - wpos);
82 unsigned num_writable()
const
84 const int rpos = read_pos;
85 const int wpos = write_pos;
90 ret = size - (wpos - rpos);
100 return ret - m_iBlockSize;
103 unsigned capacity()
const {
return size; }
105 void reserve(
unsigned n,
int iBlockSize = 1)
107 m_iBlockSize = iBlockSize;
119 ((size + iBlockSize - 1) / iBlockSize) * iBlockSize;
126 void clear() { read_pos = write_pos = 0; }
129 void advance_write_pointer(
int n) { write_pos = (write_pos + n) % size; }
132 void advance_read_pointer(
int n) { read_pos = (read_pos + n) % size; }
134 void get_write_pointers(T* pPointers[2],
unsigned pSizes[2])
136 const int rpos = read_pos;
137 const int wpos = write_pos;
142 pPointers[0] = buf + wpos;
145 pSizes[0] = size - wpos;
147 }
else if (rpos > wpos) {
149 pPointers[0] = buf + wpos;
152 pSizes[0] = rpos - wpos;
159 pSizes[1] -= m_iBlockSize;
161 pSizes[0] -= m_iBlockSize;
165 T* get_write_pointer(
unsigned* pSizes)
168 unsigned iBothSizes[2];
169 get_write_pointers(pBothPointers, iBothSizes);
170 *pSizes = iBothSizes[0];
171 return pBothPointers[0];
174 void get_read_pointers(T* pPointers[2],
unsigned pSizes[2])
176 const int rpos = read_pos;
177 const int wpos = write_pos;
181 pPointers[0] = buf + rpos;
184 pSizes[0] = wpos - rpos;
186 }
else if (rpos > wpos) {
188 pPointers[0] = buf + rpos;
191 pSizes[0] = size - rpos;
206 bool write(
const T* buffer,
unsigned buffer_size)
210 get_write_pointers(p, sizes);
212 if (buffer_size > sizes[0] + sizes[1])
215 const int from_first = buffer_size <= sizes[0] ? buffer_size : sizes[0];
216 memcpy(p[0], buffer, from_first *
sizeof(T));
217 if (buffer_size > sizes[0])
219 p[1], buffer + from_first, (buffer_size - sizes[0]) *
sizeof(T));
221 advance_write_pointer(buffer_size);
229 bool read(T* buffer,
unsigned buffer_size)
233 get_read_pointers(p, sizes);
235 if (buffer_size > sizes[0] + sizes[1])
238 const int from_first = buffer_size <= sizes[0] ? buffer_size : sizes[0];
239 memcpy(buffer, p[0], from_first *
sizeof(T));
240 if (buffer_size > sizes[0])
242 buffer + from_first, p[1], (buffer_size - sizes[0]) *
sizeof(T));
247 memset(p[0], 0xFF, from_first *
sizeof(T));
248 if (buffer_size > sizes[0])
249 memset(p[1], 0xFF, (buffer_size - sizes[0]) *
sizeof(T));
251 advance_read_pointer(buffer_size);