Simpatico  v1.10
Signal.h
1 #ifndef UTIL_SIGNAL_H
2 #define UTIL_SIGNAL_H
3 
4 /*
5 * Util Package - C++ Utilities for Scientific Computation
6 *
7 * Copyright 2010 - 2017, The Regents of the University of Minnesota
8 * Distributed under the terms of the GNU General Public License.
9 */
10 
11 #include "IFunctor.h"
12 #include "MethodFunctor.h"
13 
14 #include <list>
15 
16 namespace Util
17 {
18 
19  using std::list;
20 
21  // -----------------------------------------------------------------
22  // Signal with one argument.
23 
37  template <typename T=void>
38  class Signal
39  {
40 
41  public:
42 
43  // Compiler default constructor.
44 
48  Signal(){};
49 
53  ~Signal();
54 
61  template <class Observer>
62  void addObserver(Observer& observer, void (Observer::*methodPtr)(const T&));
63 
67  void clear();
68 
72  int nObserver() const;
73 
84  void notify(const T& t);
85 
86  private:
87 
89  std::list<IFunctor<T>*> functorPtrs_;
90 
92  Signal(const Signal<T>& other);
93 
95  Signal<T>& operator = (const Signal<T>& other);
96 
97  };
98 
99  /*
100  * Destructor.
101  */
102  template <typename T>
104  { clear(); }
105 
106  /*
107  * Register an observer (add to list).
108  */
109  template <typename T>
110  template <class Observer> void
111  Signal<T>::addObserver(Observer& observer, void (Observer::*methodPtr)(const T&))
112  { functorPtrs_.push_back(new MethodFunctor<Observer, T>(observer, methodPtr)); }
113 
114  /*
115  * Notify observers (call associated methods).
116  */
117  template <typename T>
118  void Signal<T>::notify(const T& t)
119  {
120  typename std::list< IFunctor<T>* >::iterator pos;
121  pos = functorPtrs_.begin();
122  while (pos != functorPtrs_.end())
123  {
124  (**pos)(t);
125  ++pos;
126  }
127  }
128 
129  /*
130  * Clear all observers.
131  *
132  * Destroy associated functors.
133  */
134  template <typename T>
135  void Signal<T>::clear()
136  {
137  typename std::list< IFunctor<T>* >::iterator pos;
138  pos = functorPtrs_.begin();
139  while (pos != functorPtrs_.end())
140  {
141  delete *pos;
142  ++pos;
143  }
144  functorPtrs_.clear();
145  }
146 
147  /*
148  * Get number of registered observers.
149  */
150  template <typename T>
151  int Signal<T>::nObserver() const
152  { return functorPtrs_.size(); }
153 
154 
155  // -----------------------------------------------------------------
156  // Signal with no arguments.
157 
167  template <>
168  class Signal<void>
169  {
170 
171  public:
172 
176  Signal(){};
177 
181  ~Signal();
182 
189  template <class Observer>
190  void addObserver(Observer& observer, void (Observer::*methodPtr)());
191 
195  void clear();
196 
200  int nObserver() const;
201 
205  void notify();
206 
207  private:
208 
210  std::list<IFunctor<>*> functorPtrs_;
211 
213  Signal(const Signal<>& other);
214 
216  Signal<>& operator = (const Signal<>& other);
217 
218  };
219 
220  /*
221  * Register an observer (add to list).
222  */
223  template <class Observer> void
224  Signal<>::addObserver(Observer& observer, void (Observer::*methodPtr)())
225  { functorPtrs_.push_back(new MethodFunctor<Observer>(observer, methodPtr)); }
226 
227 }
228 #endif
int nObserver() const
Get number of registered observers.
Definition: Signal.cpp:51
~Signal()
Destructor.
Definition: Signal.cpp:16
Abstract class template for observer in the observer design pattern.
Definition: Notifier.h:19
void addObserver(Observer &observer, void(Observer::*methodPtr)(const T &))
Register an observer.
Definition: Signal.h:111
Signal()
Default constructor.
Definition: Signal.h:48
Functor that wraps a one-argument class member function.
Definition: MethodFunctor.h:26
void notify(const T &t)
Notify all observers.
Definition: Signal.cpp:22
Utility classes for scientific computation.
Definition: accumulators.mod:1
Signal()
Default constructor.
Definition: Signal.h:176
void clear()
Clear all observerse from list.
Definition: Signal.cpp:36
Notifier (or subject) in the Observer design pattern.
Definition: Signal.h:38