00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #ifndef __REGISTRYMANAGER_H__
00012 #define __REGISTRYMANAGER_H__
00013 #include "RNPlatform/Inc/DLLExportAPI.h"
00014
00015 #include <assert.h>
00016
00017 #include <vector>
00018
00019 namespace RNReplicaNet
00020 {
00021
00025 template <class T> class RegistryManager
00026 {
00027 public:
00031 RegistryManager()
00032 {
00033 mUsed = false;
00034 }
00035
00039 virtual ~RegistryManager()
00040 {
00041 }
00042
00047 void AddItem(T *item)
00048 {
00049 mItems.push_back(item);
00050 }
00051
00056 void RemoveItem(T *item)
00057 {
00058 std::vector<T *>::iterator tst,ten;
00059
00060 tst = mItems.begin();
00061 ten = mItems.end();
00062
00063 while(tst != ten)
00064 {
00065 T *titem = (T *) *tst;
00066 if (titem == item)
00067 {
00068 if (mUsed)
00069 {
00070 if (tst < st)
00071 {
00072 st--;
00073 }
00074 }
00075 mItems.erase(tst);
00076 return;
00077 }
00078 tst++;
00079 }
00080 }
00081
00085 void RemoveItem(void)
00086 {
00087 assert(mUsed != false && "RegistryManager::RemoveItem() used when BeginIterate() not used or Iterate() reached the end of the list");
00088
00089 std::vector<T *>::iterator tst;
00090
00091 st--;
00092 tst = st;
00093 st++;
00094
00095 mItems.erase(tst);
00096 }
00097
00101 void BeginIterate(void)
00102 {
00103 mUsed = true;
00104 st = mItems.begin();
00105 }
00106
00111 T *Iterate(void)
00112 {
00113 assert(mUsed != false && "RegistryManager::Iterate() used when BeginIterate() not used or Iterate() reached the end of the list");
00114
00115 if (st < mItems.end())
00116 {
00117 T *tclass = *st++;
00118 return tclass;
00119 }
00120
00121 mUsed = false;
00122 return 0;
00123 }
00124
00125 private:
00126 std::vector<T *> mItems;
00128 typename std::vector<T *>::iterator st,en;
00129 bool mUsed;
00130 };
00131
00132 }
00133
00134 #endif