ジャーナルウェア

46761 ワード

/********************************************************************
*     :   Server.h
*      :       
*     :       ,2012 9 6      
*     :   1.0
*      :
********************************************************************/


#pragma once

#include <iostream>
#include <vector>
#include <map>
#include <algorithm>



//--  :        ,         
using namespace std;



namespace Evt_Server_Space
{
	//  
	class Msg_Head
	{
	public:
		Msg_Head(void* _sub_buf, const long _sub_id = 1):m_data(_sub_buf, _sub_id){};
		virtual ~Msg_Head(){}
		template<class _TYPE>
		void get_sub_buf(_TYPE*& _p_buf, const long _sub_id = 1)
		{
			_p_buf =  (m_data.second == _sub_id)? (_TYPE*)m_data.first : NULL;
		}
		
	private:
		pair<void*, const long> m_data;
	};

	//           
	template< class _TMsg = Msg_Head >
	struct IPass_Event_Listener
	{ 
		virtual ~IPass_Event_Listener<_TMsg>(){};
		typedef _TMsg Msg;
		virtual bool on_pass(Msg *_p_msg) = 0; 
	};

	//           
	template< class _TMsg = Msg_Head >
	struct IVote_Event_Listener
	{ 
		virtual ~IVote_Event_Listener<_TMsg>(){};
		typedef _TMsg Msg;
		virtual bool on_vote(Msg *_p_msg) = 0; 
	};

	//           
	template< class _TMsg = Msg_Head >
	struct IAction_Event_Listener
	{ 
		virtual ~IAction_Event_Listener<_TMsg>(){};
		typedef _TMsg Msg;
		virtual void on_action(Msg *_p_msg) = 0; 
	};

	//           
	template< class _TMsg = Msg_Head >
	struct IResponse_Event_Listener
	{ 
		virtual ~IResponse_Event_Listener<_TMsg>(){};
		typedef _TMsg Msg;
		virtual void on_response(Msg *_p_msg) = 0; 
	};

	//       --     ,    
	template< class _TEvt = long, class _TMsg = Msg_Head>
	class IEvt_Server
	{
	public:
		virtual ~IEvt_Server(){};
		typedef IPass_Event_Listener< _TMsg >				PASS_LISTENER_TYPE;
		typedef IVote_Event_Listener< _TMsg >				VOTE_LISTENER_TYPE;
		typedef IAction_Event_Listener< _TMsg >				ACTION_LISTENER_TYPE;
		typedef IResponse_Event_Listener< _TMsg >			RESPONSE_LISTENER_TYPE;
		//         
		virtual bool add_listener(const _TEvt _event,		PASS_LISTENER_TYPE* _p_listener)		= 0;
		virtual void remove_listener(const _TEvt _event,	PASS_LISTENER_TYPE* _p_listener)		= 0;
		virtual bool add_listener(const _TEvt _event,		VOTE_LISTENER_TYPE* _p_listener)		= 0;
		virtual void remove_listener(const _TEvt _event,	VOTE_LISTENER_TYPE* _p_listener)		= 0;
		virtual bool add_listener(const _TEvt _event,		ACTION_LISTENER_TYPE* _p_listener)		= 0;
		virtual void remove_listener(const _TEvt _event,	ACTION_LISTENER_TYPE* _p_listener)		= 0;
		virtual bool add_listener(const _TEvt _event,		RESPONSE_LISTENER_TYPE* _p_listener)	= 0;
		virtual void remove_listener(const _TEvt _event,	RESPONSE_LISTENER_TYPE* _p_listener)	= 0;
		//         
		virtual void dispatch_pass_msg(const _TEvt _event, _TMsg *_p_msg) 							= 0;
		virtual void dispatch_vote_msg(const _TEvt _event, _TMsg *_p_msg) 							= 0;
	};

	template< class _TEvt = long, class _TMsg = Msg_Head >
	class Evt_Server: public IEvt_Server< _TEvt, _TMsg >
	{
	public:
		virtual bool add_listener(const _TEvt _event, PASS_LISTENER_TYPE* _p_listener){ return m_pass_server.add_listener(_event, _p_listener); }
		virtual void remove_listener(const _TEvt _event, PASS_LISTENER_TYPE* _p_listener){  m_pass_server.remove_listener(_event, _p_listener); }
		virtual bool add_listener(const _TEvt _event, VOTE_LISTENER_TYPE* _p_listener){ return m_vote_server.add_listener(_event, _p_listener); }
		virtual void remove_listener(const _TEvt _event, VOTE_LISTENER_TYPE* _p_listener){  m_vote_server.remove_listener(_event, _p_listener); }
		virtual bool add_listener(const _TEvt _event, ACTION_LISTENER_TYPE* _p_listener){ return m_action_server.add_listener(_event, _p_listener); }
		virtual void remove_listener(const _TEvt _event, ACTION_LISTENER_TYPE* _p_listener){  m_action_server.remove_listener(_event, _p_listener); }
		virtual bool add_listener(const _TEvt _event, RESPONSE_LISTENER_TYPE* _p_listener){ return m_response_server.add_listener(_event, _p_listener); }
		virtual void remove_listener(const _TEvt _event, RESPONSE_LISTENER_TYPE* _p_listener){  m_response_server.remove_listener(_event, _p_listener); }
		virtual void dispatch_pass_msg(const _TEvt _event, _TMsg *_p_msg)
		{
			if( m_pass_server.dispatch_msg( _event, _p_msg ) )
			{
				m_action_server.dispatch_msg( _event, _p_msg );
				m_response_server.dispatch_msg( _event, _p_msg );
			}
		}
		virtual void dispatch_vote_msg(const _TEvt _event, _TMsg *_p_msg) 
		{
			if( m_vote_server.dispatch_msg( _event, _p_msg ) )
			{
				m_action_server.dispatch_msg( _event, _p_msg );
				m_response_server.dispatch_msg( _event, _p_msg );
			}
		}

