18 #include <type_traits>
33 template<
typename Event, std::
size_t Capacity>
36 static_assert(Capacity > 1,
37 "tsm: fixed_ring_queue needs at least two slots");
41 static constexpr std::size_t
capacity = Capacity;
43 [[nodiscard]]
bool try_push(Event
const& event)
48 data_[push_index_] = event;
49 push_index_ = next(push_index_);
59 data_[push_index_] = std::move(event);
60 push_index_ = next(push_index_);
70 event = std::move(data_[pop_index_]);
71 pop_index_ = next(pop_index_);
76 template<
typename Value>
82 data_[previous(push_index_)] = std::forward<Value>(event);
86 [[nodiscard]]
bool empty()
const
90 [[nodiscard]]
bool full()
const
92 return size_ == Capacity;
94 [[nodiscard]] std::size_t
size()
const
107 static constexpr std::size_t next(std::size_t index)
109 return (index + 1U) % Capacity;
112 static constexpr std::size_t previous(std::size_t index)
114 return index == 0U ? Capacity - 1U : index - 1U;
117 std::array<Event, Capacity> data_{};
118 std::size_t push_index_{};
119 std::size_t pop_index_{};
129 template<std::
size_t Capacity>
134 template<
typename Event>
145 #if defined(__FREE_RTOS__)
147 #elif defined(__ZEPHYR__)
153 template<std::
size_t Capacity,
typename StorageTag = active_storage_tag>
156 template<std::
size_t Capacity>
168 template<std::
size_t Capacity>
175 template<std::
size_t Capacity>
178 template<std::
size_t Capacity>
187 typename StoragePolicy,
191 static_assert(runtime::queue_storage_policy<StoragePolicy, T>,
192 "tsm: queue requires a storage policy for T");
194 "tsm: queue requires a known overflow policy");
196 using storage_type =
typename StoragePolicy::template
queue<T>;
210 return push(std::move(value));
215 return storage_.try_pop(value);
220 return storage_.empty();
222 [[nodiscard]]
bool full()
const
224 return storage_.full();
226 [[nodiscard]] std::size_t
size()
const
228 return storage_.size();
232 template<
typename Value>
233 [[nodiscard]]
bool push(Value&& value)
235 if constexpr (std::same_as<OverflowPolicy, overflow::reject_newest>) {
236 return storage_.try_push(std::forward<Value>(value));
237 }
else if constexpr (std::same_as<OverflowPolicy,
239 if (storage_.try_push(std::forward<Value>(value))) {
243 if (!storage_.try_pop(discarded)) {
246 return storage_.try_push(std::forward<Value>(value));
248 if (storage_.try_push(std::forward<Value>(value))) {
251 return storage_.try_overwrite_latest(std::forward<Value>(value));
255 storage_type storage_{};
Definition: static_ring.h:190
bool try_pop(T &value)
Definition: static_ring.h:213
T value_type
Definition: static_ring.h:199
std::size_t size() const
Definition: static_ring.h:226
bool full() const
Definition: static_ring.h:222
StoragePolicy storage_policy
Definition: static_ring.h:200
bool empty() const
Definition: static_ring.h:218
bool try_push(T const &value)
Definition: static_ring.h:203
OverflowPolicy overflow_policy
Definition: static_ring.h:201
bool try_push(T &&value)
Definition: static_ring.h:208
Definition: static_ring.h:35
static constexpr std::size_t capacity
Definition: static_ring.h:41
bool empty() const
Definition: static_ring.h:86
void clear()
Definition: static_ring.h:99
bool try_overwrite_latest(Value &&event)
Definition: static_ring.h:77
std::size_t size() const
Definition: static_ring.h:94
bool try_push(Event &&event)
Definition: static_ring.h:54
Event value_type
Definition: static_ring.h:40
bool full() const
Definition: static_ring.h:90
bool try_push(Event const &event)
Definition: static_ring.h:43
bool try_pop(Event &event)
Definition: static_ring.h:65
Definition: freertos.h:26
typename target_storage< Capacity >::type target_queue
Definition: static_ring.h:169
Definition: bare_metal.h:20
runtime::storage::target_queue< Capacity > target_storage
Definition: static_ring.h:179
Runtime policy tags for dispatch and bounded queue admission.
Definition: static_ring.h:141
Definition: static_ring.h:131
static constexpr std::size_t capacity
Definition: static_ring.h:132
Definition: static_ring.h:139
Definition: static_ring.h:154
Definition: static_ring.h:143