OpenRTM-aist  1.2.1
ListenerHolder.h
Go to the documentation of this file.
1 // -*- C++ -*-
19 #ifndef RTM_UTIL_LISTENERHOLDER_H
20 #define RTM_UTIL_LISTENERHOLDER_H
21 
22 #include <vector>
23 #include <utility>
24 #include <coil/Mutex.h>
25 #include <coil/Guard.h>
26 #include <coil/NonCopyable.h>
27 
28 namespace RTM
29 {
30 namespace util
31 {
143  template <typename ListenerClass>
145  : public coil::NonCopyable
146  {
147  public:
149  typedef std::pair<ListenerClass*, bool> Entry;
150  typedef std::vector<Entry> EntryList;
151  typedef typename EntryList::iterator EntryIterator;
152 
161  {
162  }
163 
171  virtual ~ListenerHolder()
172  {
173  Guard guard(m_mutex);
174  EntryIterator it(m_listeners.begin());
175 
176  for (; it != m_listeners.end(); ++it)
177  {
178  if ((*it).second)
179  {
180  delete (*it).first;
181  }
182  m_listeners.erase(it);
183  }
184  }
185 
193  virtual void addListener(ListenerClass* listener,
194  bool autoclean)
195  {
196  Guard guard(m_mutex);
197  m_listeners.push_back(Entry(listener, autoclean));
198  }
199 
207  virtual void removeListener(ListenerClass* listener)
208  {
209  Guard guard(m_mutex);
210  EntryIterator it(m_listeners.begin());
211 
212  for (; it != m_listeners.end(); ++it)
213  {
214  if ((*it).first == listener)
215  {
216  if ((*it).second)
217  {
218  delete (*it).first;
219  }
220  m_listeners.erase(it);
221  return;
222  }
223  }
224  }
225 
226  protected:
235 
243  EntryList m_listeners;
244  };
245 }; // util
246 }; // RTM
247 
248 #define LISTENERHOLDER_CALLBACK(func, args) \
249  { \
250  Guard guard(m_mutex); \
251  for (int i(0), len(m_listeners.size()); i < len; ++i) \
252  { \
253  m_listeners[i].first->func args; \
254  } \
255  }
256 
257 #endif // RTM_UITL_LISTENERHOLDER_H
ListenerHolder()
ListenerHolder class ctor.
Definition: ListenerHolder.h:160
virtual void addListener(ListenerClass *listener, bool autoclean)
add listener object
Definition: ListenerHolder.h:193
Non Copyable mixin class.
Mutex class.
Definition: Mutex.h:40
coil::Mutex m_mutex
Mutex.
Definition: ListenerHolder.h:234
std::vector< Entry > EntryList
Definition: ListenerHolder.h:150
std::pair< ListenerClass *, bool > Entry
Definition: ListenerHolder.h:149
EntryList::iterator EntryIterator
Definition: ListenerHolder.h:151
Guard template class.
virtual ~ListenerHolder()
ListenerHolder class dtor.
Definition: ListenerHolder.h:171
coil::Guard< coil::Mutex > Guard
Definition: ListenerHolder.h:148
virtual void removeListener(ListenerClass *listener)
remove listener object
Definition: ListenerHolder.h:207
Non-copyable Mixin.
Definition: NonCopyable.h:53
EntryList m_listeners
List of listener object.
Definition: ListenerHolder.h:243
RT-Middleware.
Definition: ListenerHolder.h:28
Definition: ListenerHolder.h:144