/********************************************************************
* 文件名: Server.h
* 文件描述: 网络游戏模拟
* 创建人: 陈泽丹 ,2012年11月16日
* 版本号: 1.0
* 修改记录:
********************************************************************/
#pragma once
#include <map>
#include <vector>
using namespace std;
//生物工厂
template< class _ID_TYPE >
class Unit_Factory
{
public:
Unit_Factory(){ m_delete_sign.out_for(); }
virtual ~Unit_Factory(){ delete_accessorys(); }
//订阅
template<class _T>
bool push_single(_ID_TYPE _uid, _T* _p_obj)
{
MAP_TYPE::iterator it = m_delete_objs.find(_uid);
if( m_delete_objs.end() == it )
{
m_delete_objs[_uid] = new Die_Single<_T>(_p_obj);
return true;
}
return false;
}
//订阅
template<class _T>
bool push_array(_ID_TYPE _uid, _T* _p_obj)
{
MAP_TYPE::iterator it = m_delete_objs.find(_uid);
if( m_delete_objs.end() == it )
{
m_delete_objs[_uid] = new Die_Array<_T>(_p_obj);
return true;
}
return false;
}
//取得生物指针
void* get_unit(_ID_TYPE _uid)
{
MAP_TYPE::iterator it = m_delete_objs.find(_uid);
if( m_delete_objs.end() != it )
{
void* p_ret = NULL;
it->second->get_accessory(p_ret);
return p_ret;
}
return NULL;
}
//取消
void pop(_ID_TYPE _uid)
{
MAP_TYPE::iterator it = m_delete_objs.find(_uid);
if( m_delete_objs.end() != it )
{
if( m_delete_sign.is_for() && it == m_nonius )
{
delete it->second;
m_nonius = m_delete_objs.erase(it);
m_delete_sign.delete_in_for();
}
else
{
delete it->second;
m_delete_objs.erase(it);
}
}
}
private:
//删除相关附件
void delete_accessorys()
{
//回调
for(m_nonius = m_delete_objs.begin(); m_delete_objs.end() != m_nonius; )
{
m_delete_sign.in_for();
MAP_TYPE::iterator cur = m_nonius;
cur->second->delete_accessory();
if( m_delete_sign.no_deletion() )
m_nonius++;
m_delete_sign.out_for();
}
//清空
for(m_nonius = m_delete_objs.begin(); m_delete_objs.end() != m_nonius; )
{
m_delete_sign.in_for();
MAP_TYPE::iterator cur = m_nonius;
pop(cur->first);
if( m_delete_sign.no_deletion() )
m_nonius++;
m_delete_sign.out_for();
}
m_delete_objs.clear();
}
class Delete_Sign
{
public:
inline void in_for(){ operator_state = 1; }
inline void out_for(){ operator_state = 0; }
inline void delete_in_for(){ operator_state = 2;}
inline bool is_for(){ return (operator_state >= 1)? true : false; }
inline bool no_deletion(){ return (2 == operator_state)? false : true; }
private:
byte operator_state;
};
//代理项
struct IDeleteSink
{
virtual ~IDeleteSink(){}
virtual void get_accessory(void *&_p) = 0;
virtual void delete_accessory() = 0;
};
//绑定附件
template<class _T>
struct Die_Single:public IDeleteSink
{
Die_Single(_T* _p):m_p(_p){}
void get_accessory(void *&_p){ _p = m_p; }
void delete_accessory(){ delete m_p; }
_T* m_p;
};
//绑定附件
template<class _T>
struct Die_Array:public IDeleteSink
{
Die_Array(_T* _p):m_p(_p){}
void get_accessory(void *&_p){ _p = m_p; }
void delete_accessory(){ delete[] m_p; }
_T* m_p;
};
//记录
typedef map< _ID_TYPE, IDeleteSink* > MAP_TYPE;
MAP_TYPE m_delete_objs;
typename MAP_TYPE::iterator m_nonius;
Delete_Sign m_delete_sign;
};
//删除代理
class Delete_Proxy: public Unit_Factory< void* >
{
public:
//订阅
template<class _T>
bool push_single(_T* _p_obj)
{
return Unit_Factory< void* >::push_single( _p_obj, _p_obj );
}
//订阅
template<class _T>
bool push_array(_T* _p_obj)
{
return Unit_Factory< void* >::push_array( _p_obj, _p_obj );
}
};