|
|
|
|
|
/**
|
|
|
|
|
|
* @file WMemoryFactory.h
|
|
|
|
|
|
* @brief ͨ<EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
* @author ɳĮ<EFBFBD><EFBFBD>ѻ
|
|
|
|
|
|
* @time 2009-12-25
|
|
|
|
|
|
*/
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
|
|
|
|
#include <memory>
|
|
|
|
|
|
#include <vector>
|
|
|
|
|
|
#include <list>
|
|
|
|
|
|
|
|
|
|
|
|
namespace wuya
|
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
|
|
#define WMF_MEMORYSIZE 2048
|
|
|
|
|
|
|
|
|
|
|
|
/** @brief <09><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> */
|
|
|
|
|
|
template<class T>
|
|
|
|
|
|
class AFX_EXT_CLASS WMemory
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
WMemory(void)
|
|
|
|
|
|
: m_stCount(0)
|
|
|
|
|
|
, m_stPos(-1)
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
~WMemory(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
T* New()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_stCount == WMF_MEMORYSIZE)
|
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
|
|
// <20>ӷ<EFBFBD><D3B7><EFBFBD><EFBFBD>ڴ<EFBFBD><DAB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
|
|
|
|
size_t stCount = m_listpDisuse.size();
|
|
|
|
|
|
if(stCount > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
++m_stCount;
|
|
|
|
|
|
|
|
|
|
|
|
T* pObj = m_listpDisuse.back();
|
|
|
|
|
|
m_listpDisuse.pop_back();
|
|
|
|
|
|
return pObj;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ч<EFBFBD>α<EFBFBD><CEB1>л<EFBFBD>ȡ
|
|
|
|
|
|
++m_stCount;
|
|
|
|
|
|
++m_stPos;
|
|
|
|
|
|
|
|
|
|
|
|
return m_arrayMemory + m_stPos;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
BOOL Delete(T* pVal)
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_stCount == 0)
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
|
|
if(pVal >= m_arrayMemory && pVal < (m_arrayMemory + WMF_MEMORYSIZE))
|
|
|
|
|
|
{
|
|
|
|
|
|
int iIndex = (int)(pVal-m_arrayMemory);
|
|
|
|
|
|
m_arrayMemory[iIndex] = T();
|
|
|
|
|
|
--m_stCount;
|
|
|
|
|
|
|
|
|
|
|
|
m_listpDisuse.push_back(pVal);
|
|
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
T m_arrayMemory[WMF_MEMORYSIZE]; ///< <20>ڴ<EFBFBD>
|
|
|
|
|
|
size_t m_stCount; ///< ʹ<>ø<EFBFBD><C3B8><EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
size_t m_stPos; ///< <20>α<EFBFBD>
|
|
|
|
|
|
|
|
|
|
|
|
std::list<T*> m_listpDisuse; ///< <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/** @brief <09>ڴ<EFBFBD><DAB4><EFBFBD> */
|
|
|
|
|
|
template<class T>
|
|
|
|
|
|
class AFX_EXT_CLASS WMemoryFactory
|
|
|
|
|
|
{
|
|
|
|
|
|
public:
|
|
|
|
|
|
~WMemoryFactory(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
Clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>ȡΨһָ<D2BB><D6B8>
|
|
|
|
|
|
static WMemoryFactory* GetInstance()
|
|
|
|
|
|
{
|
|
|
|
|
|
if(m_InstancePtr.get() == NULL)
|
|
|
|
|
|
{
|
|
|
|
|
|
m_InstancePtr.reset(new WMemoryFactory());
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
return m_InstancePtr.get();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><>̬<EFBFBD><CCAC><EFBFBD><EFBFBD>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
T* CreateObject()
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector<WMemory<T>*>::iterator itr = m_vecpMemory.begin();
|
|
|
|
|
|
for(; itr != m_vecpMemory.end(); ++itr)
|
|
|
|
|
|
{
|
|
|
|
|
|
T* pObject = (*itr)->New();
|
|
|
|
|
|
if(pObject != NULL)
|
|
|
|
|
|
return pObject;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
WMemory<T>* pObjectMemory = new WMemory<T>;
|
|
|
|
|
|
m_vecpMemory.push_back(pObjectMemory);
|
|
|
|
|
|
|
|
|
|
|
|
return pObjectMemory->New();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// ɾ<><C9BE>ָ<EFBFBD><D6B8>
|
|
|
|
|
|
void DeleteObject(T* pObject)
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector<WMemory<T>*>::iterator itr = m_vecpMemory.begin();
|
|
|
|
|
|
for(; itr != m_vecpMemory.end(); ++itr)
|
|
|
|
|
|
{
|
|
|
|
|
|
WMemory<T>* pMemory = (*itr);
|
|
|
|
|
|
if(pMemory != NULL && pMemory->Delete(pObject))
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// <20><><EFBFBD><EFBFBD><EFBFBD>ڴ<EFBFBD>
|
|
|
|
|
|
void Clear()
|
|
|
|
|
|
{
|
|
|
|
|
|
std::vector<WMemory<T>*>::iterator itr = m_vecpMemory.begin();
|
|
|
|
|
|
for(; itr != m_vecpMemory.end(); ++itr)
|
|
|
|
|
|
{
|
|
|
|
|
|
delete *itr;
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
m_vecpMemory.clear();
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
protected:
|
|
|
|
|
|
WMemoryFactory(void)
|
|
|
|
|
|
{
|
|
|
|
|
|
}
|
|
|
|
|
|
WMemoryFactory(const WMemoryFactory&);
|
|
|
|
|
|
WMemoryFactory& operator = (const WMemoryFactory&);
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
|
|
std::vector<WMemory<T>*> m_vecpMemory;
|
|
|
|
|
|
|
|
|
|
|
|
static std::auto_ptr<WMemoryFactory> m_InstancePtr; ///< Ψһʵ<D2BB><CAB5>
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
template<class T>
|
|
|
|
|
|
std::auto_ptr<WMemoryFactory<T>> WMemoryFactory<T>::m_InstancePtr;
|
|
|
|
|
|
|
|
|
|
|
|
/** @brief <09>ڴ<EFBFBD><DAB4><EFBFBD>ɾ<EFBFBD><C9BE><EFBFBD><EFBFBD> */
|
|
|
|
|
|
template<class T>
|
|
|
|
|
|
struct AFX_EXT_CLASS WMemoryDelete
|
|
|
|
|
|
{
|
|
|
|
|
|
void operator()(T* pObj)
|
|
|
|
|
|
{
|
|
|
|
|
|
WMemoryFactory<T>::GetInstance()->DeleteObject(pObj);
|
|
|
|
|
|
}
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
};
|