#ifndef ReferenceCount_h
#define ReferenceCount_h

#include"../Setup/CompileMode.h"
#include"../Auxiliary/Debug/CAssert.h"
#include"../Auxiliary/Debug/CWarning.h"
#include"../Auxiliary/Debug/CException.h"

#include<map>

namespace Maid
{ 
	/*!
	 	@brief	参照カウンタ
	\n			使い方は CPixelShader あたりをみてちょ
	 */
	template <class KEY>
	class ReferenceCount
	{
	private:
		typedef MySTL::map<KEY,unt> COUNTMAP;
		COUNTMAP	m_CountMap;

	public:

		~ReferenceCount()
		{
/*
			for( COUNTMAP::iterator ite=m_CountMap.begin(); ite!=m_CountMap.end(); ++ite )
			{
				MAID_WARNING( MAIDTEXT("カウンタが残ってます:") << ite->first );
			}
*/
		}

		//! 参照カウンタを増やす
		/*!
			@param	k	[i ]	増やすキー

			@return キーが作られた場合 true
					カウンタが増えるだけの場合 false
		 */
		bool Add( const KEY& k )
		{
			//	キャッシュの検索
			COUNTMAP::iterator ite = m_CountMap.find(k);

			if( ite!=m_CountMap.end() )
			{
				//	すでに存在してるならカウンタを増やすだけ
				ite->second += 1;
				return false;
			}

			//	ないなら増やす
			m_CountMap[k] = 1;
			return true;
		}

		//! 参照カウンタを減らす
		/*!
			@param	k	[i ]	減らすキー

			@return キーが削除された場合 true
					カウンタが減るだけの以外 false
		 */
		bool Del( const KEY& k )
		{
			COUNTMAP::iterator ite = m_CountMap.find(k);

			MAID_ASSERT( ite==m_CountMap.end(), MAIDTEXT("キーが存在しないのに呼ばれました ") << k );

			ite->second -= 1;

			if( ite->second != 0 )
			{
				return false;
			}

			m_CountMap.erase( ite );
			return true;
		}

	};
}

#endif