aGrUM 3.0.0
a C++ library for (probabilistic) graphical models
gum::Signaler< Args > Class Template Reference

Variadic template signaler for any number of arguments. More...

#include <agrum/base/core/signal/signaler.h>

Inheritance diagram for gum::Signaler< Args >:
Collaboration diagram for gum::Signaler< Args >:

Public Member Functions

 Signaler ()
 Default constructor.
 Signaler (const Signaler &other)
 Copy constructor.
 ~Signaler () override
 Destructor.
template<class TargetClass>
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.
bool hasListener () override
void detach (Listener *target)
 Detach a specific listener from this signaler.

Protected Types

using ConnectorList

Protected Member Functions

void detachFromTarget (Listener *target) override
 Called by Listener to detach when the listener is destroyed.
void duplicateTarget (const Listener *oldTarget, Listener *newTarget) override
 Called by Listener copy constructor to duplicate connections.

Protected Attributes

ConnectorList _connectors_

Detailed Description

template<typename... Args>
class gum::Signaler< Args >

Variadic template signaler for any number of arguments.

This class implements the signal/slot pattern with C++20 variadic templates. It can be used with any number of arguments (0 to N).

Usage example:

class MyEmitter {
public:
void setValue(int v, const std::string& name) {
onValueChanged(this, v, name);
}
};
class MyReceiver : public Listener {
public:
void handleChange(const void* src, int v, std::string name) {
// handle the signal
}
};
// Connect:
MyEmitter emitter;
MyReceiver receiver;
emitter.onValueChanged.attach(&receiver, &MyReceiver::handleChange);
Signaler()
Default constructor.
Definition signaler.h:239
Template Parameters
ArgsThe types of arguments passed when the signal is emitted.

Definition at line 236 of file signaler.h.

Member Typedef Documentation

◆ ConnectorList

using gum::__sig__::BasicSignaler< Args >::ConnectorList
protectedinherited

Definition at line 165 of file signaler.h.

Constructor & Destructor Documentation

◆ Signaler() [1/2]

template<typename... Args>
gum::Signaler< Args >::Signaler ( )
inline

Default constructor.

Definition at line 239 of file signaler.h.

Variadic template signaler for any number of arguments.
Definition signaler.h:236

Referenced by Signaler().

Here is the caller graph for this function:

◆ Signaler() [2/2]

template<typename... Args>
gum::Signaler< Args >::Signaler ( const Signaler< Args > & other)

Copy constructor.

Definition at line 158 of file signaler_tpl.h.

References gum::__sig__::BasicSignaler< Args... >::BasicSignaler(), and Signaler().

Here is the call graph for this function:

◆ ~Signaler()

template<typename... Args>
gum::Signaler< Args >::~Signaler ( )
inlineoverride

Destructor.

Definition at line 245 of file signaler.h.

Member Function Documentation

◆ attach()

template<typename... Args>
template<class TargetClass>
void gum::Signaler< Args >::attach ( TargetClass * target,
void(TargetClass::* action )(const void *, Args...) )

Attach a listener with a member function callback.

Template Parameters
TargetClassThe class type of the listener (must derive from Listener).
Parameters
targetPointer to the listener object.
actionPointer to the member function to call on signal emission.

Definition at line 164 of file signaler_tpl.h.

165 {
167 this->_connectors_.push_back(conn);
168 target->_attachSignal_(this);
169 }

References gum::__sig__::BasicSignaler< Args... >::_connectors_.

◆ detach()

void gum::__sig__::BasicSignaler< Args >::detach ( Listener * target)
inherited

Detach a specific listener from this signaler.

Definition at line 181 of file signaler_tpl.h.

114 {
115 for (auto it = _connectors_.rbegin(); it != _connectors_.rend(); ++it) {
116 if ((*it)->target() == target) {
117 auto* conn = *it;
118 _connectors_.erase(std::next(it).base());
119 target->_detachSignal_(this);
120 delete conn;
121 return;
122 }
123 }
124 }
Base class for signalers, managing connector lifecycle.
Definition signaler.h:163

◆ detachFromTarget()

void gum::__sig__::BasicSignaler< Args >::detachFromTarget ( Listener * target)
overrideprotectedinherited

Called by Listener to detach when the listener is destroyed.

Definition at line 187 of file signaler_tpl.h.

127 {
128 for (auto it = _connectors_.begin(); it != _connectors_.end();) {
129 if ((*it)->target() == target) {
130 delete *it;
131 it = _connectors_.erase(it);
132 } else {
133 ++it;
134 }
135 }
136 }

◆ duplicateTarget()

void gum::__sig__::BasicSignaler< Args >::duplicateTarget ( const Listener * oldTarget,
Listener * newTarget )
overrideprotectedinherited

Called by Listener copy constructor to duplicate connections.

Definition at line 190 of file signaler_tpl.h.

139 {
141 for (auto* connector: _connectors_) {
142 if (connector->target() == oldTarget) { toAdd.push_back(connector->duplicate(newTarget)); }
143 }
144 for (auto* newConn: toAdd) {
145 _connectors_.push_back(newConn);
146 }
147 }

◆ hasListener()

bool gum::__sig__::BasicSignaler< Args >::hasListener ( )
overrideinherited
Returns
true if at least one listener is attached.

Definition at line 178 of file signaler_tpl.h.

109 {
110 return !_connectors_.empty();
111 }

◆ operator()()

template<typename... Args>
void gum::Signaler< Args >::operator() ( const void * src,
Args... args )

Emit the signal, notifying all attached listeners.

Parameters
srcPointer to the source object (typically this of the emitter).
argsThe arguments to pass to each listener's callback.

Definition at line 172 of file signaler_tpl.h.

172 {
173 if (this->_connectors_.empty()) { return; }
174 for (const auto connectors = this->_connectors_; auto* connector: connectors) {
175 connector->notify(src, args...);
176 }
177 }

References gum::__sig__::BasicSignaler< Args... >::_connectors_.

Member Data Documentation

◆ _connectors_

ConnectorList gum::__sig__::BasicSignaler< Args >::_connectors_
protectedinherited

Definition at line 192 of file signaler.h.

Referenced by gum::Signaler< Args >::attach(), and gum::Signaler< Args >::operator()().


The documentation for this class was generated from the following files: