52 template <
class TargetClass,
typename... Args >
58 template <
class TargetClass,
typename... Args >
64 template <
class TargetClass,
typename... Args >
69 template <
class TargetClass,
typename... Args >
74 template <
class TargetClass,
typename... Args >
76 return new Connector< TargetClass, Args... >(*this);
79 template <
class TargetClass,
typename... Args >
81 return new Connector< TargetClass, Args... >(
static_cast< TargetClass*
>(newTarget),
_action_);
88 template <
typename... Args >
92 auto* cloned = connector->clone();
94 cloned->target()->_attachSignal_(
this);
98 template <
typename... Args >
102 connector->target()->_detachSignal_(
this);
108 template <
typename... Args >
113 template <
typename... Args >
116 if ((*it)->target() == target) {
126 template <
typename... Args >
129 if ((*it)->target() == target) {
138 template <
typename... Args >
142 if (connector->target() == oldTarget) { toAdd.push_back(connector->duplicate(newTarget)); }
144 for (
auto* newConn: toAdd) {
157 template <
typename... Args >
162 template <
typename... Args >
163 template <
class TargetClass >
165 void (TargetClass::*action)(
const void*, Args...)) {
168 target->_attachSignal_(
this);
171 template <
typename... Args >
174 for (
const auto connectors = this->
_connectors_;
auto* connector: connectors) {
175 connector->notify(src, args...);
Every class who would catch signal from signaler should derive from Listener.
void _detachSignal_(__sig__::ISignaler *sender)
Signaler()
Default constructor.
void attach(TargetClass *target, void(TargetClass::*action)(const void *, Args...))
Attach a listener with a member function callback.
void operator()(const void *src, Args... args)
Emit the signal, notifying all attached listeners.
std::vector< IConnector< Args... > * > ConnectorList
void duplicateTarget(const Listener *oldTarget, Listener *newTarget) override
Called by Listener copy constructor to duplicate connections.
BasicSignaler()
Default constructor.
friend class gum::Listener
~BasicSignaler() override
Destructor: detaches from all targets and deletes connectors.
void detachFromTarget(Listener *target) override
Called by Listener to detach when the listener is destroyed.
ConnectorList _connectors_
void detach(Listener *target)
Detach a specific listener from this signaler.
bool hasListener() override
Concrete connector binding a target object and its member function.
void(TargetClass::*)(const void *, Args...) ActionType
Type alias for the member function pointer.
Listener * target() const override
IConnector< Args... > * duplicate(Listener *newTarget) const override
Create a duplicate connector pointing to a new target.
void notify(const void *src, Args... args) override
Notify the target with the given source and arguments.
Connector()
Default constructor.
IConnector< Args... > * clone() const override
Create a deep copy of this connector.
Abstract interface for signal connectors with variadic arguments.
Internal namespace for aGrUM signaler/listener components.
gum is the global namespace for all aGrUM entities
C++20 variadic template implementation of the Signaler/Listener pattern.