VCV Rack API v2
|
Lock-free queue with fixed size and no allocations. More...
#include <ringbuffer.hpp>
Public Member Functions | |
void | push (T t) |
Adds an element to the end of the buffer. | |
void | pushBuffer (const T *t, int n) |
Copies an array to the end of the buffer. | |
T | shift () |
Removes and returns an element from the start of the buffer. | |
void | shiftBuffer (T *t, size_t n) |
Removes and copies an array from the start of the buffer. | |
void | clear () |
bool | empty () const |
bool | full () const |
size_t | size () const |
size_t | capacity () const |
Public Attributes | |
std::atomic< size_t > | start {0} |
std::atomic< size_t > | end {0} |
T | data [S] |
Lock-free queue with fixed size and no allocations.
If S is not a power of 2, performance might be reduced, and the index could overflow in a thousand years, but it should usually be fine for your purposes.
Supports only a single producer and consumer. To my knowledge, nobody has invented a 100% correct multiple producer/consumer lock-free ring buffer for x86_64.
|
inline |
Adds an element to the end of the buffer.
|
inline |
Copies an array to the end of the buffer.
n
must be at most S.
|
inline |
Removes and returns an element from the start of the buffer.
|
inline |
Removes and copies an array from the start of the buffer.
n
must be at most S.
|
inline |
|
inline |
|
inline |
|
inline |
|
inline |
std::atomic<size_t> rack::dsp::RingBuffer< T, S >::start {0} |
std::atomic<size_t> rack::dsp::RingBuffer< T, S >::end {0} |
T rack::dsp::RingBuffer< T, S >::data[S] |