Caffe2 - C++ API
A deep learning, cross platform ML framework
observer.h
1 #pragma once
2 
3 #include <memory>
4 #include <unordered_set>
5 #include "caffe2/core/logging.h"
6 
7 namespace caffe2 {
8 
13 template <class T>
14 class ObserverBase {
15  public:
16  explicit ObserverBase(T* subject) : subject_(subject) {}
17 
18  virtual void Start() {}
19  virtual void Stop() {}
20 
21  virtual std::string debugInfo() {
22  return "Not implemented.";
23  }
24 
25  virtual ~ObserverBase() noexcept {};
26 
27  T* subject() const {
28  return subject_;
29  }
30 
31  protected:
32  T* subject_;
33 };
34 
38 template <class T>
39 class Observable {
40  public:
41  virtual ~Observable(){};
42  using Observer = ObserverBase<T>;
43 
44  /* Returns a reference to the observer after addition. */
45  const Observer* AttachObserver(std::unique_ptr<Observer> observer) {
46  CAFFE_ENFORCE(observer, "Couldn't attach a null observer.");
47  std::unordered_set<const Observer*> observers;
48  for (auto& ob : observers_list_) {
49  observers.insert(ob.get());
50  }
51 
52  const auto* observer_ptr = observer.get();
53  if (observers.count(observer_ptr)) {
54  return observer_ptr;
55  }
56  observers_list_.push_back(std::move(observer));
57 
58  return observer_ptr;
59  }
60 
65  std::unique_ptr<Observer> DetachObserver(const Observer* observer_ptr) {
66  for (auto it = observers_list_.begin(); it != observers_list_.end(); ++it) {
67  if (it->get() == observer_ptr) {
68  auto res = std::move(*it);
69  observers_list_.erase(it);
70  return res;
71  }
72  }
73  return nullptr;
74  }
75 
76  virtual size_t NumObservers() {
77  return observers_list_.size();
78  }
79 
80  void StartAllObservers() {
81  for (auto& observer : observers_list_) {
82  observer->Start();
83  }
84  }
85 
86  void StopAllObservers() {
87  for (auto& observer : observers_list_) {
88  observer->Stop();
89  }
90  }
91 
92  protected:
93  std::vector<std::unique_ptr<Observer>> observers_list_;
94 };
95 
96 } // namespace caffe2
Use this to implement a Observer using the Observer Pattern template.
Definition: observer.h:14
std::unique_ptr< Observer > DetachObserver(const Observer *observer_ptr)
Returns a unique_ptr to the removed observer.
Definition: observer.h:65
Inherit to make your class observable.
Definition: observer.h:39
A global dictionary that holds information about what Caffe2 modules have been loaded in the current ...