Go to the documentation of this file.00001
00007 #pragma once
00008
00009 #include "base.hpp"
00010
00015 class agls_API IMngBase
00016 {
00017 public:
00021 virtual ~IMngBase(void) { ; }
00022
00023 public:
00027 virtual bool CreateItem(IBase** ppBase) = 0;
00028
00032 virtual bool DestoryItem(IBase* pBase) = 0;
00033
00037 virtual bool DestoryAll(void) = 0;
00038
00039 virtual bool InsertItem(const agls_ID& riID, IBase* pBase) = 0;
00040
00044 virtual IBase* CheckID(const agls_ID& riID) = 0;
00045
00046 protected:
00047 inline bool SetID(IBase* pBase, const agls_ID& iID)
00048 {
00049 if (NULL == pBase)
00050 {
00051 return false;
00052 }
00053 return pBase->SetID(iID);
00054 }
00055 };
00056
00061 template<typename TN, typename TI>
00062 class agls_API TMngBase
00063 : public TN
00064 {
00065 typedef std::map<agls_ID, TI*> MapItemPtr;
00066
00067 public:
00071 TMngBase(void) { ; }
00072
00076 virtual ~TMngBase(void) { ; }
00077
00078 public:
00082 virtual bool CreateItem(IBase** ppBase)
00083 {
00084 if (NULL == ppBase ||
00085 NULL == *ppBase)
00086 {
00087 return false;
00088 }
00089 agls_ID iID = this->SearchIDForUse();
00090 if (!__super::SetID(*ppBase, iID))
00091 {
00092 return false;
00093 }
00094 return this->InsertItem(iID, *ppBase);
00095 }
00096
00100 virtual bool DestoryItem(IBase* pBase)
00101 {
00102 if (NULL == pBase)
00103 {
00104 return false;
00105 }
00106 agls_ID iID = AGLS_ID_INVALID;
00107 pBase->GetID(iID);
00108 MapItemPtr::iterator itFind = this->m_mItemPtr.find(iID);
00109 if (itFind == this->m_mItemPtr.end())
00110 {
00111 return false;
00112 }
00113 IBase* pBaseFind = itFind->second;
00114 this->m_mItemPtr.erase(itFind);
00115 this->EraseItem(pBaseFind);
00116 return true;
00117 }
00118
00122 virtual bool DestoryAll(void)
00123 {
00124 for (MapItemPtr::iterator it = this->m_mItemPtr.begin();
00125 it != this->m_mItemPtr.end(); ++it)
00126 {
00127 IBase* pBase = it->second;
00128 this->EraseItem(pBase);
00129 }
00130 this->m_mItemPtr.clear();
00131 return true;
00132 }
00133
00134 virtual bool InsertItem(const agls_ID& riID, IBase* pBase)
00135 {
00136 if (NULL == pBase)
00137 {
00138 return false;
00139 }
00140 TI* pTI = dynamic_cast<TI*>(pBase);
00141 if (NULL == pTI)
00142 {
00143 return false;
00144 }
00145 this->m_mItemPtr.insert(std::make_pair(riID, pTI));
00146 return true;
00147 }
00148
00152 virtual IBase* CheckID(const agls_ID& riID)
00153 {
00154 MapItemPtr::iterator itFind = this->m_mItemPtr.find(riID);
00155 if (itFind == this->m_mItemPtr.end())
00156 {
00157 return NULL;
00158 }
00159 return itFind->second;
00160 }
00161
00162 public:
00166 agls_ID SearchIDForUse(void)
00167 {
00168 agls_ID iID = AGLS_ID_INVALID;
00169 if (0 < this->m_mItemPtr.size())
00170 {
00171 MapItemPtr::iterator itLast = this->m_mItemPtr.end();
00172 --itLast;
00173 itLast->second->GetID(iID);
00174 }
00175 ++iID;
00176 return iID;
00177
00178
00179
00180
00181 }
00182
00186 void EraseItem(IBase* pBase)
00187 {
00188 if (NULL != pBase)
00189 {
00190 delete pBase;
00191 pBase = NULL;
00192 }
00193 }
00194
00195 private:
00199 MapItemPtr m_mItemPtr;
00200 };
00201
00206 class agls_API CMngBase
00207 : public TMngBase<IMngBase, CBase>
00208 {
00209 public:
00213 CMngBase(void);
00214
00218 virtual ~CMngBase(void);
00219 };