#ifndef __SFJP_MYU__AGH_util_H__
#define __SFJP_MYU__AGH_util_H__

#define _NS_UTIL_START		namespace util{
#define _NS_UTIL_END		}

_NS_UTIL_START

/*
class ILoader : public agh::CControlBase
{
public:
	//	コンストラクタ・デストラクタ
	CLoaderBase(){}
	virtual ~CLoaderBase(){}

	////////////////////////////////////////////////////

	//	読み込み
	//virtual bool Load(const char* szName)=0;
	//virtual T* Load(const char* szName)=0;
	virtual T* Load(const char* szName){
		T* p = Get(szName);
		if ( p != NULL )
			return p;

		p = &m_loaderMap[szName];
		if ( _OnNewLoaderAppend(szName,p) == false )	//	えー。falseなのー。んじゃ消すよ・・・
			m_loaderMap.erase(m_loaderMap.find(szName));
		return p;
	}

	//	取得。無い場合はNULL
	T* Get( const char *szName ){
		_ITR it = m_loaderMap.find(szName);
		if ( it != m_loaderMap.end() )
			return &(it->second);
		else
			return NULL;
	}

	//	取得。無い場合はNULL
	_ITR GetItr( const char *szName ){
		return m_loaderMap.find(szName);
	}

	//	存在するかどうか？(true/false)
	bool IsExist( const char *szName ){
		_ITR it = m_loaderMap.find(szName);
		if ( it != m_loaderMap.end() )
			return true;
		else
			return false;
	}

	//	削除。無い場合はfalseを返す
	bool Delete( const char *szName ){
		_ITR it = m_loaderMap.find(szName);
		if ( it != m_loaderMap.end() ){
			m_loaderMap.erase(it);
			return true;
		}
		else
			return false;
	}

	//	オペレータ[]
	T* operator[]( const char *szName ){ return Get(szName); }

	//	ローダーのパスを追加
	void AddLoaderPath(const char* szPath){
		m_loaderPathList.push_back(szPath);
	}
};
*/

/////////////////////////////////////////////////

template <typename T>
class CLoaderBase : public agh::CControlBase
//class TLoaderBase : public agh::ILoader
{
protected:
	//typedef typename std::map<_agh_string,typename T> _T_LOADER_MAP;
	//typedef typename std::map<_agh_string,typename T>::iterator _LOADER_MAP_ITR;
	typedef typename std::map<_AGH_STRING,typename T> _T_LOADER_MAP;
	typedef typename std::map<_AGH_STRING,typename T>::iterator _LOADER_MAP_ITR;

	_T_LOADER_MAP m_loaderMap;

	_AGH_VECTOR(_agh_string) m_loaderPathList;	//	今は使ってないけどねー

private:
	typedef typename _T_LOADER_MAP		_T_MAP;
	typedef typename _LOADER_MAP_ITR	_ITR;

	bool _OnNewLoaderAppend(const char* szName, T* pItem){
		//	m_loaderPathListを使うのはとりあえず後回し
		return OnNewLoaderAppend(szName,pItem);
	}

//	イベントハンドラ
_AGH_EVENT_ACCESS_MODIFIER:

	//	***** Start with this class *****
	virtual bool OnNewLoaderAppend(const char* szName, T* pItem){ return true; }

public:
	//	コンストラクタ・デストラクタ
	CLoaderBase(){}
	virtual ~CLoaderBase(){}

	////////////////////////////////////////////////////

	//	読み込み
	//virtual bool Load(const char* szName)=0;
	//virtual T* Load(const char* szName)=0;
	virtual T* Load(const char* szName){
		T* p = Get(szName);
		if ( p != NULL )
			return p;

		p = &m_loaderMap[szName];
		if ( _OnNewLoaderAppend(szName,p) == false )	//	えー。falseなのー。んじゃ消すよ・・・
			m_loaderMap.erase(m_loaderMap.find(szName));
		return p;
	}

	//	取得。無い場合はNULL
	T* Get( const char *szName ){
		_ITR it = m_loaderMap.find(szName);
		if ( it != m_loaderMap.end() )
			return &(it->second);
		else
			return NULL;
	}

	//	取得。無い場合はNULL
	_ITR GetItr( const char *szName ){
		return m_loaderMap.find(szName);
	}

	//	存在するかどうか？(true/false)
	bool IsExist( const char *szName ){
		_ITR it = m_loaderMap.find(szName);
		if ( it != m_loaderMap.end() )
			return true;
		else
			return false;
	}

	//	削除。無い場合はfalseを返す
	bool Delete( const char *szName ){
		_ITR it = m_loaderMap.find(szName);
		if ( it != m_loaderMap.end() ){
			m_loaderMap.erase(it);
			return true;
		}
		else
			return false;
	}

	//	オペレータ[]
	T* operator[]( const char *szName ){ return Get(szName); }

	//	ローダーのパスを追加
	void AddLoaderPath(const char* szPath){
		m_loaderPathList.push_back(szPath);
	}
};

_NS_UTIL_END

#endif//__SFJP_MYU__AGH_util_H__