sandbox
Loading...
Searching...
No Matches
observer.hpp
1#ifndef LIBSBX_SIGNAL_OBSERVER_HPP_
2#define LIBSBX_SIGNAL_OBSERVER_HPP_
3
4#include <mutex>
5#include <vector>
6#include <functional>
7
8#include <libsbx/signals/lockable.hpp>
9
10namespace sbx::signals {
11
12struct observer_type { };
13
14template<typename Type>
15constexpr auto is_observer_v = std::is_base_of_v<observer_type, std::remove_pointer_t<std::remove_reference_t<Type>>>;
16
17template<lockable Lockable>
19
20 template <lockable, typename ...>
21 friend class signal_base;
22
23public:
24
25 using lockable_type = Lockable;
26
27 virtual ~observer_base() = default;
28
29protected:
30
31 void disconnect_all() {
32 auto lock = std::unique_lock<lockable_type>{_mutex};
33
34 _connections.clear();
35 }
36
37private:
38
39 void add_connection(connection connection) {
40 auto lock = std::unique_lock<lockable_type>{_mutex};
41
42 _connections.emplace_back(std::move(connection));
43 }
44
45 lockable_type _mutex;
46 std::vector<scoped_connection> _connections;
47
48}; // class observer_base
49
51
53
54using observer = observer_mt;
55
56} // namespace sbx::signals
57
58#endif // LIBSBX_SIGNAL_OBSERVER_HPP_
Definition: connection.hpp:58
Definition: observer.hpp:18
Definition: signal.hpp:16
Definition: observer.hpp:12