27#ifndef EASY3D_UTIL_SIGNAL_H
28#define EASY3D_UTIL_SIGNAL_H
32#include <unordered_map>
53 template<
typename... Args>
65 slots_(std::move(other.slots_)),
66 current_id_(other.current_id_) {
72 slots_ = std::move(other.slots_);
73 current_id_ = other.current_id_;
95 int connect(std::function<
void(Args...)>
const &slot) {
96 slots_.insert(std::make_pair(++current_id_, slot));
112 template<
typename Class>
113 int connect(Class *inst,
void (Class::*func)(Args...)) {
114 return connect([=](Args... args) {
115 (inst->*func)(args...);
131 template<
typename Class>
132 int connect(Class *inst,
void (Class::*func)(Args...)
const) {
133 return connect([=](Args... args) {
134 (inst->*func)(args...);
159 for (
auto const &it : slots_) {
166 for (
auto const &it : slots_) {
167 if (it.first != excludedConnectionID) {
175 auto const &it = slots_.find(connectionID);
176 if (it != slots_.end()) {
182 std::unordered_map<int, std::function<void(Args...)>> slots_;
199 template<
typename SIGNAL,
typename FUNCTION>
200 inline int connect(SIGNAL *signal, FUNCTION
const &slot) {
201 return signal->connect(slot);
216 template<
typename SIGNAL,
typename CLASS,
typename FUNCTION>
217 inline int connect(SIGNAL *signal, CLASS *inst, FUNCTION
const &slot) {
218 return signal->connect(inst, slot);
226 template<
typename... Args>
228 return sender->
connect(receiver);
232 template<
typename SIGNAL>
234 signal->disconnect(
id);
238 template<
typename SIGNAL>
240 signal->disconnect_all();
261 template <
typename... Args>
262 inline constexpr auto overload(
void (*func)(Args...)) -> void (*)(Args...) {
284 template <
typename C,
typename... Args>
285 inline constexpr auto overload(
void (C::*func)(Args...)) -> void (C::*)(Args...) {
A light-weight implementation of the simple signal-slot mechanism.
Definition signal.h:54
void disconnect_all()
Disconnects all previously connected functions.
Definition signal.h:153
void send_for_all_but_one(int excludedConnectionID, Args... p)
Calls all connected functions except for one.
Definition signal.h:165
int connect(Class *inst, void(Class::*func)(Args...) const)
Connects a const member function of an object to this signal.
Definition signal.h:132
void emit_for(int connectionID, Args... p)
Calls only one connected function.
Definition signal.h:174
int connect(std::function< void(Args...)> const &slot)
Connects a function to this signal.
Definition signal.h:95
void send(Args... p)
Calls all connected functions.
Definition signal.h:158
Signal(Signal const &)
Copy constructor and assignment create a new signal.
Definition signal.h:61
int connect(Signal< Args... > *receiver)
Connects this signal to another signal receiver.
Definition signal.h:143
Signal(Signal &&other) noexcept
Move constructor.
Definition signal.h:64
Signal & operator=(Signal &&other) noexcept
The assignment operator.
Definition signal.h:70
int connect(Class *inst, void(Class::*func)(Args...))
Connects a member function of an object to this signal.
Definition signal.h:113
void disconnect(int id)
Disconnects a previously connected function.
Definition signal.h:148
Signal & operator=(Signal const &other)
The assignment operator.
Definition signal.h:79
Definition collider.cpp:182
constexpr auto overload(void(*func)(Args...)) -> void(*)(Args...)
Helper function for resolving overloaded non-member functions.
Definition signal.h:262
void disconnect(SIGNAL *signal, int id)
Disconnects a previously connected function.
Definition signal.h:233
void disconnect_all(SIGNAL *signal)
Disconnects all previously connected functions.
Definition signal.h:239
int connect(SIGNAL *signal, FUNCTION const &slot)
Connects a function to the signal.
Definition signal.h:200