LeviLamina
Loading...
Searching...
No Matches
CancellableCallback.h
1#pragma once
2
3#include <atomic>
4#include <functional>
5
6namespace ll::data {
8 union F {
9 std::function<void()> storage;
10 ~F() {}
11 } callback;
12 struct Dtor {
13 F& f;
14 ~Dtor() { f.storage.~function(); }
15 };
16 std::atomic_bool available;
17
18public:
19 CancellableCallback(std::function<void()>&& callback) : callback{std::move(callback)}, available{true} {}
20
21 bool cancel() {
22 if (available.exchange(false)) {
23 Dtor d{callback};
24 return true;
25 }
26 return false;
27 }
28
29 ~CancellableCallback() { cancel(); }
30
31 bool call() {
32 if (available.exchange(false)) {
33 Dtor d{callback};
34 callback.storage();
35 return true;
36 }
37 return false;
38 }
39
40 template <class F>
41 bool moveTo(F&& f) {
42 if (available.exchange(false)) {
43 Dtor d{callback};
44 return f(std::move(callback.storage));
45 }
46 return false;
47 }
48};
49} // namespace ll::data
Definition CancellableCallback.h:7