Volume Cartographer 2.27.0
Signals.hpp
Go to the documentation of this file.
1#pragma once
2
5#include <functional>
6#include <type_traits>
7#include <vector>
8
9namespace volcart
10{
11
36template <class... Types>
37class Signal
38{
39public:
41 using SlotFnType = std::function<void(Types...)>;
42
45 {
46 connections_.emplace_back(std::move(slot));
47 }
48
55 template <class Obj, class ObjMemberFn>
56 void connect(Obj* obj, ObjMemberFn&& fn)
57 {
58 connections_.emplace_back(
59 [=](Types... args) { return (*obj.*fn)(args...); });
60 }
61
65 template <class Obj, class Ret>
66 void connect(Obj* obj, Ret (Obj::*fn)())
67 {
68 connections_.emplace_back(
69 [=](Types... /*unused*/) { return (*obj.*fn)(); });
70 }
71
77 template <class Obj, class Ret>
78 void connect(const Obj* obj, Ret (Obj::*fn)() const)
79 {
80 connections_.emplace_back(
81 [=](Types... /*unused*/) { return (*obj.*fn)(); });
82 }
83
87 template <
88 class Enabled = typename std::enable_if<
89 std::is_empty<std::tuple<Types...>(Types...)>::value,
90 bool>>
91 void connect(const std::function<void()>& slot)
92 {
93 connections_.emplace_back([=](Types&&... /*unused*/) { slot(); });
94 }
95
97 void disconnect() { connections_.clear(); }
98
100 std::size_t numConnections() const { return connections_.size(); }
101
103 void send(Types... args) const
104 {
105 for (const auto& c : connections_) {
106 c.slot(args...);
107 }
108 }
109
111 void operator()(Types... args) const { send(std::forward<Types>(args)...); }
112
113private:
115 struct Connection {
116 Connection(const SlotFnType& f) { slot = f; }
117 SlotFnType slot;
118 };
120 std::vector<Connection> connections_;
121};
122
124template <>
125template <class Obj, class ObjMemberFn>
126void Signal<>::connect(Obj* obj, ObjMemberFn&& fn)
127{
128 connections_.emplace_back([=]() { return (*obj.*fn)(); });
129}
130
132template <>
133inline void Signal<>::operator()() const
134{
135 send();
136}
137
138} // namespace volcart
Basic signal class for implementing event callbacks.
Definition: Signals.hpp:38
void disconnect()
Remove all connections.
Definition: Signals.hpp:97
void connect(const Obj *obj, Ret(Obj::*fn)() const)
Connect a valued signal to a no-parameter object member function.
Definition: Signals.hpp:78
void send(Types... args) const
Signal all connections with parameters.
Definition: Signals.hpp:103
void connect(Obj *obj, ObjMemberFn &&fn)
Connect to an object's member function.
Definition: Signals.hpp:56
void connect(SlotFnType slot)
Connect to a free, static, or lambda function.
Definition: Signals.hpp:44
std::size_t numConnections() const
Get the number of connected slots.
Definition: Signals.hpp:100
void connect(Obj *obj, Ret(Obj::*fn)())
Connect a valued signal to a no-parameter object member function.
Definition: Signals.hpp:66
void connect(const std::function< void()> &slot)
Connect signals with parameters to functions without parameters.
Definition: Signals.hpp:91
std::function< void(Types...)> SlotFnType
Definition: Signals.hpp:41
void operator()(Types... args) const
Convenience operator: Calls Signal::send(args)
Definition: Signals.hpp:111
std::vector< Connection > connections_
Definition: Signals.hpp:120
Volume Cartographer library