OpenRTM-aist  2.1.0
ListenerHolder.h
[詳解]
1 // -*- C++ -*-
19 #ifndef RTM_UTIL_LISTENERHOLDER_H
20 #define RTM_UTIL_LISTENERHOLDER_H
21 
22 #include <mutex>
23 
24 #include <vector>
25 #include <utility>
26 
27 namespace RTM
28 {
29 namespace util
30 {
142  template <typename ListenerClass>
144  {
145  public:
146  using Entry = std::pair<ListenerClass*, bool>;
147  using EntryList = std::vector<Entry>;
148  using EntryIterator = typename EntryList::iterator;
149  ListenerHolder(ListenerHolder const&) = delete;
151 
159  ListenerHolder() = default;
160 
168  virtual ~ListenerHolder()
169  {
170  std::lock_guard<std::mutex> guard(m_mutex);
171 
172  for(auto & listener : m_listeners)
173  {
174  if (listener.second)
175  {
176  delete listener.first;
177  }
178  }
179  m_listeners.clear();
180  }
181 
189  virtual void addListener(ListenerClass* listener,
190  bool autoclean)
191  {
192  std::lock_guard<std::mutex> guard(m_mutex);
193  m_listeners.emplace_back(listener, autoclean);
194  }
195 
203  virtual void removeListener(ListenerClass* listener)
204  {
205  std::lock_guard<std::mutex> guard(m_mutex);
206  EntryIterator it(m_listeners.begin());
207 
208  for (; it != m_listeners.end(); ++it)
209  {
210  if ((*it).first == listener)
211  {
212  if ((*it).second)
213  {
214  delete (*it).first;
215  }
216  m_listeners.erase(it);
217  return;
218  }
219  }
220  }
221 
222  protected:
230  std::mutex m_mutex;
231 
240  };
241 } // namespace util
242 } // namespace RTM
243 
244 #define LISTENERHOLDER_CALLBACK(func, args) \
245  do { \
246  std::lock_guard<std::mutex> guard(m_mutex); \
247  for (auto&& listener : m_listeners) \
248  { \
249  listener.first->func args; \
250  } \
251  } while(0)
252 
253 #endif // RTM_UITL_LISTENERHOLDER_H
Definition: ListenerHolder.h:144
std::vector< Entry > EntryList
Definition: ListenerHolder.h:147
virtual void removeListener(ListenerClass *listener)
リスナを削除する
Definition: ListenerHolder.h:203
virtual void addListener(ListenerClass *listener, bool autoclean)
リスナを追加する
Definition: ListenerHolder.h:189
ListenerHolder & operator=(ListenerHolder const &)=delete
ListenerHolder(ListenerHolder const &)=delete
EntryList m_listeners
リスナのリスト
Definition: ListenerHolder.h:239
virtual ~ListenerHolder()
ListenerHolderデストラクタ
Definition: ListenerHolder.h:168
ListenerHolder()=default
ListenerHolderクラスコンストラクタ
typename EntryList::iterator EntryIterator
Definition: ListenerHolder.h:148
std::pair< ListenerClass *, bool > Entry
Definition: ListenerHolder.h:146
std::mutex m_mutex
Mutex
Definition: ListenerHolder.h:230
RT-Middleware
Definition: FactoryInit.h:22