11#ifndef SEMF_UTILS_CORE_SIGNALS_SIGNAL_H_
12#define SEMF_UTILS_CORE_SIGNALS_SIGNAL_H_
23#define SEMF_SIGNAL(name, ...) semf::Signal<__VA_ARGS__> name
39template <
typename... Arguments>
75 SlotBase<Arguments...>* m_slot =
nullptr;
77 size_t m_connectedSlots = 0;
80template <
typename... Arguments>
84 for (
auto** i = &m_slot; m_connectedSlots && *i; i = nextSlot)
86 nextSlot = &((*i)->m_nextSlot);
93template <
typename... Arguments>
100 slot.m_nextSlot = m_slot;
106template <
typename... Arguments>
110 for (; *i && (*i) != &slot; i = &((*i)->m_nextSlot))
115 (*i) = (*i)->m_nextSlot;
116 slot.m_nextSlot =
nullptr;
121template <
typename... Arguments>
125 for (
size_t i = 0; i < m_connectedSlots; i++)
127 slot->call(std::forward<Arguments>(arguments)...);
128 slot = slot->m_nextSlot;
132template <
typename... Arguments>
136 for (
size_t i = 0; i < m_connectedSlots; i++)
138 slot->call(std::forward<Arguments>(arguments)...);
139 slot = slot->m_nextSlot;
143template <
typename... Arguments>
Signal for lightweight signal/slot implementation. One signal can be connected to multiple slots and ...
void operator()(Arguments... arguments) const
Call the connected methods or functions.
bool empty() const
Checks if the Signal is connected to any slot.
void emitSignal(Arguments... arguments) const
Call the connected methods or functions.
void clear()
Disconnect all functions or methods.
void connect(SlotBase< Arguments... > &slot)
Connect a method to the signal.
void disconnect(SlotBase< Arguments... > &slot)
Disonnect a method from the signal.