9#include "fixed_string.hpp"
20template<
typename T,
size_t Capacity>
21class wfree_message_queue;
23template<
typename T,
size_t Capacity,
bool WriteOperation>
35 parent(other.parent), index(other.index)
37 tt_axiom(
this != &other);
38 other.parent =
nullptr;
43 if (parent ==
nullptr) {
47 if constexpr (WriteOperation) {
58 tt_axiom(
this != &other);
63 T &operator*()
noexcept
65 return (*parent)[index];
68 T *operator->()
noexcept
70 return &(*parent)[index];
74template<
typename T,
size_t Capacity>
76 using index_type = size_t;
89 static constexpr index_type capacity = Capacity;
93 static constexpr index_type slack = 16;
94 static_assert(capacity > (slack * 2),
"The capacity of the message queue should be much larger than its slack.");
111 index_type
size() const noexcept {
113 return head.
load(std::memory_order_relaxed) - tail.
load(std::memory_order_relaxed);
116 bool empty() const noexcept {
117 return head.
load(std::memory_order_relaxed) <= tail.
load(std::memory_order_relaxed);
120 bool full() const noexcept {
121 return head.
load(std::memory_order_relaxed) >= (tail.
load(std::memory_order_relaxed) + (capacity - slack));
129 template<basic_fixed_string BlockCounterTag =
"">
131 return {
this, write_start<BlockCounterTag>()};
143 value_type
const &operator[](index_type index)
const noexcept {
144 return messages[index % capacity].value;
147 value_type &operator[](index_type index)
noexcept {
148 return messages[index % capacity].value;
158 template<basic_fixed_string CounterTag =
"">
160 ttlet index = head.
fetch_add(1, std::memory_order_acquire);
161 auto &message = messages[index % capacity];
167 wait_for_transition<CounterTag>(message.in_use,
false, std::memory_order_acquire);
177 auto &message = messages[index % capacity];
180 message.in_use.store(
true, std::memory_order_release);
191 ttlet index = tail.
fetch_add(1, std::memory_order_acquire);
192 auto &message = messages[index % capacity];
195 wait_for_transition<CounterTag>(message.in_use,
true, std::memory_order_acquire);
205 auto &message = messages[index % capacity];
208 message.in_use.store(
false, std::memory_order_release);
example: ``` template<tt::basic_fixed_string Foo> class A { auto bar() { return std::string{Foo}; } }...
Definition fixed_string.hpp:29
Definition wfree_message_queue.hpp:75
index_type size() const noexcept
Definition wfree_message_queue.hpp:111
index_type write_start() noexcept
Start a write into the message queue.
Definition wfree_message_queue.hpp:159
scoped_write_operation write() noexcept
Definition wfree_message_queue.hpp:130
void read_finish(index_type index) noexcept
Definition wfree_message_queue.hpp:204
scoped_read_operation read() noexcept
Definition wfree_message_queue.hpp:139
void write_finish(index_type index) noexcept
Definition wfree_message_queue.hpp:176
index_type read_start() noexcept
Definition wfree_message_queue.hpp:190
Definition wfree_message_queue.hpp:24