	protected:
		//  
		template< typename _LISTENER_TYPE >
		class Server
		{
		public:
			typedef vector< _LISTENER_TYPE* >							VCT_TYPE;
			typedef map<_TEvt, VCT_TYPE >								MAP_TYPE;
			Server(){ m_delete_sign.out_for(); }
			//  
			bool add_listener(const _TEvt _event, _LISTENER_TYPE* _p_listener) 
			{
				VCT_TYPE& vct = m_evt_listener_table[_event];
				VCT_TYPE::iterator it = find( vct.begin(), vct.end(), _p_listener );
				if( vct.end() == it)
				{
					vct.push_back(_p_listener);
					return true;
				}
				return false;
			}

			//  
			void remove_listener(const _TEvt _event, _LISTENER_TYPE* _p_listener) 
			{
				VCT_TYPE& vct = m_evt_listener_table[_event];
				VCT_TYPE::iterator it = find( vct.begin(), vct.end(), _p_listener );
				if( vct.end() != it)
				{
					if( m_delete_sign.is_for() && it == m_nonius )
					{
						m_nonius = vct.erase(it);
						m_delete_sign.delete_in_for();
					}
					else vct.erase(it);
				}
				
			}

			//    
			virtual bool dispatch_msg(const _TEvt _event, _TMsg *_p_msg)	= 0;

		protected:
			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;
			};
			Delete_Sign												m_delete_sign;
			MAP_TYPE												m_evt_listener_table;
			typename	VCT_TYPE::iterator							m_nonius;									;
		};
		//  
		class Pass_Server: public Server< PASS_LISTENER_TYPE >
		{
		public:
			//    
			bool dispatch_msg(const _TEvt _event, _TMsg *_p_msg) 
			{
				bool failed = true;
				MAP_TYPE::iterator pass_it = m_evt_listener_table.find( _event );
				if( m_evt_listener_table.end() != pass_it)
				{
					VCT_TYPE& vct = pass_it->second;
					for( m_nonius = vct.begin(); vct.end() != m_nonius;)
					{
						m_delete_sign.in_for();
						VCT_TYPE::const_iterator it = m_nonius;
						if( (*it)->on_pass(_p_msg) )
						{
							//     
							failed = true;
							break;
						}
						if( m_delete_sign.no_deletion() )
							m_nonius++;
					}
				}
				m_delete_sign.out_for();
				if( failed ) return false;
				else return true;
			}
		};
		//  
		class Vote_Server: public Server< VOTE_LISTENER_TYPE >
		{
		public:
			//    
			bool dispatch_msg(const _TEvt _event, _TMsg *_p_msg) 
			{
				bool ret = true;
				MAP_TYPE::iterator vote_it = m_evt_listener_table.find( _event );
				if( m_evt_listener_table.end() != vote_it)
				{
					VCT_TYPE& vct = vote_it->second;
					for( m_nonius = vct.begin(); vct.end() != m_nonius;)
					{
						m_delete_sign.in_for();
						VCT_TYPE::const_iterator it = m_nonius;
						if( (*it)->on_vote(_p_msg) )
						{
							//    
							ret = false;
							break;
						}
						if( m_delete_sign.no_deletion() )
							m_nonius++;
					}
				}
				m_delete_sign.out_for();
				return ret;
			}
		};
		//  
		class Action_Server: public Server< ACTION_LISTENER_TYPE >
		{
		public:
			//    
			bool dispatch_msg(const _TEvt _event, _TMsg *_p_msg) 
			{
				MAP_TYPE::iterator pass_it = m_evt_listener_table.find( _event );
				if( m_evt_listener_table.end() != pass_it)
				{
					VCT_TYPE& vct = pass_it->second;
					for( m_nonius = vct.begin(); vct.end() != m_nonius;)
					{
						m_delete_sign.in_for();
						VCT_TYPE::const_iterator it = m_nonius;
						(*it)->on_action(_p_msg);
						if( m_delete_sign.no_deletion() )
							m_nonius++;
					}
				}
				m_delete_sign.out_for();
				return true;
			}
		};
		//  
		class Response_Server: public Server< RESPONSE_LISTENER_TYPE >
		{
		public:
			//    
			bool dispatch_msg(const _TEvt _event, _TMsg *_p_msg) 
			{
				MAP_TYPE::iterator pass_it = m_evt_listener_table.find( _event );
				if( m_evt_listener_table.end() != pass_it)
				{
					VCT_TYPE& vct = pass_it->second;
					for( m_nonius = vct.begin(); vct.end() != m_nonius;)
					{
						m_delete_sign.in_for();
						VCT_TYPE::const_iterator it = m_nonius;
						(*it)->on_response(_p_msg);
						if( m_delete_sign.no_deletion() )
							m_nonius++;
					}
				}
				m_delete_sign.out_for();
				return true;
			}
		};
		Pass_Server		m_pass_server;
		Vote_Server		m_vote_server;
		Action_Server	m_action_server;
		Response_Server	m_response_server;
	};
}

 
/********************************************************************
*     :   Server.h
*      :       
*     :       ,2012 11 16      
*     :   1.0
*      :
********************************************************************/
#pragma once
#include "Evt_Server.h"

