|
Common System 0.2.0
Common interfaces and patterns for system integration
|
Lock-free circular buffer for single-producer single-consumer (SPSC). More...
#include <circular_buffer.h>

Public Member Functions | |
| SPSCCircularBuffer ()=default | |
| bool | push (const T &value) |
| Push a value (producer thread only). | |
| bool | push (T &&value) |
| std::optional< T > | pop () |
| Pop a value (consumer thread only). | |
| bool | empty () const noexcept |
| bool | full () const noexcept |
| std::size_t | size () const noexcept |
| constexpr std::size_t | capacity () const noexcept |
Static Private Member Functions | |
| static std::size_t | advance (std::size_t index) noexcept |
Private Attributes | |
| std::array< T, Capacity+1 > | buffer_ {} |
| std::atomic< std::size_t > | head_ {0} |
| std::atomic< std::size_t > | tail_ {0} |
Lock-free circular buffer for single-producer single-consumer (SPSC).
Uses std::atomic head/tail with acquire/release ordering. No mutex is needed because only the producer modifies tail_ and only the consumer modifies head_. Capacity must be > 0. One slot is reserved to distinguish full from empty, so the usable capacity is exactly Capacity elements.
Definition at line 118 of file circular_buffer.h.
|
default |
|
inlinestaticprivatenoexcept |
Definition at line 188 of file circular_buffer.h.
Referenced by kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::full(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::pop(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::push(), and kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::push().

|
inlinenodiscardconstexprnoexcept |
Definition at line 183 of file circular_buffer.h.
|
inlinenodiscardnoexcept |
Definition at line 164 of file circular_buffer.h.
References kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::head_, and kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::tail_.
|
inlinenodiscardnoexcept |
Definition at line 169 of file circular_buffer.h.
References kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::advance(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::head_, and kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::tail_.

|
inlinenodiscard |
Pop a value (consumer thread only).
Definition at line 154 of file circular_buffer.h.
References kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::advance(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::buffer_, kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::head_, and kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::tail_.
Referenced by main().


|
inline |
Push a value (producer thread only).
Definition at line 128 of file circular_buffer.h.
References kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::advance(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::buffer_, kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::head_, and kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::tail_.
Referenced by main().


|
inline |
Definition at line 139 of file circular_buffer.h.
References kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::advance(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::buffer_, kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::head_, and kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::tail_.

|
inlinenodiscardnoexcept |
Definition at line 174 of file circular_buffer.h.
References kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::head_, and kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::tail_.
Referenced by main().

|
private |
Definition at line 193 of file circular_buffer.h.
Referenced by kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::pop(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::push(), and kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::push().
|
private |
Definition at line 194 of file circular_buffer.h.
Referenced by kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::empty(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::full(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::pop(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::push(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::push(), and kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::size().
|
private |
Definition at line 195 of file circular_buffer.h.
Referenced by kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::empty(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::full(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::pop(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::push(), kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::push(), and kcenon::common::utils::SPSCCircularBuffer< T, Capacity >::size().