#pragma once
#include "types/UTF8Types.h"
#include "WorkspaceString.h"
#include "SimpleArrayTemplate.h"

#define	PAIR_STRING_KEY_LEN			128
#define	PAIR_STRING_DATA_LEN		256
#define	PAIR_STRING_ARRAY_GROW_SIZE	5




/*!
	ワークスペース用記録領域
*/
class CWorkspaceKeyPair
{
public:
	CWorkspaceKeyPair() {};
	CWorkspaceKeyPair(LPCU8STR key,LPCU8STR data)
	{
		m_key = key;
		m_data = data;
	};

	//!	設定
	void SetPair(LPCU8STR key, LPCU8STR data)
	{
		m_key = key;
		m_data = data;
	}

	//!	キー取得
	LPCU8STR GetKey()
	{
		return	m_key;
	}

	//!	データ取得
	LPCU8STR GetData()
	{
		return	m_data;
	}

private:
	//!	キー
	CWorkspaceString<PAIR_STRING_KEY_LEN>	m_key;

	//!	データ
	CWorkspaceString<PAIR_STRING_DATA_LEN>	m_data;
};




/*!
	\class CWorkspaceKeyPairArray
	\brief キーデータ配列クラス
*/
class CWorkspaceKeyPairArray : public CSimpleArrayTemplate<CWorkspaceKeyPair,
										CWorkspaceKeyPair&, 
										CSimpleArrayTemplateItmeConstructor<CWorkspaceKeyPair>,
										PAIR_STRING_ARRAY_GROW_SIZE>
{
public:
	///////////////////////////////////////////////////////////////////////////////////
	//	キーペア操作
	///////////////////////////////////////////////////////////////////////////////////
	//!	強制追加
	void AddNoCompare(LPCU8STR key, LPCU8STR data)
	{
		CSimpleArrayTemplate<	CWorkspaceKeyPair, 
								CWorkspaceKeyPair&,
								CSimpleArrayTemplateItmeConstructor<CWorkspaceKeyPair>,
								PAIR_STRING_ARRAY_GROW_SIZE>
			::Add(CWorkspaceKeyPair(key,data));
	}

	//!	確保
	void Add(LPCU8STR key, LPCU8STR data, int noCase = FALSE)
	{
		int index = Find(key, noCase);
		if(index == -1)
			CSimpleArrayTemplate<	CWorkspaceKeyPair, 
									CWorkspaceKeyPair&,
									CSimpleArrayTemplateItmeConstructor<CWorkspaceKeyPair>,
									PAIR_STRING_ARRAY_GROW_SIZE>
				::Add(CWorkspaceKeyPair(key,data));
		else
		{
			GetAt(index).SetPair(key, data);
		}
	}

	//!	取得
	LPCU8STR Get(LPCU8STR key, LPCU8STR defVal, int noCase = FALSE)
	{
		int index = Find(key, noCase);
		if(index == -1)
			return(defVal);
		else
			return(GetAt(index).GetData());
	}

	//!	削除
	void Delete(LPCU8STR key, int noCase = FALSE)
	{
		int index = Find(key, noCase);
		if(index != -1)
			RemoveAt(index);
	}

	//!	検索
	int Find(LPCU8STR key, int noCase = FALSE)
	{
		if(noCase)
		{
			for(int i=0;i<GetCount();i++)
				if(_strcmpi((LPCSTR)GetAt(i).GetKey(), (LPCSTR)key) == 0)
					return(i);
			return(-1);
		}
		else
		{
			for(int i=0;i<GetCount();i++)
				if(strcmp((LPCSTR)GetAt(i).GetKey(), (LPCSTR)key) == 0)
					return(i);
			return(-1);
		}
	}

	//!	指定位置を取得
	_inline CWorkspaceKeyPair *GetByIndex(int index)
	{
		return(&GetAt(index));
	}

protected:
	///////////////////////////////////////////////////////////////////////////////////
	//	オーバーロード
	///////////////////////////////////////////////////////////////////////////////////
	//!	メモリブロック確保
	virtual void *AllocMemoryBlock(int blockSize, int count)
	{
		return new BYTE[blockSize * count];
	}

	//!	メモリブロック開放
	virtual void FreeMemoryBlock(void *memPtr)
	{
		delete (BYTE*)memPtr;
	}
};

