본문 바로가기
프로그래밍/boost

boost::function 으로 callback map 만들기

by neive 2011. 11. 3.
728x90

boost::function 을 이용해서 패킷 인덱스에 반응하여 callback 을 일으키는 방식

좀 더 알면 수작업을 더 줄 일 수 있을 것 같은데 지금은 뭐... 그냥 맛보기 수준인 듯

callback 매니저

#include <map> 

#include <boost/function.hpp> 

// http://www.boost.org/doc/libs/1_47_0/doc/html/function/tutorial.html#id1361654 

/* 
struct X { 
int foo(int); 
}; 

boost::function<int (int)> f; 
X x; 
f = std::bind1st( 
std::mem_fun(&X::foo), &x); 
f(5); // Call x.foo(5) 
*/

typedef boost::function<BYTE* (BYTE*)>	TYPE_FUNCTION;
typedef std::map< int, TYPE_FUNCTION >	TYPE_CALLBACK_MAP; 

class CCallback 
{ 
public: 
	void Run(BYTE* pData) 
	{ 
	} 
}; 

class CCBSample : public CCallback 
{ 
public: 

	virtual BYTE* Run(BYTE* pData) 
	{ 
		if(pData == NULL)
			return NULL;

		// data stream 처리 

		return NULL;
	} 
}; 

enum ePacketIndex 
{ 
	eNone = 0,
	eSample,
}; 

class CCallbackMrg 
{ 
	TYPE_CALLBACK_MAP m_mapCallback; 

	CCBSample m_CBSample; 
public: 

	void Insert(int nKey, TYPE_FUNCTION f) 
	{ 
		m_mapCallback.insert(TYPE_CALLBACK_MAP::value_type(nKey, f) ); 
	} 

	BYTE* Do(int nKey, BYTE* pData) 
	{ 
		TYPE_CALLBACK_MAP::const_iterator it; 
		it = m_mapCallback.find(nKey); 

		if(it != m_mapCallback.end()) 
		{ 
			TYPE_FUNCTION f = it->second; 
			return f(pData); 
		}

		return NULL;
	} 

	void Init() 
	{ 
		Insert((int)eSample, std::bind1st(std::mem_fun(&CCBSample::Run), &m_CBSample)); 
	} 
};


실 사용 예제


	void handle_Send(const boost::system::error_code& error, size_t /*bytes_transferred*/)
	{
		if(!error)	// 0 이 성공 나머지는 오류 플러그
		{
			if(m_RecvBuf.size())
			{
				int n = (*(int*)(m_RecvBuf.data()));
				m_CBSample.Do(n, m_RecvBuf.data());
			}
		}
// ...
	}
728x90

댓글