生物管理器

/********************************************************************
*  文件名:   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 );
	}
};


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值