Pico GPS Teseo I2C
Loading...
Searching...
No Matches
callbackmanager.cpp
Go to the documentation of this file.
1/*
2 * callbackmanager.cpp
3 *
4 * Created on: 16 jun. 2024
5 * Author: jancu
6 */
7
8module;
9
10#include <concepts>
11#include <functional>
12
13export module callbackmanager;
14
15namespace callbackmanager {
16
17// concept guards what types of return values we can handle
18template<typename R>
19concept Callbackable =
20 std::is_void<R>::value ||
21 std::is_arithmetic_v<R> ||
22 std::is_class_v<R>;
23
24export template <Callbackable R, typename... Args>
25class Callback {
26 using callbackfunction_t = std::function<R(Args...)>;
27public:
28 Callback() : callback_(nullptr), is_callback_set(false){}
29 Callback(callbackfunction_t&& callback) noexcept :
30 callback_(callback), is_callback_set(true){}
31
32 inline void set(callbackfunction_t&& callback) {
33 callback_ = callback;
34 is_callback_set = true;
35 }
36
37 inline void unset() {
38 callback_ = nullptr;
39 is_callback_set = false;
40 }
41
42 [[deprecated("Use operator () instead.")]]
43 inline R call(Args... args) {
44 return *this(args...);
45 }
46
47 inline bool is_set() {
48 return is_callback_set;
49 }
50
51 /*
52 * R can be an arithmetic type, an object, or void
53 */
54 inline R operator()(Args... args) {
55 if constexpr (std::is_void<R>::value) { // void
56 if (!is_callback_set) {
57 return;
58 } else {
59 (callback_)(args...);
60 }
61 } else if constexpr (std::is_class<R>::value) { // object
62 if (!is_callback_set) {
63 return R();
64 } else {
65 return (callback_)(args...);
66 }
67 } else { // not void nor object
68 if (!is_callback_set) {
69 return 0; // R can only be a arithmetic type. 0 should work as default.
70 } else {
71 return (callback_)(args...);
72 }
73 }
74 }
75
76private:
77 callbackfunction_t callback_;
78 bool is_callback_set;
79};
80
81} // namespace callbackmanager
Callback(callbackfunction_t &&callback) noexcept
void set(callbackfunction_t &&callback)