//	StringAutoMarshal
//	Copyright (c) 2005, Marco Mastropaolo
//	Released to public domain.

class StringAutoMarshal
{
	char* m_string;

	inline explicit StringAutoMarshal(const StringAutoMarshal& i_Source) : m_string(NULL) {}
	inline operator= (const StringAutoMarshal& i_Source) {}

public:
	inline explicit StringAutoMarshal(const System::String __gc* i_strString) : m_string(NULL)
	{
		m_string = (char*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(const_cast<System::String __gc*>(i_strString));
	}


	inline ~StringAutoMarshal()
	{
		System::Runtime::InteropServices::Marshal::FreeHGlobal((void*)m_string);
	}

	inline char* GetNativeString()
	{
		return m_string;
	}

	inline operator char*()
	{
		return m_string;
	}
};

class StringAutoMarshalW
{
	wchar_t* m_string;

	inline explicit StringAutoMarshalW(const StringAutoMarshalW& i_Source) : m_string(NULL) {}
	inline operator= (const StringAutoMarshalW& i_Source) {}
public:
	explicit StringAutoMarshalW(const System::String __gc* i_strString) : m_string(NULL)
	{
		m_string = (wchar_t*)(void*)System::Runtime::InteropServices::Marshal::StringToHGlobalUni(const_cast<System::String __gc*>(i_strString));
	}

	inline ~StringAutoMarshalW()
	{
		System::Runtime::InteropServices::Marshal::FreeHGlobal((void*)m_string);
	}

	inline wchar_t* GetNativeString()
	{
		return m_string;
	}

	inline operator wchar_t*()
	{
		return m_string;
	}
};