Caffe2 - C++ API
A deep learning, cross platform ML framework
Common.h
1 //== nomnigraph/Support/Common.h - Common class implementations --*- C++ -*-==//
2 //
3 // TODO Licensing.
4 //
5 //===----------------------------------------------------------------------===//
6 //
7 // This file defines basic classes that are useful to inherit from.
8 //
9 //===----------------------------------------------------------------------===//
10 
11 #ifndef NOM_SUPPORT_COMMON_H
12 #define NOM_SUPPORT_COMMON_H
13 
14 #include <functional>
15 #include <list>
16 
17 template <typename T> class StorageType {
18 public:
19  StorageType(T &&data) : Data(std::move(data)) {}
20  StorageType(const T &data) = delete;
21  StorageType() {}
22 
23  const T &data() const { return Data; }
24  T *mutableData() { return &Data; }
25  void resetData(T &&data) { Data = std::move(data); }
26 
27 private:
28  T Data;
29 };
30 
34 template <typename T> class Notifier {
35 public:
36  using Callback = std::function<void(T*)>;
37  Notifier() {}
38 
39  Callback* registerDestructorCallback(Callback fn) {
40  DtorCallbacks.emplace_back(fn);
41  return &DtorCallbacks.back();
42  }
43 
44  Callback* registerNotificationCallback(Callback fn) {
45  NotifCallbacks.emplace_back(fn);
46  return &NotifCallbacks.back();
47  }
48 
49  void deleteCallback(std::list<Callback>& callbackList, Callback* toDelete) {
50  for (auto i = callbackList.begin(); i != callbackList.end(); ++i) {
51  if (&*i == toDelete) {
52  callbackList.erase(i);
53  break;
54  }
55  }
56  }
57 
58  void deleteDestructorCallback(Callback* c) {
59  deleteCallback(DtorCallbacks, c);
60  }
61 
62  void deleteNotificationCallback(Callback* c) {
63  deleteCallback(NotifCallbacks, c);
64  }
65 
70  void notify() {
71  for (auto callback : NotifCallbacks) {
72  callback(reinterpret_cast<T*>(this));
73  }
74  }
75 
76  virtual ~Notifier() {
77  for (auto callback : DtorCallbacks) {
78  callback(reinterpret_cast<T*>(this));
79  }
80  }
81 
82 private:
83  std::list<Callback> DtorCallbacks;
84  std::list<Callback> NotifCallbacks;
85 };
86 
87 #endif /* NOM_SUPPORT_COMMON_H */
This class enables a listener pattern.
Definition: Common.h:34
void notify()
Notifies all listeners (registerNotificationCallback users) of an update.
Definition: Common.h:70