50#ifndef SIGNALER_PATRON_ACCEPTED
51# error "This file should not be included directly. Please use signaler{x}.h"
56#ifndef DOXYGEN_SHOULD_SKIP_THIS
62 template < LIST_DECL_CLASSES >
63 class MAKE_NAME(IConnector) {
65 virtual ~MAKE_NAME(IConnector)() {}
67 virtual Listener* target()
const = 0;
73 template < LIST_DECL_CLASSES >
74 class MAKE_NAME(BasicSignaler) :
public ISignaler {
80 GUM_CONSTRUCTOR(
MAKE_NAME(BasicSignaler));
86 (
const MAKE_NAME(BasicSignaler) & s) : ISignaler(s) {
89 for (
const auto& connector: connectors_) {
90 connector->target()->_attachSignal_(
this);
91 connectors_.pushBack(connector->clone());
96 virtual ~MAKE_NAME(BasicSignaler)() {
99 for (
const auto& connector: connectors_) {
100 connector->target()->_detachSignal_(
this);
107 bool hasListener() {
return (!(connectors_.empty())); }
109 void detach(Listener* target) {
110 for (ConnectorIterator it = connectors_.reginSafe();
111 it != connectors_.rendSafe();
113 if ((*it)->target() == target) {
115 connectors_.erase(it);
116 target->_detachSignal_(
this);
123 friend class Listener;
125 void duplicateTarget(
const Listener* oldtarget, Listener* newtarget) {
126 for (
const auto& connector: connectors_)
127 if (connector->target() == oldtarget) {
128 connectors_.pushBack(connector->duplicate(newtarget));
132 void detachFromTarget(Listener* target) {
133 ConnectorIterator itprev;
135 for (ConnectorIterator it = connectors_.rbeginSafe();
136 it != connectors_.rendSafe();) {
140 if ((*itprev)->target() == target) {
142 connectors_.erase(itprev);
147 ConnectorList connectors_;
150 template <
class TargetClass, LIST_DECL_CLASSES >
151 class MAKE_NAME(Connector) :
public MAKE_NAME(IConnector)< LIST_CLASSES > {
161 (TargetClass* target, void (TargetClass::*action)(
const void*,
LIST_CLASSES)) {
174 virtual ~MAKE_NAME(Connector)() {
192 INLINE
virtual Listener* target()
const {
return _target_; }
195 TargetClass* _target_;
196 void (TargetClass::*_action_)(
const void*,
LIST_CLASSES);
201 template < LIST_DECL_CLASSES >
202 class MAKE_NAME(Signaler) :
public __sig__::MAKE_NAME(BasicSignaler)< LIST_CLASSES > {
203 using ConnectorIterator
204 =
typename __sig__::MAKE_NAME(BasicSignaler)<
LIST_CLASSES >::ConnectorIterator;
207 using BasicSignaler = __sig__::MAKE_NAME(BasicSignaler)<
LIST_CLASSES >;
220 virtual ~MAKE_NAME(Signaler)() {
225 template <
class TargetClass >
226 void attach(TargetClass* target,
void (TargetClass::*action)(
const void*,
LIST_CLASSES)) {
227 __sig__::MAKE_NAME(Connector)< TargetClass,
LIST_CLASSES >* conn
228 =
new __sig__::MAKE_NAME(Connector)< TargetClass,
LIST_CLASSES >(target, action);
229 this->connectors_.pushBack(conn);
230 target->_attachSignal_(
this);
234 for (
const auto& connector: this->connectors_) {
245#undef LIST_DECL_CLASSES
249#undef SIGNALER_PATRON_ACCEPTED
Generic class for manipulating lists.
Internal namespace for aGrUM signaler/listener components.
gum is the global namespace for all aGrUM entities