qb  2.0.0.0
C++17 Actor Framework
qb Issue Watch Star Fork Follow @isndev
Loading...
Searching...
No Matches
qb::lockfree::spsc::internal::ringbuffer< T > Class Template Reference

Base implementation of the Single-Producer Single-Consumer ringbuffer. More...

#include <spsc.h>

Inheritance diagram for qb::lockfree::spsc::internal::ringbuffer< T >:
Collaboration diagram for qb::lockfree::spsc::internal::ringbuffer< T >:

Public Member Functions

bool empty ()
 Check if the buffer is empty.
Public Member Functions inherited from qb::nocopy
 nocopy ()=default
 Default constructor.
 nocopy (nocopy const &)=delete
 Deleted copy constructor.
 nocopy (nocopy const &&)=delete
 Deleted move constructor.
nocopyoperator= (nocopy const &)=delete
 Deleted copy assignment operator.
nocopyoperator= (nocopy &&)=delete
 Deleted move assignment operator.

Protected Member Functions

 ringbuffer ()
 Default constructor initializing indices.
size_t read_available (size_t const max_size) const
 Get the number of elements available for reading.
size_t write_available (size_t const max_size) const
 Get the number of slots available for writing.
bool enqueue (T const &t, T *buffer, size_t const max_size)
 Enqueue a single element into the buffer.
template<bool _All>
size_t enqueue (const T *input_buffer, size_t input_count, T *internal_buffer, size_t const max_size)
 Enqueue multiple elements into the buffer.
size_t dequeue (T *output_buffer, size_t output_count, T *internal_buffer, size_t const max_size)
 Dequeue multiple elements from the buffer.
template<typename _Func>
size_t consume_all (_Func const &functor, T *internal_buffer, size_t max_size)
 Process all available elements in the buffer using a functor.
const T & front (const T *internal_buffer) const
 Get a reference to the element at the read index (const version)
T & front (T *internal_buffer)
 Get a reference to the element at the read index.

Static Protected Member Functions

static size_t next_index (size_t arg, size_t const max_size)
 Calculate the next index in the buffer with wrap-around handling.
static size_t read_available (size_t write_index, size_t read_index, size_t const max_size)
 Calculate how many elements are available for reading.
static size_t write_available (size_t write_index, size_t read_index, size_t const max_size)
 Calculate how many elements can be written.

Detailed Description

template<typename T>
class qb::lockfree::spsc::internal::ringbuffer< T >

Base implementation of the Single-Producer Single-Consumer ringbuffer.

This class provides the core functionality for SPSC ringbuffers, handling the read and write index management and the memory operations required for enqueueing and dequeueing elements.

Template Parameters
TType of elements stored in the ringbuffer

Member Function Documentation

◆ next_index()

template<typename T>
size_t qb::lockfree::spsc::internal::ringbuffer< T >::next_index ( size_t arg,
size_t const max_size )
inlinestaticprotected

Calculate the next index in the buffer with wrap-around handling.

Parameters
argCurrent index
max_sizeMaximum size of the buffer
Returns
Next index with wrap-around if needed

◆ read_available() [1/2]

template<typename T>
size_t qb::lockfree::spsc::internal::ringbuffer< T >::read_available ( size_t write_index,
size_t read_index,
size_t const max_size )
inlinestaticprotected

Calculate how many elements are available for reading.

Parameters
write_indexCurrent write index
read_indexCurrent read index
max_sizeMaximum size of the buffer
Returns
Number of elements available for reading

◆ write_available() [1/2]

template<typename T>
size_t qb::lockfree::spsc::internal::ringbuffer< T >::write_available ( size_t write_index,
size_t read_index,
size_t const max_size )
inlinestaticprotected

Calculate how many elements can be written.

Parameters
write_indexCurrent write index
read_indexCurrent read index
max_sizeMaximum size of the buffer
Returns
Number of slots available for writing

◆ read_available() [2/2]

template<typename T>
size_t qb::lockfree::spsc::internal::ringbuffer< T >::read_available ( size_t const max_size) const
inlinenodiscardprotected

Get the number of elements available for reading.

Parameters
max_sizeMaximum size of the buffer
Returns
Number of elements available for reading

◆ write_available() [2/2]

template<typename T>
size_t qb::lockfree::spsc::internal::ringbuffer< T >::write_available ( size_t const max_size) const
inlinenodiscardprotected

Get the number of slots available for writing.

Parameters
max_sizeMaximum size of the buffer
Returns
Number of slots available for writing

◆ enqueue() [1/2]

template<typename T>
bool qb::lockfree::spsc::internal::ringbuffer< T >::enqueue ( T const & t,
T * buffer,
size_t const max_size )
inlineprotected

Enqueue a single element into the buffer.

Parameters
tElement to enqueue
bufferPointer to the internal buffer
max_sizeMaximum size of the buffer
Returns
true if the element was successfully enqueued, false if the buffer is full

◆ enqueue() [2/2]

template<typename T>
template<bool _All>
size_t qb::lockfree::spsc::internal::ringbuffer< T >::enqueue ( const T * input_buffer,
size_t input_count,
T * internal_buffer,
size_t const max_size )
inlineprotected

Enqueue multiple elements into the buffer.

Template Parameters
_AllIf true, either all elements are enqueued or none
Parameters
input_bufferPointer to source elements
input_countNumber of elements to enqueue
internal_bufferPointer to the internal buffer
max_sizeMaximum size of the buffer
Returns
Number of elements successfully enqueued

◆ dequeue()

template<typename T>
size_t qb::lockfree::spsc::internal::ringbuffer< T >::dequeue ( T * output_buffer,
size_t output_count,
T * internal_buffer,
size_t const max_size )
inlineprotected

Dequeue multiple elements from the buffer.

Parameters
output_bufferDestination buffer for dequeued elements
output_countMaximum number of elements to dequeue
internal_bufferPointer to the internal buffer
max_sizeMaximum size of the buffer
Returns
Number of elements successfully dequeued

◆ consume_all()

template<typename T>
template<typename _Func>
size_t qb::lockfree::spsc::internal::ringbuffer< T >::consume_all ( _Func const & functor,
T * internal_buffer,
size_t max_size )
inlineprotected

Process all available elements in the buffer using a functor.

Template Parameters
_FuncFunctor type
Parameters
functorFunction to call for each batch of elements
internal_bufferPointer to the internal buffer
max_sizeMaximum size of the buffer
Returns
Number of elements processed

◆ front() [1/2]

template<typename T>
const T & qb::lockfree::spsc::internal::ringbuffer< T >::front ( const T * internal_buffer) const
inlineprotected

Get a reference to the element at the read index (const version)

Parameters
internal_bufferPointer to the internal buffer
Returns
Const reference to the front element

◆ front() [2/2]

template<typename T>
T & qb::lockfree::spsc::internal::ringbuffer< T >::front ( T * internal_buffer)
inlineprotected

Get a reference to the element at the read index.

Parameters
internal_bufferPointer to the internal buffer
Returns
Reference to the front element

◆ empty()

template<typename T>
bool qb::lockfree::spsc::internal::ringbuffer< T >::empty ( )
inline

Check if the buffer is empty.

Returns
true if the buffer is empty, false otherwise