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

///////////////////////////////////////////////////////////////////////////////////
//	変換用クラス
///////////////////////////////////////////////////////////////////////////////////
/*!
	一時的にUTF8に変換
	キャスト代わりに使う、受け付けるのはMBCS/UTF16
	1Kバイト強、スタックを消費
	※配列、リストクラスへの格納禁止
*/
class CUTF8TempConvert
{
public:
	//!	コンストラクタ
	CUTF8TempConvert(LPCSTR mbst)
	{
		//	変換の必要はあるか？
		if(CUTF8StringTool::CheckAllAscii(mbst, -1))
			m_utf8 = (LPCU8STR)mbst;
		else
			m_utf8 = CUTF8StringTool::MBCSToUTF8(mbst, -1, m_utf8Buf);
	}

	//!	コンストラクタ
	CUTF8TempConvert(LPCWSTR utf16)
	{
		m_utf8 = CUTF8StringTool::UTF16ToUTF8(utf16, -1, m_utf8Buf);
	}

	//!	取得
	operator LPCU8STR()
	{
		return m_utf8;
	}

protected:
	//!	返還後を返す
	LPCU8STR			m_utf8;

	//!	変換用
	CUTF8StringTempBuf	m_utf8Buf;
};



/*!
	一時的にMBCSに変換
	キャスト代わりに使う、受け付けるのはUTF8
	1Kバイト強、スタックを消費
	※配列、リストクラスへの格納禁止
*/
class CMBCSTempConvert
{
public:
	//!	コンストラクタ
	CMBCSTempConvert(LPCU8STR utf8)
	{
		//	変換の必要はあるか？
		if(CUTF8StringTool::CheckAllAscii((LPCSTR)utf8, -1))
			m_mbcs = (LPCSTR)utf8;
		else
			m_mbcs = CUTF8StringTool::UTF8ToMBCS(utf8, -1, m_mbcsBuf);
	}

	//!	取得
	operator LPCSTR()
	{
		return m_mbcs;
	}

protected:
	//!	返還後を返す
	LPCSTR				m_mbcs;

	//!	変換用
	CUTF8StringTempBuf	m_mbcsBuf;
};


/*!
	一時的にUTF16に変換
	キャスト代わりに使う、受け付けるのはUTF8
	1Kバイト強、スタックを消費
	※配列、リストクラスへの格納禁止
*/
class CUTF16TempConvert
{
public:
	//!	コンストラクタ
	CUTF16TempConvert(LPCU8STR utf16)
	{
		if(utf16 == NULL)
			m_utf16 = NULL;
		else
			m_utf16 = CUTF8StringTool::UTF8ToUTF16(utf16, -1, m_utf16Buf);
	}

	//!	取得
	operator LPCWSTR()
	{
		return m_utf16;
	}

protected:
	//!	返還後を返す
	LPCWSTR				m_utf16;

	//!	変換用
	CUTF8StringTempBuf	m_utf16Buf;
};


///////////////////////////////////////////////////////////////////////////////////
//	変数 変換用マクロ(変換を行う)
///////////////////////////////////////////////////////////////////////////////////
//!	UTF8へ変換マクロ
#define	_cnvU8(x)	(LPCU8STR)CUTF8TempConvert(x)

//!	UTF16へ変換マクロ
#define	_cnvU16(x)	(LPCWSTR)CUTF16TempConvert(x)

//!	MBCSへ変換マクロ
#define	_cnvMBCS(x)	(LPCSTR)CMBCSTempConvert(x)


///////////////////////////////////////////////////////////////////////////////////
//	リテラル文字列 変換用マクロ(変換を行わない)
///////////////////////////////////////////////////////////////////////////////////
/*!
	UTF8文字列

	ASCIIコードのみ直接変換できる
	デバッグでは、マルチバイトのチェックが行われる
*/
#define	_U8(x)		CUTF8StringTool::CheckDirectConvertUTF8(x)

/*!
	UTF16文字列

	ワイドバイトで宣言
*/
#define _U16(x)      L ## x
