HikoGUI
A low latency retained GUI
Loading...
Searching...
No Matches
function_fifo.hpp
1// Copyright Take Vos 2022.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at https://www.boost.org/LICENSE_1_0.txt)
4
5#pragma once
6
7#include "wfree_fifo.hpp"
8#include "functional.hpp"
9#include <future>
10
11namespace hi::inline v1 {
12
22template<typename Proto = void(), std::size_t SlotSize = 64>
24public:
25 constexpr function_fifo() noexcept = default;
26 function_fifo(function_fifo const&) = delete;
27 function_fifo(function_fifo&&) = delete;
28 function_fifo& operator=(function_fifo const&) = delete;
29 function_fifo& operator=(function_fifo&&) = delete;
30
33 [[nodiscard]] bool empty() const noexcept
34 {
35 return _fifo.empty();
36 }
37
43 template<typename... Args>
44 auto run_one(Args&&...args) noexcept
45 {
46 return _fifo.take_one([&args...](auto& item) {
47 return item(hi_forward(args)...);
48 });
49 }
50
55 void run_all() noexcept
56 {
57 while (run_one()) {}
58 }
59
68 template<typename Func>
69 void add_function(Func&& func) noexcept
70 {
71 _fifo.insert(make_function<Proto>(std::forward<Func>(func)));
72 }
73
84 template<typename Func, typename... Args>
85 auto add_async_function(Func&& func, Args&&...args) noexcept
86 requires(std::is_invocable_v<std::decay_t<Func>, std::decay_t<Args>...>)
87 {
88 return _fifo.insert_and_invoke(
89 [](auto& item) {
90 return item.get_future();
91 },
92 make_function<Proto>(std::forward<Func>(func)));
93 }
94
95private : wfree_fifo<function<Proto>, SlotSize> _fifo;
96};
97
98} // namespace hi::inline v1
DOXYGEN BUG.
Definition algorithm.hpp:13
A fifo (First-in, Firts-out) for asynchronous calls.
Definition function_fifo.hpp:23
void run_all() noexcept
Run all the functions posted or send on the fifo.
Definition function_fifo.hpp:55
void add_function(Func &&func) noexcept
Asynchronously post a functor to the fifo to be executed later.
Definition function_fifo.hpp:69
auto add_async_function(Func &&func, Args &&...args) noexcept
Asynchronously send a functor to the fifo to be executed later.
Definition function_fifo.hpp:85
auto run_one(Args &&...args) noexcept
Run one of the function that was posted or send.
Definition function_fifo.hpp:44
bool empty() const noexcept
Check if there are not functions added to the fifo.
Definition function_fifo.hpp:33
A wait-free multiple-producer/single-consumer fifo designed for absolute performance.
Definition wfree_fifo.hpp:34