PSCF v1.1
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
16namespace 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
177
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
Functor that wraps a one-argument class member function.
Definition: MethodFunctor.h:27
Abstract class template for observer in the observer design pattern.
Definition: Observer.h:25
void addObserver(Observer &observer, void(Observer::*methodPtr)())
Register an observer.
void clear()
Clear all observerse from list.
void notify()
Notify all observers.
Signal()
Default constructor.
Definition: Signal.h:176
~Signal()
Destructor.
int nObserver() const
Get number of registered observers.
Notifier (or subject) in the Observer design pattern.
Definition: Signal.h:39
~Signal()
Destructor.
Definition: Signal.cpp:16
void addObserver(Observer &observer, void(Observer::*methodPtr)(const T &))
Register an observer.
Definition: Signal.h:111
Signal()
Default constructor.
Definition: Signal.h:48
void clear()
Clear all observerse from list.
Definition: Signal.cpp:36
int nObserver() const
Get number of registered observers.
Definition: Signal.cpp:51
void notify(const T &t)
Notify all observers.
Definition: Signal.cpp:22
Utility classes for scientific computation.
Definition: accumulators.mod:1