56 throw std::bad_alloc();
64 if (!std::is_trivially_destructible<T>::value) {
67 while (readIndex != endIndex) {
69 if (++readIndex ==
size_) {
78 template <
class... Args>
bool write(Args &&...recordArgs) {
79 auto const currentWrite =
writeIndex_.load(std::memory_order_relaxed);
80 auto nextRecord = currentWrite + 1;
81 if (nextRecord ==
size_) {
84 if (nextRecord !=
readIndex_.load(std::memory_order_acquire)) {
85 new (&
records_[currentWrite]) T(std::forward<Args>(recordArgs)...);
86 writeIndex_.store(nextRecord, std::memory_order_release);
96 auto const currentRead =
readIndex_.load(std::memory_order_relaxed);
97 if (currentRead ==
writeIndex_.load(std::memory_order_acquire)) {
102 auto nextRecord = currentRead + 1;
103 if (nextRecord ==
size_) {
106 record = std::move(
records_[currentRead]);
108 readIndex_.store(nextRecord, std::memory_order_release);
115 auto const currentRead =
readIndex_.load(std::memory_order_relaxed);
116 if (currentRead ==
writeIndex_.load(std::memory_order_acquire)) {
125 auto const currentRead =
readIndex_.load(std::memory_order_relaxed);
126 assert(currentRead !=
writeIndex_.load(std::memory_order_acquire));
128 auto nextRecord = currentRead + 1;
129 if (nextRecord ==
size_) {
133 readIndex_.store(nextRecord, std::memory_order_release);
141 auto nextRecord =
writeIndex_.load(std::memory_order_acquire) + 1;
142 if (nextRecord ==
size_) {
145 if (nextRecord !=
readIndex_.load(std::memory_order_acquire)) {
constexpr std::size_t hardware_destructive_interference_size
Definition ProducerConsumerQueue.hpp:34
Definition ProducerConsumerQueue.hpp:35
Definition ProducerConsumerQueue.hpp:41
char pad1_[hardware_destructive_interference_size - sizeof(AtomicIndex)]
Definition ProducerConsumerQueue.hpp:178
T * frontPtr()
Definition ProducerConsumerQueue.hpp:114
bool read(T &record)
Definition ProducerConsumerQueue.hpp:95
ProducerConsumerQueue(uint32_t size)
Definition ProducerConsumerQueue.hpp:52
AtomicIndex readIndex_
Definition ProducerConsumerQueue.hpp:175
AtomicIndex writeIndex_
Definition ProducerConsumerQueue.hpp:176
bool isEmpty() const
Definition ProducerConsumerQueue.hpp:136
T *const records_
Definition ProducerConsumerQueue.hpp:173
void popFront()
Definition ProducerConsumerQueue.hpp:124
char pad0_[hardware_destructive_interference_size]
Definition ProducerConsumerQueue.hpp:171
size_t capacity() const
Definition ProducerConsumerQueue.hpp:166
T value_type
Definition ProducerConsumerQueue.hpp:42
ProducerConsumerQueue & operator=(const ProducerConsumerQueue &)=delete
const uint32_t size_
Definition ProducerConsumerQueue.hpp:172
bool isFull() const
Definition ProducerConsumerQueue.hpp:140
size_t sizeGuess() const
Definition ProducerConsumerQueue.hpp:157
~ProducerConsumerQueue()
Definition ProducerConsumerQueue.hpp:60
ProducerConsumerQueue(const ProducerConsumerQueue &)=delete
bool write(Args &&...recordArgs)
Definition ProducerConsumerQueue.hpp:78
std::atomic< unsigned int > AtomicIndex
Definition ProducerConsumerQueue.hpp:169