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