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 "../macros.hpp"
10#include <future>
11
12namespace hi::inline v1 {
13
23template<typename Proto = void(), std::size_t SlotSize = 64>
25public:
26 constexpr function_fifo() noexcept = default;
27 function_fifo(function_fifo const&) = delete;
28 function_fifo(function_fifo&&) = delete;
29 function_fifo& operator=(function_fifo const&) = delete;
30 function_fifo& operator=(function_fifo&&) = delete;
31
34 [[nodiscard]] bool empty() const noexcept
35 {
36 return _fifo.empty();
37 }
38
44 template<typename... Args>
45 auto run_one(Args&&...args) noexcept
46 {
47 return _fifo.take_one([&args...](auto& item) {
48 return item(hi_forward(args)...);
49 });
50 }
51
56 void run_all() noexcept
57 {
58 while (run_one()) {}
59 }
60
69 template<typename Func>
70 void add_function(Func&& func) noexcept
71 {
72 _fifo.insert(make_function<Proto>(std::forward<Func>(func)));
73 }
74
85 template<typename Func, typename... Args>
86 auto add_async_function(Func&& func, Args&&...args) noexcept
87 requires(std::is_invocable_v<std::decay_t<Func>, std::decay_t<Args>...>)
88 {
89 return _fifo.insert_and_invoke(
90 [](auto& item) {
91 return item.get_future();
92 },
93 make_function<Proto>(std::forward<Func>(func)));
94 }
95
96private : wfree_fifo<function<Proto>, SlotSize> _fifo;
97};
98
99} // namespace hi::inline v1
DOXYGEN BUG.
Definition algorithm.hpp:16
constexpr Out narrow_cast(In const &rhs) noexcept
Cast numeric values without loss of precision.
Definition cast.hpp:377
A fifo (First-in, Firts-out) for asynchronous calls.
Definition function_fifo.hpp:24
void run_all() noexcept
Run all the functions posted or send on the fifo.
Definition function_fifo.hpp:56
void add_function(Func &&func) noexcept
Asynchronously post a functor to the fifo to be executed later.
Definition function_fifo.hpp:70
auto add_async_function(Func &&func, Args &&...args) noexcept
Asynchronously send a functor to the fifo to be executed later.
Definition function_fifo.hpp:86
auto run_one(Args &&...args) noexcept
Run one of the function that was posted or send.
Definition function_fifo.hpp:45
bool empty() const noexcept
Check if there are not functions added to the fifo.
Definition function_fifo.hpp:34
A wait-free multiple-producer/single-consumer fifo designed for absolute performance.
Definition wfree_fifo.hpp:36