TVM  0.9.4
CallbackManager.h
Go to the documentation of this file.
1 
3 #pragma once
4 
6 
7 #include <algorithm>
8 #include <functional>
9 #include <vector>
10 
11 namespace tvm::internal
12 {
18 {
19 public:
20  using Callback = std::function<void()>;
21  using TCPair = std::pair<PairElementToken, Callback>;
22 
23  CallbackManager() = default;
24  CallbackManager(const CallbackManager &) = delete;
26 
27  virtual ~CallbackManager() = default;
28 
32  PairElementTokenHandle registerCallback(std::function<void()> c);
33 
35  void unregisterCallback(const PairElementToken & t);
36 
40  void run();
41 
42 private:
43  std::vector<TCPair> callbacks_;
44 };
45 
47 {
48  callbacks_.emplace_back(PairElementToken(), c);
49  return PairElementTokenHandle(callbacks_.back().first);
50 }
51 
53 {
54  auto it =
55  std::find_if(callbacks_.begin(), callbacks_.end(), [&](const TCPair & p) { return p.first.isPairedWith(t); });
56  if(it != callbacks_.end())
57  callbacks_.erase(it);
58  else
59  throw std::runtime_error("Element to unregister not found.");
60 }
61 
62 inline void CallbackManager::run()
63 {
64  for(size_t i = 0; i < callbacks_.size();)
65  {
66  if(callbacks_[i].first.isPaired())
67  {
68  std::invoke(callbacks_[i].second);
69  ++i;
70  }
71  else
72  {
73  callbacks_.erase(callbacks_.begin() + i);
74  }
75  }
76 }
77 
78 } // namespace tvm::internal
Definition: CallbackManager.h:18
virtual ~CallbackManager()=default
PairElementTokenHandle registerCallback(std::function< void()> c)
Definition: CallbackManager.h:46
CallbackManager & operator=(const CallbackManager &)=delete
CallbackManager(const CallbackManager &)=delete
std::function< void()> Callback
Definition: CallbackManager.h:20
std::pair< PairElementToken, Callback > TCPair
Definition: CallbackManager.h:21
void unregisterCallback(const PairElementToken &t)
Definition: CallbackManager.h:52
void run()
Definition: CallbackManager.h:62
Definition: PairElementToken.h:19
Definition: PairElementToken.h:45
Definition: CallbackManager.h:12