生物管理器

来源:互联网 发布:电脑打不开淘宝网页 编辑:程序博客网 时间:2024/05/17 02:05
/*********************************************************************  文件名:   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_TYPEm_delete_objs;typename MAP_TYPE::iteratorm_nonius;Delete_Signm_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 );}};


 

原创粉丝点击