Main Page | Class Hierarchy | Class List | Directories | File List | Class Members

RegistryManager.h

00001 /* START_LICENSE_HEADER
00002 
00003 Copyright (C) 2000 Martin Piper, original design and program code
00004 Copyright (C) 2001-2005 Replica Software
00005 
00006 This program file is copyright (C) Replica Software and can only be used under license.
00007 For more information visit: http://www.replicanet.com/
00008 Or email: info@replicanet.com
00009 
00010 END_LICENSE_HEADER */
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 } // namespace RNReplicaNet
00133 
00134 #endif

Generated on Sun Oct 30 01:12:31 2005 for Platform by  doxygen 1.4.1