/*!
 	@file
 	@brief	文字コード取得ドライバ
\n			このクラスを継承して各ＯＳごとの機能をラップします
 */

#ifndef CCharCodeDriver_h
#define CCharCodeDriver_h

#include"../../Setup/CompileMode.h"
#include"../../Auxiliary/Macro.h"
#include<boost/function.hpp>
#include<boost/bind.hpp>
#include<boost/smart_ptr.hpp>

namespace Maid
{
	/*!
	 	@class	ICharCodeDriver ICharCodeDriver.h
	 	@brief	文字コード取得ドライバ
	\n			たとえば キーボードの A を押した場合
	\n			a, A, ﾁ の可能性があるわけですが、それを識別してくれるクラス
	 */

	class ICharCodeDriver
	{
	public:
		virtual ~ICharCodeDriver()=0{};	//!<	デストラクタ

		//! 初期化処理
		/*!
		 */
		virtual void	Initialize()=0;

		//! 解放処理
		/*!
		 */
		virtual void		Finalize()=0;

		typedef boost::function1<void, unt32>	CHARCODEFUNCTION;

		//! 文字コードが入力された場合、コールバックされる関数の設定
		/*!
		 	@param	Function	[i ]	設定する関数 void XXXX( STR ) の形であること
		\n								STR がすでに識別された文字コードになります
		 */
		virtual void SetCallBack( const CHARCODEFUNCTION& Function )=0;
	};

	#define MakeCharCodeFunctionObject(pFunc,pObject) boost::bind( pFunc, pObject, _1 )

	typedef boost::shared_ptr<ICharCodeDriver> SPCHARCODEDRIVER;

}

#endif
