ReplicaNet and RNLobby  1
RegistryManager.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 __REGISTRYMANAGER_H__
13 #define __REGISTRYMANAGER_H__
14 
15 #include <assert.h>
16 
17 #include <vector>
18 
19 namespace RNReplicaNet
20 {
21 
25 template <class T> class RegistryManager
26 {
27 public:
32  {
33  mUsed = false;
34  }
35 
39  virtual ~RegistryManager()
40  {
41  }
42 
47  void AddItem(T *item)
48  {
49  mItems.push_back(item);
50  }
51 
56  void RemoveItem(T *item)
57  {
58  typename std::vector<T *>::iterator tst,ten;
59 
60  tst = mItems.begin();
61  ten = mItems.end();
62 
63  while(tst != ten)
64  {
65  T *titem = *tst;
66  if (titem == item)
67  {
68  int offset = 0;
69  if (mUsed)
70  {
71  offset = st - mItems.begin();
72  if (tst < st)
73  {
74  offset--;
75  }
76  }
77  mItems.erase(tst);
78  if (mUsed)
79  {
80  st = mItems.begin() + offset;
81  }
82  return;
83  }
84  tst++;
85  }
86  }
87 
91  void RemoveItem(void)
92  {
93 #ifdef _DEBUG
94  assert(mUsed != false && "RegistryManager::RemoveItem() used when BeginIterate() not used or Iterate() reached the end of the list");
95 #endif
96 
97  int offset = st - mItems.begin();
98  mItems.erase(st);
99  st = mItems.begin() + offset;
100  }
101 
105  void BeginIterate(void)
106  {
107  mUsed = true;
108  st = mItems.begin();
109  }
110 
115  T *Iterate(void)
116  {
117 #ifdef _DEBUG
118  assert(mUsed != false && "RegistryManager::Iterate() used when BeginIterate() not used or Iterate() reached the end of the list");
119 #endif
120 
121  if (st != mItems.end())
122  {
123  T *tclass = *st;
124  st++;
125  return tclass;
126  }
127 
128  mUsed = false;
129  return 0;
130  }
131 
132  bool IsEmpty(void) const
133  {
134  return mItems.empty();
135  }
136 
137 private:
138  std::vector<T *> mItems;
140  typename std::vector<T *>::iterator st,en;
142  bool mUsed; // Extra STL iterator checking
143 };
144 
145 } // namespace RNReplicaNet
146 
147 #endif
virtual ~RegistryManager()
Definition: RegistryManager.h:39
void RemoveItem(void)
Definition: RegistryManager.h:91
void AddItem(T *item)
Definition: RegistryManager.h:47
void BeginIterate(void)
Definition: RegistryManager.h:105
void RemoveItem(T *item)
Definition: RegistryManager.h:56
RegistryManager()
Definition: RegistryManager.h:31
T * Iterate(void)
Definition: RegistryManager.h:115
Definition: RegistryManager.h:25