|
//代码名称: Handle存储数据模板
//类别: 内存管理
//关健字: 存储方法 内存 数据管理
//作者: EasySL
//编译器: VC
//操作系统: windows
#ifndef __ALLOCSTOREMANGER_H__
#define __ALLOCSTOREMANGER_H__
#include <vector>
class CASMHandle
{
public:
enum ConstData
{
Invalid_Handle = -1,
};
CASMHandle()
{
m_Handle = Invalid_Handle;
}
virtual ~CASMHandle()
{
}
bool Valid() const
{ return m_Handle != Invalid_Handle; }
int GetHandle() const
{ return m_Handle; }
void SetHandle( int Handle )
{ m_Handle = Handle; }
private:
int m_Handle;
};
template< class CT, const int MAXITEM >
class CASMHMANGER
{
public:
CASMHMANGER()
{
m_vecCT.clear();
m_NextHandle = 0;
m_HandleNumber = 0;
}
virtual ~CASMHMANGER()
{
for(int i=0;i<(int)m_vecCT.size();i++)
{
delete m_vecCT;
}
m_vecCT.clear();
}
CT* operator [] ( int i )
{
if( i < 0 )
return NULL;
if( i >= MAXITEM )
return NULL;
if( i >= (int)m_vecCT.size() )
return NULL;
if( !m_vecCT->Valid() )
return NULL;
return m_vecCT;
}
int Add( CT* o )
{
int oi = Find(o);
if( oi != CT::Invalid_Handle )
return oi;
if( o && (!IsFull()) )
{
int Handle = AllocHandle();
if( Handle == CT::Invalid_Handle )
return Handle;
o->SetHandle(Handle);
if( Handle < (int)m_vecCT.size() )
{
delete m_vecCT[Handle];
m_vecCT[Handle] = o;
}
else
{
m_vecCT.push_back(o);
}
m_HandleNumber++;
return o->GetHandle();
}
else
return CT::Invalid_Handle;
}
void Del( int i )
{
if( i < 0 )
return;
if( i >= MAXITEM )
return;
if( i >= (int)m_vecCT.size() )
return;
if( !m_vecCT->Valid() )
return;
m_vecCT->SetHandle( CT::Invalid_Handle );
m_HandleNumber--;
}
bool IsFull() const
{ return m_HandleNumber == MAXITEM; }
int Find( CT* o )
{
if( o == NULL )
return CT::Invalid_Handle;
for(int i=0;i<(int)m_vecCT.size();i++)
{
if( m_vecCT == o )
{
if( m_vecCT->Valid() )
return i;
}
}
return CT::Invalid_Handle;
}
private:
std::vector<CT*> m_vecCT;
int m_NextHandle;
int m_HandleNumber;
int AllocHandle()
{
int AllocHandle = CT::Invalid_Handle;
int count = 0;
while(true)
{
if( m_NextHandle < (int)m_vecCT.size() )
{
if( !m_vecCT[m_NextHandle]->Valid() )
{
AllocHandle = m_NextHandle;
break;
}
}
else
{
if( m_NextHandle < MAXITEM )
{
AllocHandle = m_NextHandle;
break;
}
}
m_NextHandle++;
if( m_NextHandle >= MAXITEM )
{
m_NextHandle = 0;
}
count++;
if(count >= MAXITEM)
return CT::Invalid_Handle;
}
return AllocHandle;
}
};
#endif // __ALLOCSTOREMANGER_H__
|
|