10#include "polymorphic_optional.hpp"
20hi_warning_ignore_msvc(26490);
22namespace hi::inline
v1 {
34template<
typename T, std::
size_t SlotSize>
37 static_assert(std::has_single_bit(SlotSize),
"Only power-of-two number of messages size allowed.");
38 static_assert(SlotSize < 65536);
45 static constexpr std::size_t num_slots = fifo_size / slot_size;
57 [[nodiscard]]
bool empty() const noexcept
59 return _head.load(std::memory_order::relaxed) == _tail;
69 template<
typename Func>
72 auto result = get_slot(_tail).invoke_and_reset(std::forward<Func>(func));
85 template<
typename Operation>
86 void take_all(Operation
const& operation)
noexcept
88 while (take_one(operation)) {}
98 template<
typename Message,
typename Func,
typename... Args>
108 hilet offset = _head.fetch_add(slot_size, std::memory_order::relaxed);
109 return get_slot(offset).template wait_emplace_and_invoke<Message>(std::forward<Func>(func), std::forward<Args>(args)...);
112 template<
typename Func,
typename Object>
113 hi_force_inline
auto insert_and_invoke(Func&& func, Object&&
object)
noexcept
115 return emplace_and_invoke<std::decay_t<Object>>(std::forward<Func>(func), std::forward<Object>(
object));
118 template<
typename Message,
typename... Args>
119 hi_force_inline
void emplace(Args&&...args)
noexcept
121 return emplace_and_invoke<Message>([](Message&) ->
void {}, std::forward<Args>(args)...);
124 template<
typename Object>
125 hi_force_inline
void insert(Object &&
object)
noexcept
127 return emplace<std::decay_t<Object>>(std::forward<Object>(
object));
138 hi_force_inline slot_type& get_slot(uint16_t offset)
noexcept
142 return *std::launder(
143 std::assume_aligned<slot_size>(
reinterpret_cast<slot_type *
>(
reinterpret_cast<char *
>(
this) + offset)));
#define hi_axiom(expression)
Specify an axiom; an expression that is true.
Definition assert.hpp:133
#define hilet
Invariant should be the default for variables.
Definition utility.hpp:23
Functions and macros for handling architectural difference between compilers, CPUs and operating syst...
DOXYGEN BUG.
Definition algorithm.hpp:15
Polymorphic optional.
Definition polymorphic_optional.hpp:38
A wait-free multiple-producer/single-consumer fifo designed for absolute performance.
Definition wfree_fifo.hpp:35
auto take_one(Func &&func) noexcept
Take one message from the fifo slot.
Definition wfree_fifo.hpp:70
void take_all(Operation const &operation) noexcept
Take all message from the queue.
Definition wfree_fifo.hpp:86
bool empty() const noexcept
Check if fifo is empty.
Definition wfree_fifo.hpp:57
hi_force_inline auto emplace_and_invoke(Func &&func, Args &&...args) noexcept
Create an message in-place on the fifo.
Definition wfree_fifo.hpp:99