ReplicaNet and RNLobby  1
RegistryManagerList.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 __REGISTRYMANAGERLIST_H__
13 #define __REGISTRYMANAGERLIST_H__
14 
15 #include <assert.h>
16 
17 #include <list>
18 
19 namespace RNReplicaNet
20 {
21 
25 template <class T> class RegistryManagerList
26 {
27 public:
28  enum Direction
29  {
30  kForward=0,
31  kBackward,
32  kUndefined
33  };
34 
39  {
40  mDirection = kUndefined;
41  }
42 
47  {
48  }
49 
54  void AddItem(T *item)
55  {
56  mItems.push_back(item);
57  }
58 
63  void AddItemHead(T *item)
64  {
65  mItems.push_front(item);
66  }
67 
72  void RemoveItem(T *item)
73  {
74  typename std::list<T *>::iterator tst,ten;
75 
76  tst = mItems.begin();
77  ten = mItems.end();
78 
79  while(tst != ten)
80  {
81  T *titem = *tst;
82  if (titem == item)
83  {
84  if (mDirection != kUndefined)
85  {
86  if (tst == st)
87  {
88  if (mDirection == kForward)
89  {
90  st++;
91  mItems.erase(tst);
92  return;
93  }
94 
95  if (mDirection == kBackward)
96  {
97  st--;
98  mItems.erase(tst);
99  st++;
100  return;
101  }
102  }
103  }
104  mItems.erase(tst);
105  return;
106  }
107  tst++;
108  }
109  }
110 
114  void RemoveItem(void)
115  {
116  assert(mDirection != kUndefined && "RegistryManagerList::RemoveItem() used when BeginIterate() or EndIterate() not used or Iterate() reached the ned of the list");
117 
118  typename std::list<T *>::iterator tst;
119 
120  if (mDirection == kForward)
121  {
122  st--;
123  tst = st;
124  st++;
125  mItems.erase(tst);
126  return;
127  }
128 
129  if (mDirection == kBackward)
130  {
131  tst = st;
132  st++;
133  mItems.erase(tst);
134  }
135  }
136 
140  void BeginIterate(void)
141  {
142  mDirection = kForward;
143  st = mItems.begin();
144  }
145 
149  void EndIterate(void)
150  {
151  mDirection = kBackward;
152  st = mItems.end();
153  }
154 
159  T *Iterate(void)
160  {
161  assert(mDirection != kUndefined && "RegistryManagerList::Iterate() used when BeginIterate() or EndIterate() not used or Iterate() reached the end of the list");
162 
163  if (mDirection == kForward)
164  {
165  if (st != mItems.end())
166  {
167  T *tclass = *st;
168  st++;
169  return tclass;
170  }
171  }
172 
173  if (mDirection == kBackward)
174  {
175  if (st != mItems.begin())
176  {
177  st--;
178  T *tclass = *st;
179  return tclass;
180  }
181  }
182 
183 #ifdef _DEBUG
184  mDirection = kUndefined;
185 #endif
186  return 0;
187  }
188 
189  bool IsEmpty(void) const
190  {
191  return mItems.empty();
192  }
193 
194 private:
195 
196  std::list<T *> mItems;
197  typename std::list<T *>::iterator st;
198  Direction mDirection;
199 };
200 
201 } // namespace RNReplicaNet
202 
203 #endif
void RemoveItem(void)
Definition: RegistryManagerList.h:114
void AddItem(T *item)
Definition: RegistryManagerList.h:54
void RemoveItem(T *item)
Definition: RegistryManagerList.h:72
virtual ~RegistryManagerList()
Definition: RegistryManagerList.h:46
void AddItemHead(T *item)
Definition: RegistryManagerList.h:63
RegistryManagerList()
Definition: RegistryManagerList.h:38
void BeginIterate(void)
Definition: RegistryManagerList.h:140
Definition: RegistryManagerList.h:25
void EndIterate(void)
Definition: RegistryManagerList.h:149
T * Iterate(void)
Definition: RegistryManagerList.h:159