aGrUM  0.16.0
signaler0.h
Go to the documentation of this file.
1 
31 #ifndef GUM_SIGNALER0_H
32 #define GUM_SIGNALER0_H
33 #include <functional>
34 
35 #include <agrum/agrum.h>
36 #include <agrum/core/list.h>
38 
39 namespace gum {
40 
41 #ifndef DOXYGEN_SHOULD_SKIP_THIS
42 
43  namespace __sig__ {
44 
45  class IConnector0 {
46  public:
47  virtual ~IConnector0(){};
48 
49  virtual Listener* target() const = 0;
50  virtual void notify(const void*) = 0;
51  virtual IConnector0* clone() = 0;
52  virtual IConnector0* duplicate(Listener* target) = 0;
53  };
54 
55  class BasicSignaler0 : public ISignaler {
56  protected:
57  typedef std::vector< IConnector0* > ConnectorList;
58 
59  BasicSignaler0();
60 
61  BasicSignaler0(const BasicSignaler0& s);
62 
63  public:
64  virtual ~BasicSignaler0();
65 
66  bool hasListener();
67 
68  void detach(Listener* target);
69 
70  protected:
71  friend class Listener;
72 
73  void _detachFromTarget(Listener* target);
74 
75  void _duplicateTarget(const Listener* oldtarget, Listener* newtarget);
76 
77  ConnectorList _connectors;
78 
79  private:
80  std::function< bool(IConnector0* el) > __find_target(const gum::Listener* l);
81  };
82 
83  template < class TargetClass >
84  class Connector0 : public IConnector0 {
85  public:
86  Connector0();
87 
88  Connector0(TargetClass* target, void (TargetClass::*action)(const void*));
89 
90  Connector0(const Connector0< TargetClass >* src);
91 
92  virtual ~Connector0();
93 
94  virtual IConnector0* clone();
95 
96  virtual IConnector0* duplicate(Listener* target);
97 
98  virtual void notify(const void* src);
99 
100  virtual Listener* target() const;
101 
102  private:
103  TargetClass* __target;
104  void (TargetClass::*__action)(const void*);
105  };
106 
107  } // namespace __sig__
108 
109 #endif // DOXYGEN_SHOULD_SKIP_THIS
110 
118  class Signaler0 : public __sig__::BasicSignaler0 {
119  public:
120  Signaler0() { GUM_CONSTRUCTOR(Signaler0); }
121 
122  Signaler0(const Signaler0& s) : __sig__::BasicSignaler0(s) {
123  GUM_CONS_CPY(Signaler0);
124  }
125 
126  virtual ~Signaler0() { GUM_DESTRUCTOR(Signaler0); }
127 
128  template < class TargetClass >
129  void attach(TargetClass* target, void (TargetClass::*action)(const void*)) {
130  __sig__::Connector0< TargetClass >* conn =
131  new __sig__::Connector0< TargetClass >(target, action);
132  this->_connectors.push_back(conn);
133  target->attachSignal__(this);
134  }
135 
136  INLINE void operator()(const void* src) {
137  for (const auto el : _connectors) {
138  el->notify(src);
139  }
140  }
141  };
142 
143 } // namespace gum
144 
146 #define GUM_EMIT0(signal) this->signal(this)
147 
148 // Template implementation should always be in headers
150 
151 #ifndef GUM_NO_INLINE
153 #endif // GUM_NO_INLINE
154 
155 #endif // GUM_SIGNALER0_H
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.
virtual ~Signaler0()
Definition: signaler0.h:126
void attach(TargetClass *target, void(TargetClass::*action)(const void *))
Definition: signaler0.h:129
Copyright 2005-2019 Pierre-Henri WUILLEMIN et Christophe GONZALES (LIP6) {prenom.nom}_at_lip6.fr.
Definition: agrum.h:25
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.
class for signal with 0 args
Definition: signaler0.h:118
Signaler0(const Signaler0 &s)
Definition: signaler0.h:122
INLINE void operator()(const void *src)
Definition: signaler0.h:136
Every class who would catch signal from signaler should derive from Listener.
Definition: listener.h:74