using namespace Evt_Server_Space;

struct ILog_Trace
{
	virtual ~ILog_Trace(){}
	//      
	virtual void open(long _sign, const TCHAR* _title) = 0;
	//      
	virtual void close(long _sign) = 0;
	//      
	virtual void print(long _sign, TCHAR* _p_text) = 0;
}; 

//  Trace
class Log_Trace: public ILog_Trace, public IAction_Event_Listener<>
{
public:
	Log_Trace(IEvt_Server<>* _p_log_server):mp_log_server(_p_log_server){ }
	virtual ~Log_Trace(){ mp_log_server = NULL;  }
	//      
	void open(long _sign, const TCHAR* _title);
	//      
	void close(long _sign);
	//      
	void print(long _sign, TCHAR* _p_text);

protected:
	//           
	virtual void on_action(Msg *_p_msg);
	map<long, const TCHAR*> title_table;
	IEvt_Server<>* mp_log_server;
}; 


 
#include "stdafx.h"
#include "Log_Server.h"

#include "Map_Par_Binder.h"



//      
void Log_Trace::open(long _sign, const TCHAR* _title)
{ 
	RETURN_IF_NULL(_title);
	mp_log_server->add_listener(_sign, this ); 
	title_table[_sign] = _title;
}

//      
void Log_Trace::close(long _sign)
{ 
	mp_log_server->remove_listener(_sign, this ); 
}

//      
void Log_Trace::print(long _sign, TCHAR* _p_text)
{ 
	mp_log_server->dispatch_vote_msg( _sign, &Msg_Head( &Bind_Par< TYPELIST_2(long,TCHAR*) >(_sign,_p_text) ) ); 
	
}

