semf
signal.h
Go to the documentation of this file.
1
11#ifndef SEMF_UTILS_CORE_SIGNALS_SIGNAL_H_
12#define SEMF_UTILS_CORE_SIGNALS_SIGNAL_H_
13
15#include <cstddef>
16#include <utility>
17
23#define SEMF_SIGNAL(name, ...) semf::Signal<__VA_ARGS__> name
24
25namespace semf
26{
39template <typename... Arguments>
40class Signal
41{
42public:
46 void clear();
61 void emitSignal(Arguments... arguments) const;
66 void operator()(Arguments... arguments) const;
71 bool empty() const;
72
73private:
75 SlotBase<Arguments...>* m_slot = nullptr;
77 size_t m_connectedSlots = 0;
78};
79
80template <typename... Arguments>
82{
83 SlotBase<Arguments...>** nextSlot;
84 for (auto** i = &m_slot; m_connectedSlots && *i; i = nextSlot)
85 {
86 nextSlot = &((*i)->m_nextSlot);
87 *i = nullptr;
88
89 m_connectedSlots--;
90 }
91}
92
93template <typename... Arguments>
95{
96 /* is slot already in use? */
97 if (slot.m_nextSlot)
98 return;
99
100 slot.m_nextSlot = m_slot;
101 m_slot = &slot;
102
103 m_connectedSlots++;
104}
105
106template <typename... Arguments>
108{
109 auto** i = &m_slot;
110 for (; *i && (*i) != &slot; i = &((*i)->m_nextSlot))
111 continue;
112
113 if (*i)
114 {
115 (*i) = (*i)->m_nextSlot;
116 slot.m_nextSlot = nullptr;
117 m_connectedSlots--;
118 }
119}
120
121template <typename... Arguments>
122void Signal<Arguments...>::emitSignal(Arguments... arguments) const
123{
124 auto slot = m_slot;
125 for (size_t i = 0; i < m_connectedSlots; i++)
126 {
127 slot->call(std::forward<Arguments>(arguments)...);
128 slot = slot->m_nextSlot;
129 }
130}
131
132template <typename... Arguments>
133void Signal<Arguments...>::operator()(Arguments... arguments) const
134{
135 auto slot = m_slot;
136 for (size_t i = 0; i < m_connectedSlots; i++)
137 {
138 slot->call(std::forward<Arguments>(arguments)...);
139 slot = slot->m_nextSlot;
140 }
141}
142
143template <typename... Arguments>
145{
146 return !m_slot;
147}
148
149} // namespace semf
150#endif // SEMF_UTILS_CORE_SIGNALS_SIGNAL_H_
Signal for lightweight signal/slot implementation. One signal can be connected to multiple slots and ...
Definition: signal.h:41
void operator()(Arguments... arguments) const
Call the connected methods or functions.
Definition: signal.h:133
bool empty() const
Checks if the Signal is connected to any slot.
Definition: signal.h:144
void emitSignal(Arguments... arguments) const
Call the connected methods or functions.
Definition: signal.h:122
void clear()
Disconnect all functions or methods.
Definition: signal.h:81
void connect(SlotBase< Arguments... > &slot)
Connect a method to the signal.
Definition: signal.h:94
void disconnect(SlotBase< Arguments... > &slot)
Disonnect a method from the signal.
Definition: signal.h:107