#pragma once
#include "types/UTF8Types.h"
#include "StackAlloc.h"


/*!
	テンポラリバッファクラス

	512Byte以下ならスタックに確保
*/
class CUTF8StringTempBuf
{
public:
	/*!
		char* 取得
	*/
	char *AllocChar(int count)
	{
		return((char *)m_stack.Alloc(count));
	}

	/*!
		utf8_char* 取得
	*/
	utf8_char *AllocUTF8(int count)
	{
		return((utf8_char*)AllocChar(count * sizeof(utf8_char)));
	}

	/*!
		wchar_t* 取得
	*/
	wchar_t *AllocUTF16(int count)
	{
		//	2倍にして確保
		return((wchar_t*)AllocChar(count * sizeof(wchar_t)));
	}

protected:
	//!	メモリ
	CStackAlloc<512>	m_stack;
};


/*!
	UTF8String 補助クラス
*/
class CUTF8StringTool
{
public:
	////////////////////////////////////////////////////////////////////////////////
	//	補助
	////////////////////////////////////////////////////////////////////////////////
	//!	空文字列を返す
	static LPCU8STR GetEmptyString();

	//!	空文字列を返す
	static LPCSTR GetEmptyStringMB();

	//!	空文字列を返す
	static LPCWSTR GetEmptyStringU16();

	//! ASCIIかチェック
	__inline static int IsASCII(int ch)
	{
		return(ch < 0x80 && ch != 0);
	}

	////////////////////////////////////////////////////////////////////////////////
	//	変換処理
	////////////////////////////////////////////////////////////////////////////////
	//!	UTF8安全性チェック
	static int CheckIllegalUTF8(LPCU8STR utf8, int length);

	//!	全てアスキーコードかチェック
	static int CheckAllAscii(LPCSTR mbStr, int mbLength); 

	//!	UTF8文字列である可能性が高いかチェック
	static int CheckIsUTF8(LPCSTR mbStr, int mbLength); 

	//!	UTF8文字列を取得(CheckAllAsciiチェックなし)
	static LPCU8STR MBCSToUTF8(LPCSTR mbStr, int mbLength, CUTF8StringTempBuf &tempBuf);

	//!	UTF8文字列を取得
	static LPCU8STR UTF16ToUTF8(LPCWSTR u16Str, int u16Length, CUTF8StringTempBuf &tempBuf);

	//!	MBCS文字列を取得
	static LPCSTR UTF8ToMBCS(LPCU8STR u8Str, int u8Length, CUTF8StringTempBuf &tempBuf);

	//!	UTF16文字列を取得
	static LPCWSTR UTF8ToUTF16(LPCU8STR u8Str, int u8Length, CUTF8StringTempBuf &tempBuf);

	////////////////////////////////////////////////////////////////////////////////
	//	変換補助
	////////////////////////////////////////////////////////////////////////////////
	//!	UTF16文字列を取得
	static LPCWSTR AnyToUTF16(LPCSTR mbStr, int mbLength, CUTF8StringTempBuf &tempBuf, int charSet);

	//!	UTF8/MBCS文字列を取得
	static LPCSTR UTF16ToAny(LPCWSTR u16Str, int u16Length, CUTF8StringTempBuf &tempBuf, int charSet);

	////////////////////////////////////////////////////////////////////////////////
	//	デバッグ補助
	////////////////////////////////////////////////////////////////////////////////
	//!	全てアスキーコードかチェックし、マルチバイトがある場合はASSSERT
	static LPU8STR CheckDirectConvertUTF8(LPCSTR mbStr); 
};

