ReplicaNet and RNLobby  1
RegistryManagerSet.h
1 /* START_LICENSE_HEADER
2 
3 Copyright (C) 2000 Martin Piper, original design and program code
4 Copyright (C) 2001 Replica Software
5 
6 This program file is copyright (C) Replica Software and can only be used under license.
7 For more information visit: http://www.replicanet.com/
8 Or email: info@replicanet.com
9 
10 END_LICENSE_HEADER */
11 #include "RNPlatform/Inc/MemoryTracking.h"
12 #ifndef __REGISTRYMANAGERSET_H__
13 #define __REGISTRYMANAGERSET_H__
14 
15 #include <assert.h>
16 
17 #include <set>
18 
19 namespace RNReplicaNet
20 {
21 
25 template <class T,class C = std::less<T*> > class RegistryManagerSet
26 {
27 public:
28  enum Direction
29  {
30  kForward=0,
31  kBackward,
32  kUndefined
33  };
34 
39  {
40  mDirection = kUndefined;
41  mNumItems = 0;
42  }
43 
48  {
49  }
50 
55  void AddItem(T *item)
56  {
57  mItems.insert(item);
58  mNumItems++;
59  }
60 
65  void RemoveItem(T *item)
66  {
67  assert(mNumItems && "RegistryManagerSet::RemoveItem(T *item) called when there were no items");
68  typename std::set<T *,C>::iterator found = mItems.find(item);
69 
70  if (found != mItems.end())
71  {
72  mNumItems--;
73  if (mDirection != kUndefined)
74  {
75  if (found == st)
76  {
77  if (mDirection == kForward)
78  {
79  st++;
80  mItems.erase(found);
81  return;
82  }
83 
84  if (mDirection == kBackward)
85  {
86  st--;
87  mItems.erase(found);
88  st++;
89  return;
90  }
91  }
92  }
93  mItems.erase(found);
94  return;
95  }
96  }
97 
101  void RemoveItem(void)
102  {
103  assert(mDirection != kUndefined && "RegistryManagerSet::RemoveItem() used when BeginIterate() or EndIterate() not used or Iterate() reached the end of the list");
104  assert(mNumItems && "RegistryManagerSet::RemoveItem() called when there were no items");
105 
106  typename std::set<T *,C>::iterator tst;
107 
108  if (mDirection == kForward)
109  {
110  st--;
111  tst = st;
112  st++;
113  mNumItems--;
114  mItems.erase(tst);
115  return;
116  }
117 
118  if (mDirection == kBackward)
119  {
120  tst = st;
121  st++;
122  mNumItems--;
123  mItems.erase(tst);
124  }
125  }
126 
130  void BeginIterate(void)
131  {
132  mDirection = kForward;
133  st = mItems.begin();
134  }
135 
139  void EndIterate(void)
140  {
141  mDirection = kBackward;
142  st = mItems.end();
143  }
144 
149  T *Iterate(void)
150  {
151  assert(mDirection != kUndefined && "RegistryManagerSet::Iterate() used when BeginIterate() or EndIterate() not used or Iterate() reached the ned of the list");
152 
153  if (mDirection == kForward)
154  {
155  if (st != mItems.end())
156  {
157  T *tclass = *st;
158  st++;
159  return tclass;
160  }
161  }
162 
163  if (mDirection == kBackward)
164  {
165  if (st != mItems.begin())
166  {
167  st--;
168  T *tclass = *st;
169  return tclass;
170  }
171  }
172 
173 #ifdef _DEBUG
174  mDirection = kUndefined;
175 #endif
176  return 0;
177  }
178 
179  bool IsEmpty(void) const
180  {
181  return mItems.empty();
182  }
183 
184  size_t GetNumItems(void) const
185  {
186  return mNumItems;
187  }
188 
189 private:
190 
191  std::set<T *,C> mItems;
192  typename std::set<T *,C>::iterator st;
193  Direction mDirection;
194  size_t mNumItems;
195 };
196 
197 } // namespace RNReplicaNet
198 
199 #endif
void BeginIterate(void)
Definition: RegistryManagerSet.h:130
virtual ~RegistryManagerSet()
Definition: RegistryManagerSet.h:47
void RemoveItem(void)
Definition: RegistryManagerSet.h:101
void RemoveItem(T *item)
Definition: RegistryManagerSet.h:65
T * Iterate(void)
Definition: RegistryManagerSet.h:149
void AddItem(T *item)
Definition: RegistryManagerSet.h:55
RegistryManagerSet()
Definition: RegistryManagerSet.h:38
void EndIterate(void)
Definition: RegistryManagerSet.h:139
Definition: RegistryManagerSet.h:25