31 #ifndef SIGNALER_PATRON_ACCEPTED 32 # error "This file should not be included directly. Please use signaler{x}.h" 33 #endif // SIGNALER_PATRON_ACCEPTED 37 #ifndef DOXYGEN_SHOULD_SKIP_THIS 43 template < LIST_DECL_CLASSES >
44 class MAKE_NAME(IConnector) {
48 virtual Listener* target()
const = 0;
52 Listener* target) = 0;
55 template < LIST_DECL_CLASSES >
56 class MAKE_NAME(BasicSignaler) :
public ISignaler {
58 typedef List< MAKE_NAME(IConnector) < LIST_CLASSES >* > ConnectorList;
59 typedef ListConstIteratorSafe<
MAKE_NAME(IConnector)
65 (
const MAKE_NAME(BasicSignaler) & s) : ISignaler(s) {
68 for (
const auto& connector : _connectors) {
69 connector->target()->attachSignal__(
this);
70 _connectors.pushBack(connector->clone());
78 for (
const auto& connector : _connectors) {
79 connector->target()->detachSignal__(
this);
86 bool hasListener() {
return (!(_connectors.empty())); }
88 void detach(Listener* target) {
89 for (ConnectorIterator it =
90 _connectors.reginSafe();
91 it != _connectors.rendSafe();
93 if ((*it)->target() == target) {
95 _connectors.erase(it);
96 target->detachSignal__(
this);
103 friend class Listener;
105 void duplicateTarget(
const Listener* oldtarget, Listener* newtarget) {
106 for (
const auto& connector : _connectors)
107 if (connector->target() == oldtarget) {
108 _connectors.pushBack(connector->duplicate(newtarget));
112 void detachFromTarget(Listener* target) {
113 ConnectorIterator itprev;
115 for (ConnectorIterator it =
116 _connectors.rbeginSafe();
117 it != _connectors.rendSafe();) {
121 if ((*itprev)->target() == target) {
123 _connectors.erase(itprev);
128 ConnectorList _connectors;
131 template <
class TargetClass, LIST_DECL_CLASSES >
132 class MAKE_NAME(Connector) :
public MAKE_NAME(IConnector)< LIST_CLASSES > {
141 (TargetClass* target,
142 void (TargetClass::*action)(
const void*,
LIST_CLASSES)) {
163 (TargetClass*)target, __action);
170 INLINE
virtual Listener* target()
const {
return __target; }
173 TargetClass* __target;
174 void (TargetClass::*__action)(
const void*,
LIST_CLASSES);
179 template < LIST_DECL_CLASSES >
180 class MAKE_NAME(Signaler) :
183 BasicSignaler)<
LIST_CLASSES >::ConnectorIterator ConnectorIterator;
198 template <
class TargetClass >
199 void attach(TargetClass* target,
200 void (TargetClass::*action)(
const void*,
LIST_CLASSES)) {
204 this->_connectors.pushBack(conn);
205 target->attachSignal__(
this);
209 for (
const auto& connector : this->_connectors) {
217 #endif // DOXYGEN_SHOULD_SKIP_THIS 220 #undef LIST_DECL_CLASSES 222 #undef LIST_DECL_ARGS 224 #undef SIGNALER_PATRON_ACCEPTED
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.