//           
void Log_Trace::on_action(Msg *_p_msg)
{
	Bind_Par< TYPELIST_2(long, TCHAR*) >* p_buf = NULL;
	_p_msg->get_sub_buf(p_buf);
	RETURN_IF_NULL( p_buf );
	TRACE2("%s : %s
", title_table[p_buf->par1], p_buf->par2); }

 
/********************************************************************
*     :   Bind_Par.h
*      :      
*     :       ,2012 10 25      
*     :   1.0
*    :     
                   ,            。 
                 ,            ,             
********************************************************************/
#pragma once

#define RETURN_IF_NULL( _buf ) if( NULL == _buf ) return
#define RETURN_IF_NO_NULL( _buf ) if( NULL != _buf ) return
#define DELETE_POINT( _buf ) if( NULL != _buf ) { delete _buf; _buf = NULL; } 
 
#define TYPELIST_1(T1) \
	Typelist<T1, NullType>

#define TYPELIST_2(T1, T2) \
	Typelist<T1, TYPELIST_1(T2) >

#define TYPELIST_3(T1, T2, T3) \
	Typelist<T1, TYPELIST_2(T2, T3) >

#define TYPELIST_4(T1, T2, T3, T4) \
	Typelist<T1, TYPELIST_3(T2, T3, T4) >

#define TYPELIST_5(T1, T2, T3, T4, T5) \
	Typelist<T1, TYPELIST_4(T2, T3, T4, T5) >

class NullType {};  
template <class T, class U>  
struct Typelist  
{  
	typedef T Head;  
	typedef U Tail;  
}; 


template <class TList>
struct Bind_Par;

template <class _P1>
struct Bind_Par< TYPELIST_1(_P1) >
{
public:
	typedef _P1 Parm1;
	Parm1 par1;
	Bind_Par< TYPELIST_1(Parm1) >( Parm1 _par1): par1(_par1){}
};

template <class _P1, class _P2>
struct Bind_Par< TYPELIST_2(_P1, _P2) >
{
public:
	typedef _P1 Parm1;
	typedef _P2 Parm2;
	Parm1 par1;
	Parm2 par2;
	Bind_Par< TYPELIST_2(Parm1, Parm2) >( Parm1 _par1, Parm2 _par2): par1(_par1), par2(_par2){}
};

template <class _P1, class _P2, class _P3>
struct Bind_Par< TYPELIST_3(_P1, _P2, _P3) >
{
public:
	typedef _P1 Parm1;
	typedef _P2 Parm2;
	typedef _P3 Parm3;
	Parm1 par1;
	Parm2 par2;
	Parm3 par3;
	Bind_Par< TYPELIST_3(Parm1, Parm2, Parm3) >( Parm1 _par1, Parm2 _par2, Parm3 _par3): par1(_par1), par2(_par2), par3(_par3){}
};

template <class _P1, class _P2, class _P3, class _P4>
struct Bind_Par< TYPELIST_4(_P1, _P2, _P3, _P4) >
{
public:
	typedef _P1 Parm1;
	typedef _P2 Parm2;
	typedef _P3 Parm3;
	typedef _P4 Parm4;
	Parm1 par1;
	Parm2 par2;
	Parm3 par3;
	Parm4 par4;
	Bind_Par< TYPELIST_4(Parm1, Parm2, Parm3, Parm4) >( Parm1 _par1, Parm2 _par2, Parm3 _par3, Parm4 _par4): par1(_par1), par2(_par2), par3(_par3), par4(_par4){}
};

template <class _P1, class _P2, class _P3, class _P4, class _P5>
struct Bind_Par< TYPELIST_5(_P1, _P2, _P3, _P4, _P5) >
{
public:
	typedef _P1 Parm1;
	typedef _P2 Parm2;
	typedef _P3 Parm3;
	typedef _P4 Parm4;
	typedef _P5 Parm5;
	Parm1 par1;
	Parm2 par2;
	Parm3 par3;
	Parm4 par4;
	Parm5 par5;
	Bind_Par< TYPELIST_5(Parm1, Parm2, Parm3, Parm4, Parm5) >( Parm1 _par1, Parm2 _par2, Parm3 _par3, Parm4 _par4, Parm5 _par5): par1(_par1), par2(_par2), par3(_par3), par4(_par4), par5(_par5){}
};

 
/********************************************************************
*     :   Server.h
*      :       
*     :       ,2012 11 16      
*     :   1.0
*      :
********************************************************************/
#pragma once
#include <map>

using namespace std;


template< class _Name, class _I, class _N >
class Proxy_Factory
{
public:
	static void open()
	{  
		if( NULL == m_p_proxy )
			m_p_proxy = new _N;
	}
	template< class _Par >
	static void open( _Par par)
	{  
		if( NULL == m_p_proxy )
			m_p_proxy = new _N( par );
	}
	template< class _Par1, class _Par2 >
	static void open( _Par1 par1, _Par2 _par2 )
	{  
		if( NULL == m_p_proxy )
			m_p_proxy = new _N( par1, _par2 );
	}
	static void close()
	{ 
		if( NULL != m_p_proxy )
		{
			delete m_p_proxy;
			m_p_proxy = NULL;
		}
	}
	static _I* get_proxy(){ return m_p_proxy; }

private:
	static _I* m_p_proxy;
};
template< class _Name, class _I, class _N >
_I* Proxy_Factory< _Name, _I, _N >::m_p_proxy = NULL;



//  Trace
template< class _ID_TYPE >
class Title_Table
{
public:
	virtual ~Title_Table(){}
	//     
	void open(){ title_table.clear(); }
	//     
	void close(){ title_table.clear(); }
	//    
	void set_title(_ID_TYPE _sign, const TCHAR* _title){ title_table[_sign] = _title; }
	//    
	void clear_title(_ID_TYPE _sign){ title_table[_sign] = _T(""); }
	//    
	const TCHAR* get_title( _ID_TYPE _sign ){ return title_table[_sign]; }

protected:
	map<_ID_TYPE, const TCHAR*> title_table;
}; 

 
/********************************************************************
*     :   ITime_Axis.h
*      :      
*     :       ,2012 11 17      
*     :   1.0
*    :     
********************************************************************/
#pragma once
#include <map>



using namespace std;

#define  G_TIME_AXIS_MODULE_NAME	1

//        
struct ITimerSink
{
	virtual ~ITimerSink(){}
	//      
	virtual void on_time(long _user_sign) = 0;
};

//     
struct ITime_Axis
{
	virtual ~ITime_Axis(){}
	//     
	virtual void set_time_tgr( ITimerSink* _p_time_tgr, long _user_sign, long _delay_time, long _interval_time ) = 0;

	//     
	virtual void kill_time_tgr( ITimerSink* _p_time_tgr, long _user_sign ) = 0;

	//    
	virtual void on_vague_time() = 0;

	//    
	virtual void on_exact_time() = 0;
};


//   
struct Time_Grid;
struct Delete_Sign;
class Time_Axis: public ITime_Axis
{
public:
	Time_Axis();
	virtual ~Time_Axis();

	//     
	void set_time_tgr( ITimerSink* _p_time_tgr, long _user_sign, long _delay_time, long _interval_time );

	//     
	void kill_time_tgr( ITimerSink* _p_time_tgr, long _user_sign );

	//    
	void on_vague_time();

	//    
	void on_exact_time();

private:
	typedef map< pair<ITimerSink*, long>, Time_Grid* >		MAP_TYPE;
	MAP_TYPE												time_grids;
	MAP_TYPE::iterator										m_nonius;
	Delete_Sign*											mp_delete_sign;
};


template< class _ITime_Axis >
class TimerSink: public ITimerSink
{
public:
	TimerSink( _ITime_Axis* _p_itime_axis ):mp_itime_axis(_p_itime_axis){}
	virtual ~TimerSink(){}
	//     
	virtual void get_timer_sink( long _user_sign, long _delay_time, long _interval_time )
	{
		mp_itime_axis->set_time_tgr(this, _user_sign, _delay_time, _interval_time); 
	}
	//     
	virtual void release_timer_sink( long _user_sign )
	{
		mp_itime_axis->kill_time_tgr(this, _user_sign); 
	}

private:
	_ITime_Axis*	mp_itime_axis;
};


template< class _ITime_Axis, class _Fun >
class Fun_Time_Tgr: public TimerSink< _ITime_Axis >
{
public:
	Fun_Time_Tgr( _ITime_Axis* _p_itime_axis, const _Fun& _fun, long _delay_time, long _interval_time )
		:TimerSink<_ITime_Axis>(_p_itime_axis), m_fun(_fun)
	{
		get_timer_sink(1, _delay_time, _interval_time)
	}
	virtual ~Fun_Time_Tgr()
	{
		release_timer_sink(1);
	}
	//      
	virtual void on_time( long _user_sign )
	{
		m_fun();
	}

private:
	_Fun			m_fun;
};


template< class _ITime_Axis, class _PtrObj, class _MemFn >
class MemFun_Time_Tgr: public TimerSink< _ITime_Axis >
{
public:
	MemFun_Time_Tgr( _ITime_Axis* _p_itime_axis, const _PtrObj& _p_obj, _MemFn _p_menfn, long _delay_time, long _interval_time )
		:TimerSink<_ITime_Axis>(_p_itime_axis),  m_p_obj(_p_obj), m_p_memfn(_p_menfn)
	{
		get_timer_sink(1, _delay_time, _interval_time);
	}
	virtual ~MemFun_Time_Tgr()
	{
		release_timer_sink(1);
	}
	//      
	virtual void on_time( long _user_sign )
	{
		((*m_p_obj).*m_p_memfn)();
	}

private:
	_PtrObj			m_p_obj;
	_MemFn			m_p_memfn;
};




template< class _ITime_Axis, class _Fun >
Fun_Time_Tgr<_ITime_Axis, _Fun>* new_fun_time_tgr_impl( _ITime_Axis* _p_itime_axis, const _Fun& _fun, long _delay_time, long _interval_time)
{
	Fun_Time_Tgr<_ITime_Axis, _Fun>* p_tgr = new Fun_Time_Tgr<_ITime_Axis, _Fun>(_p_itime_axis, _fun, _delay_time, _interval_time);
	if( NULL == p_tgr){ /*Log  */ }
	return p_tgr;
}

template< class _ITime_Axis, class _PtrObj, class _MemFn  >
 MemFun_Time_Tgr<_ITime_Axis, _PtrObj, _MemFn>* new_memfn_time_tgr_impl( _ITime_Axis* _p_itime_axis, const _PtrObj& _p_obj, _MemFn _p_menfn, long _delay_time, long _interval_time)
{
	MemFun_Time_Tgr<_ITime_Axis, _PtrObj, _MemFn>* p_tgr = new MemFun_Time_Tgr<_ITime_Axis, _PtrObj, _MemFn>(_p_itime_axis, _p_obj, _p_menfn, _delay_time, _interval_time);
	if( NULL == p_tgr){ /*Log  */ }
	return p_tgr;
}

 
#include "stdafx.h"
#include "Time_Axis.h"
#include <map>

using namespace std;

struct Time_Grid
{
	Time_Grid(ITimerSink* _p_time_tgr, long _user_sign, long _delay_time, long _interval_time)
		:p_time_tgr(_p_time_tgr), user_sign(_user_sign), delay_time(_delay_time), interval_time(_interval_time), left_time(_interval_time){}
	ITimerSink* p_time_tgr;
	long		user_sign;
	long		delay_time;
	long		interval_time;
	long		left_time;
};

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;
};


//     
Time_Axis::Time_Axis(){ mp_delete_sign = new Delete_Sign(); mp_delete_sign->out_for(); }
Time_Axis::~Time_Axis(){ delete mp_delete_sign; mp_delete_sign = NULL; }

//     
void Time_Axis::set_time_tgr( ITimerSink* _p_time_tgr, long _user_sign, long _delay_time, long _interval_time )
{
	kill_time_tgr( _p_time_tgr, _user_sign );
	time_grids[ make_pair(_p_time_tgr, _user_sign) ] = new Time_Grid(_p_time_tgr, _user_sign, _delay_time, _interval_time);
}

//     
void Time_Axis::kill_time_tgr( ITimerSink* _p_time_tgr, long _user_sign )
{
	map< pair<ITimerSink*,long>, Time_Grid* >::iterator it = time_grids.find( make_pair(_p_time_tgr, _user_sign) );
	if( time_grids.end() != it )
	{
		if( mp_delete_sign->is_for() && it == m_nonius )
		{
			delete it->second;
			m_nonius = time_grids.erase(it);
			mp_delete_sign->delete_in_for();
		}
		else 
		{
			delete it->second;
			time_grids.erase(it);
		}
	}
}

//    
void Time_Axis::on_vague_time()
{
	const long tm_grid_unit = 20;
	static DWORD tm_start = GetTickCount();
	DWORD tm_cur = GetTickCount();
	long tm_dt = tm_cur - tm_start;
	if( tm_dt >= tm_grid_unit )
	{
		tm_start = tm_cur;
		for( m_nonius = time_grids.begin(); time_grids.end() != m_nonius; )
		{
			mp_delete_sign->in_for();
			MAP_TYPE::iterator it = m_nonius;
			Time_Grid* p_time_grid = it->second;
			if( p_time_grid->delay_time >= 0)
			{
				p_time_grid->delay_time = p_time_grid->delay_time - tm_dt;
				if( p_time_grid->delay_time<= 0)
				{
					p_time_grid->delay_time = p_time_grid->delay_time - tm_dt;
					p_time_grid->p_time_tgr->on_time( p_time_grid->user_sign );
				}
			}
			else
			{
				p_time_grid->left_time = p_time_grid->left_time - tm_dt;
				if( p_time_grid->left_time <= 0 )
				{
					p_time_grid->left_time = p_time_grid->interval_time;
					p_time_grid->p_time_tgr->on_time( p_time_grid->user_sign );
				}
			}
			if( mp_delete_sign->no_deletion() )
				m_nonius++;
			mp_delete_sign->out_for();
		}
	}
}

//    
void Time_Axis::on_exact_time()
{
	const long tm_grid_unit = 20;
	static unsigned long tm_start = GetTickCount();
	unsigned long tm_cur = GetTickCount();
	long tm_dt = tm_cur - tm_start;
	if( tm_dt >= tm_grid_unit )
	{
		tm_start = tm_cur;
		for( m_nonius = time_grids.begin(); time_grids.end() != m_nonius;)
		{
			mp_delete_sign->in_for();
			MAP_TYPE::iterator it = m_nonius;
			Time_Grid* p_time_grid = it->second;

			if( p_time_grid->delay_time >= 0)
			{
				p_time_grid->delay_time = p_time_grid->delay_time - tm_grid_unit;
				if( p_time_grid->delay_time<= 0)
				{
					p_time_grid->delay_time = p_time_grid->delay_time - tm_grid_unit;
					p_time_grid->p_time_tgr->on_time( p_time_grid->user_sign );
				}
			}
			else
			{
				p_time_grid->left_time = p_time_grid->left_time - tm_grid_unit;
				if( p_time_grid->left_time <= 0 )
				{
					p_time_grid->left_time = p_time_grid->interval_time;
					p_time_grid->p_time_tgr->on_time( p_time_grid->user_sign );
				}
			}
			if( mp_delete_sign->no_deletion() )
				m_nonius++;
			mp_delete_sign->out_for();
		}
	}
}

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

 
#include<vector>

using namespace std;

template< class _ID_TYPE >
class UID_Factory
{
public:
	typedef pair<_ID_TYPE, _ID_TYPE>	ITIM;
	UID_Factory(){ res.push_back( make_pair(1, 99999999) ); }
	_ID_TYPE create_uid()
	{
		if( res.size() > 0 )
		{
			_ID_TYPE ret = res[0].first;
			res[0].first++;
			if( res[0].first > res[0].second)
			{
				res[0] = res[ res.size() - 1];
				res.pop_back();
			}
			return ret;
		}
		return 0;
	}
	bool create_need_uid(_ID_TYPE _uid)
	{
		if( res.size() > 0 )
		{
			long len = res.size();
			for(long i=0; i<len; ++i)
			{
				if( _uid >= res[i].first && _uid <= res[i].second)
				{	
					_ID_TYPE s = res[i].first;
					_ID_TYPE e = res[i].second;
					res[i] = res[res.size()-1];
					res.pop_back();
					if( _uid > s)
					{
						res.push_back( make_pair(s, _uid-1) );
					}
					if( _uid < e)
					{
						res.push_back( make_pair(_uid+1, e) );
					}
					return true;
				}
			}
		}
		return false;
	}
	void delete_uid(_ID_TYPE _uid)
	{
		long len = res.size();
		for(long i=0; i<len; ++i)
		{
			if( _uid >= res[i].first && _uid <= res[i].second)
				return;
		}
		res.push_back( make_pair(_uid, _uid) );
		if( res.size() > 50 )
			tidy_res();
	}
	void tidy_res()
	{
		bool is_reflash = false;
		do 
		{
			is_reflash = false;
			for(long i=0; i<res.size()-1; ++i)
			{
				for(long j=i+1; j<res.size(); ++j)
				{
					bool is_mixed = true;
					if( (res[i].second + 1 < res[j].first) || (res[j].second + 1 < res[i].first) )
						is_mixed = false;
					if( is_mixed )
					{
						_ID_TYPE s = min( res[i].first, res[j].first );
						_ID_TYPE e = max( res[i].second, res[j].second );
						res[i] = make_pair(s,e);
						res[j] = res[res.size()-1];
						res.pop_back();
						is_reflash = true;
					}
				}
			}
		} while ( is_reflash );
	}
private:
	friend 	void show_uid_res(UID_Factory *_p_uid_factory);
	vector< ITIM > res;
};

 
#pragma once
#include "..//Game_Module//Time_Axis.h"


class App_SetSize
{
public:
	App_SetSize(long _delay_time, long _interval_time);
	virtual ~App_SetSize();
	//      
	virtual void update_setsize();

private:
	ITimerSink* mp_timer;
};

 
#include "stdafx.h"
#include "App_SetSize.h"
#include "..//Game_Module//Map_Par_Binder.h"
#include "..//Game_Module//Time_Axis.h"
#include "..//Server_KillerDlg.h"
#include <psapi.h>   
#pragma comment(lib,"psapi.lib") 
#include "App_Center.h"


App_SetSize::App_SetSize(long _delay_time, long _interval_time)
{ 
	mp_timer = new_memfn_time_tgr_impl(App_Center::get_time_axis(), this, &App_SetSize::update_setsize, _delay_time, _interval_time);
}

App_SetSize::~App_SetSize()
{ 
	RETURN_IF_NULL(mp_timer);
	delete mp_timer;
	mp_timer = NULL;
}

void App_SetSize::update_setsize()
{
	CServer_KillerDlg* p_dlg = App_Center::get_main_dlg();
	RETURN_IF_NULL(p_dlg);

	static long  time_count = 1;
	static DWORD sum_WorkingSetSize = 0;
	static DWORD sum_PeakWorkingSetSize = 0;
	static DWORD old_WorkingSetSize = 0;
	static DWORD old_PeakWorkingSetSize = 0;

	TCHAR num[64];
	CString text = _T("");
	_ltow(time_count, num, 10);
	text += num;
	text += '
'; PROCESS_MEMORY_COUNTERS pmc; HANDLE handle = GetCurrentProcess(); GetProcessMemoryInfo(handle,&pmc,sizeof(pmc)); DWORD cur_WorkingSetSize = pmc.WorkingSetSize/1024; _ltow(cur_WorkingSetSize, num, 10); text += " : "; text += num; text += "K
"; DWORD cur_PeakWorkingSetSize = pmc.PeakWorkingSetSize/1024; _ltow(cur_PeakWorkingSetSize, num, 10); text += " : "; text += num; text += "K
"; if( old_WorkingSetSize != cur_WorkingSetSize || old_PeakWorkingSetSize != cur_PeakWorkingSetSize) { ++time_count; long dt_WorkingSetSize = cur_WorkingSetSize - old_WorkingSetSize; _ltow(dt_WorkingSetSize, num, 10); if( dt_WorkingSetSize >= 0) text += "+ : "; else text += "- : "; text += num; text += "K
"; long dt_PeakWorkingSetSize = cur_PeakWorkingSetSize - old_PeakWorkingSetSize; _ltow(dt_PeakWorkingSetSize, num, 10); if( dt_PeakWorkingSetSize >= 0) text += "+ : "; else text += "- : "; text += num; text += "K
"; sum_WorkingSetSize = sum_WorkingSetSize + dt_WorkingSetSize; _ltow(sum_WorkingSetSize, num, 10); text += " : "; text += num; text += "K
"; sum_PeakWorkingSetSize = sum_PeakWorkingSetSize + dt_PeakWorkingSetSize; _ltow(sum_PeakWorkingSetSize, num, 10); text += " : "; text += num; text += "K
"; old_WorkingSetSize = cur_WorkingSetSize; old_PeakWorkingSetSize = cur_PeakWorkingSetSize; CString dlg_text = _T(""); p_dlg->m_main_dlg_richedit_setsize.GetWindowText(dlg_text); dlg_text += text; dlg_text += "
"; p_dlg->m_main_dlg_richedit_setsize.SetWindowText(dlg_text); } }

 
#pragma once
#include "App_Center.h"
#include "..//Game_Module//Log_Server.h"



class App_Log_Trace: public Log_Trace
{
public:
	App_Log_Trace(IEvt_Server<>* _p_output_server);
	//           
	virtual void on_action(Msg *_p_msg);
}; 

 
#include "stdafx.h"
#include "..//Game_Module//Map_Par_Binder.h"
#include "App_Log_Trace.h"
#include "App_Center.h"
#include "..//Server_KillerDlg.h"

App_Log_Trace::App_Log_Trace( IEvt_Server<>* _p_output_server ):Log_Trace(_p_output_server){}
void App_Log_Trace::on_action(Msg *_p_msg)
{
	CServer_KillerDlg* p_dlg = App_Center::get_main_dlg();
	RETURN_IF_NULL(p_dlg);

	Log_Trace::on_action(_p_msg);
	Bind_Par< TYPELIST_2(long, TCHAR*) >* p_buf = NULL;
	_p_msg->get_sub_buf(p_buf);
	RETURN_IF_NULL( p_buf );
	CString text = _T("");
	p_dlg->m_main_dlg_richedit.GetWindowText(text); 
	text += title_table[p_buf->par1];
	text += ": ";
	text += p_buf->par2;
	text += "
"; p_dlg->m_main_dlg_richedit.SetWindowText(text); p_dlg->m_main_dlg_richedit.PostMessage(WM_VSCROLL, SB_BOTTOM, 0); }

 
#pragma once
#include "..//Game_Module//Evt_Server.h"
#include "..//Game_Module//UID_Factory.h"
#include "..//Game_Module//Unit_Factory.h"



using namespace Evt_Server_Space;

struct Module_Name
{
	enum MODULE 
	{
		Game_ServerDlg	= 1,
		Time_Axis		= 2,
		Test_Module		= 3,
		Game_App		= 4,
		Game_Server		= 5,
		Game_Client		= 6,
	};
};

class ILog_Trace;
class ITime_Axis;
class CServer_KillerDlg;
struct App_Center
{
	virtual ~App_Center(){}
	static void open();
	static void close();
	static void open_setsize();
	static void close_setsize();
	static void open_log();
	static void close_log();
	static IEvt_Server<>*			get_log_server();
	static CServer_KillerDlg*		get_main_dlg();
	static ITime_Axis*				get_time_axis();
	static UID_Factory< long >*		get_uid_factory();
	static Unit_Factory< long >*	get_unit_factory();
	static IEvt_Server<>*			get_skill_server();
	static Delete_Proxy*			get_delete_proxy();

	static void						trace_open(long _sign, const TCHAR* _title);
	static void						trace_close(long _sign);
	static void						trace_print(long _sign, TCHAR* _p_text);
};

 
#include "stdafx.h"
#include "App_Center.h"
#include "..//Game_Module//Map_Par_Binder.h"
#include "..//Game_Module//Proxy_Factory.h"
#include "..//Game_Module//Time_Axis.h"
#include "App_Log_Trace.h"
#include "..//Server_KillerDlg.h"
#include "App_SetSize.h"
#include "..//Game_Skill//SKL_Prepare.h"



struct APP_MODULE_NAME{};
struct APP_SKILL{};
typedef Proxy_Factory< APP_MODULE_NAME, IEvt_Server<>, Evt_Server<> >						LOG_SERVER;
typedef Proxy_Factory< APP_SKILL, IEvt_Server<>, Evt_Server<> >								SKILL_SERVER;
typedef Proxy_Factory< APP_MODULE_NAME, ITime_Axis, Time_Axis >								TIME_AXIS_SERVER;
typedef Proxy_Factory< APP_MODULE_NAME, UID_Factory< long >, UID_Factory< long > >			UID_FACTORY_SERVER;
typedef Proxy_Factory< APP_MODULE_NAME, Unit_Factory< long >, Unit_Factory< long > >		UNIT_FACTORY_SERVER;
typedef Proxy_Factory< APP_MODULE_NAME, ILog_Trace, App_Log_Trace >							ILOG_TRACE_SERVER;
typedef Proxy_Factory< APP_MODULE_NAME, App_SetSize, App_SetSize >							SETSIZE_SERVER;
typedef Proxy_Factory< APP_MODULE_NAME, Delete_Proxy, Delete_Proxy >						DELETE_PROXY_SERVER;


void App_Center::open()
{
	SKILL_SERVER::open();
	LOG_SERVER::open();
	TIME_AXIS_SERVER::open();
	UID_FACTORY_SERVER::open();
	UNIT_FACTORY_SERVER::open();
	ILOG_TRACE_SERVER::open( get_log_server() );
	DELETE_PROXY_SERVER::open();
	
	trace_open( Module_Name::Game_App,		_T("    ") );
	trace_open( Module_Name::Game_Server,	_T("   ") );
	trace_open( Module_Name::Game_Client,	_T("   ") );
	trace_print( Module_Name::Game_App, _T("     ") );
	trace_print( Module_Name::Game_App, _T("     ") );
	trace_print( Module_Name::Game_App, _T("  ID   ") );
	trace_print( Module_Name::Game_App, _T("      ") );

	new PLAN_SKL();
	new BREAK_SKL();
}


void App_Center::close()
{
	trace_print( Module_Name::Game_App, _T("     ") );
	trace_print( Module_Name::Game_App, _T("     ") );
	trace_print( Module_Name::Game_App, _T("  ID   ") );
	trace_print( Module_Name::Game_App, _T("      ") );
	trace_close( Module_Name::Game_App );
	trace_close( Module_Name::Game_Server );
	trace_close( Module_Name::Game_Client );
	close_setsize();
	
	DELETE_PROXY_SERVER::close();
	ILOG_TRACE_SERVER::close();
	UNIT_FACTORY_SERVER::close();
	UID_FACTORY_SERVER::close();
	TIME_AXIS_SERVER::close();
	LOG_SERVER::close();
	SKILL_SERVER::close();

}

void App_Center::open_setsize()
{
	SETSIZE_SERVER::open(0, 3000);
	trace_print( Module_Name::Game_App,		_T("      ") );
}

void App_Center::close_setsize()
{
	SETSIZE_SERVER::close();
	trace_print( Module_Name::Game_App,		_T("      ") );
}

void App_Center::open_log()
{
	trace_open( Module_Name::Game_ServerDlg, _T("  ") );
	trace_open( Module_Name::Time_Axis,		_T("   ") );
	trace_open( Module_Name::Test_Module,	_T("GM") );
}

void App_Center::close_log()
{
	trace_close( Module_Name::Game_ServerDlg );
	trace_close( Module_Name::Time_Axis );
	trace_close( Module_Name::Test_Module );
}

IEvt_Server<>* App_Center::get_log_server()
{
	return LOG_SERVER::get_proxy();
}

IEvt_Server<>* App_Center::get_skill_server()
{
	return SKILL_SERVER::get_proxy();
}

CServer_KillerDlg* App_Center::get_main_dlg()
{
	return gp_Game_ServerDlg;
}

ITime_Axis* App_Center::get_time_axis()
{
	return TIME_AXIS_SERVER::get_proxy();
}

UID_Factory< long >*	App_Center::get_uid_factory()
{
	return UID_FACTORY_SERVER::get_proxy();
}

Unit_Factory< long >*	App_Center::get_unit_factory()
{
	return UNIT_FACTORY_SERVER::get_proxy();
}

Delete_Proxy*			App_Center::get_delete_proxy()
{
	return DELETE_PROXY_SERVER::get_proxy();
}



void App_Center::trace_open(long _sign, const TCHAR* _title)
{
	if( NULL != ILOG_TRACE_SERVER::get_proxy() )
		ILOG_TRACE_SERVER::get_proxy()->open( _sign, _title );
}

void App_Center::trace_close(long _sign)
{
	if( NULL != ILOG_TRACE_SERVER::get_proxy() )
		ILOG_TRACE_SERVER::get_proxy()->close( _sign );
}

void App_Center::trace_print(long _sign, TCHAR* _p_text)
{
	if( NULL != ILOG_TRACE_SERVER::get_proxy() )
		ILOG_TRACE_SERVER::get_proxy()->print( _sign, _p_text );
}