21 #ifndef ringbuffer_npt_h
22 #define ringbuffer_npt_h
56 void set (
size_t r,
size_t w) {
62 size_t read (T *dest,
size_t cnt);
63 size_t write (
const T *src,
size_t cnt);
129 template<
class T>
size_t
136 size_t priv_read_ptr;
138 priv_read_ptr = read_ptr.load ();
140 if ((free_cnt = read_space ()) == 0) {
144 to_read = cnt > free_cnt ? free_cnt : cnt;
146 cnt2 = priv_read_ptr + to_read;
149 n1 = size - priv_read_ptr;
156 memcpy (dest, &buf[priv_read_ptr], n1 *
sizeof (T));
157 priv_read_ptr = (priv_read_ptr + n1) % size;
160 memcpy (dest+n1, buf, n2 *
sizeof (T));
164 read_ptr.store (priv_read_ptr);
168 template<
class T>
size_t
175 size_t priv_write_ptr;
177 priv_write_ptr = write_ptr.load ();
179 if ((free_cnt = write_space ()) == 0) {
183 to_write = cnt > free_cnt ? free_cnt : cnt;
185 cnt2 = priv_write_ptr + to_write;
188 n1 = size - priv_write_ptr;
195 memcpy (&buf[priv_write_ptr], src, n1 *
sizeof (T));
196 priv_write_ptr = (priv_write_ptr + n1) % size;
199 memcpy (buf, src+n1, n2 *
sizeof (T));
203 write_ptr.store (priv_write_ptr);
207 template<
class T>
size_t
210 return write (&src, 1);
213 template<
class T>
void
220 w = write_ptr.load ();
221 r = read_ptr.load ();
226 free_cnt = (w - r + size) % size;
237 vec->
buf[0] = &buf[r];
238 vec->
len[0] = size - r;
240 vec->
len[1] = cnt2 % size;
246 vec->
buf[0] = &buf[r];
247 vec->
len[0] = free_cnt;
253 template<
class T>
void
260 w = write_ptr.load ();
261 r = read_ptr.load ();
264 free_cnt = ((r - w + size) % size) - 1;
266 free_cnt = (r - w) - 1;
280 vec->
buf[0] = &buf[w];
281 vec->
len[0] = size - w;
283 vec->
len[1] = cnt2 % size;
285 vec->
buf[0] = &buf[w];
286 vec->
len[0] = free_cnt;
std::atomic< int > write_ptr
std::atomic< int > read_ptr
size_t write(const T *src, size_t cnt)
void increment_read_ptr(size_t cnt)
void get_write_vector(rw_vector *)
size_t get_read_ptr() const
void increment_write_ptr(size_t cnt)
size_t write_one(const T src)
size_t read(T *dest, size_t cnt)
void decrement_read_ptr(size_t cnt)
RingBufferNPT(RingBufferNPT const &)
void get_read_vector(rw_vector *)
void set(size_t r, size_t w)
size_t get_write_ptr() const