MAK Legion 1.1 API Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
callbackList.h
Go to the documentation of this file.
1 /*********************************************************************************
2 ** Copyright (c) 2021 MAK Technologies, Inc.
3 ** All rights reserved.
4 *********************************************************************************/
5 
8 
9 #pragma once
10 
11 #include <list>
12 #include <algorithm>
13 
14 namespace Legion
15 {
17  template<typename Cb, typename... Param>
19  {
20  public:
22  :myEntryLevel(0)
23  {
24 
25  }
26 
28  {
29 
30  }
31 
37  bool add(Cb cb)
38  {
39  if (myEntryLevel > 0)
40  {
41  myToAddCallbacks.push_back(cb);
42  return true;
43  }
44  else
45  {
46  //protect against double add
47  typename std::list<Cb>::iterator iter = std::find(myCallbacks.begin(), myCallbacks.end(), cb);
48  if (iter == myCallbacks.end())
49  {
50  myCallbacks.push_back(cb);
51  }
52  else
53  {
54  return false;
55  }
56 
57  return true;
58  }
59  }
60 
65  bool remove(Cb cb)
66  {
67  if (myEntryLevel > 0)
68  {
69  myToRemoveCallbacks.push_back(cb);
70  }
71  else
72  {
73  myCallbacks.remove(cb);
74  }
75 
76  return true;
77  }
78 
80  void execute(Param... params)
81  {
82  myEntryLevel++;
83  typename std::list<Cb>::iterator iter = myCallbacks.begin();
84  for (iter; iter != myCallbacks.end(); ++iter)
85  {
86  (*iter)(params...);
87  }
88  myEntryLevel--;
89 
90  //if we are truly done, stop executing, and clear any deferred lists
91  if (myEntryLevel == 0)
92  {
93  //if callbacks were added during execution, add them
94  iter = myToAddCallbacks.begin();
95  for (iter; iter != myToAddCallbacks.end(); ++iter)
96  {
97  add(*iter);
98  }
99  myToAddCallbacks.clear();
100 
101  //if callbacks were removed during execution, remove them
102  iter = myToRemoveCallbacks.begin();
103  for (iter; iter != myToRemoveCallbacks.end(); ++iter)
104  {
105  remove(*iter);
106  }
107  myToRemoveCallbacks.clear();
108  }
109  }
110 
111  protected:
112  std::list<Cb> myCallbacks;
113  std::list<Cb> myToAddCallbacks;
114  std::list<Cb> myToRemoveCallbacks;
116  };
117 
118 }
std::list< Cb > myToAddCallbacks
Definition: callbackList.h:113
std::list< Cb > myCallbacks
Definition: callbackList.h:112
void execute(Param...params)
Execute all the callbacks on the internal list of callbacks.
Definition: callbackList.h:80
~CallbackList()
Definition: callbackList.h:27
bool add(Cb cb)
add a callback to the internal list.
Definition: callbackList.h:37
CallbackList()
Definition: callbackList.h:21
int myEntryLevel
Definition: callbackList.h:115
The Callback list holds a list of Callback objects and manages adding/removing them from the list...
Definition: callbackList.h:18
std::list< Cb > myToRemoveCallbacks
Definition: callbackList.h:114

Document ID: Generated on Wed May 26 15:17:05 EDT 2021 from SVN revision 229676
Copyright © 2005-2021 MAK Technologies. All Rights Reserved (www.mak.com)