#pragma once

namespace util
{


//! 指定ポインタがNULLでなければdeleteしてNULLを代入する.
template<typename T> inline
void safe_delete( T*& ptr )
{
	if( ptr )
	{
		delete ptr;
		ptr = NULL;
	}
}


//! 指定ポインタがNULLでなければ配列としてdeleteしてNULLを代入する.
template<typename T> inline
void safe_delete_array( T*& ptr )
{
	if( ptr )
	{
		delete [] ptr;
		ptr = NULL;
	}
}



//! auto_castの補助機能
template<typename From>
struct auto_cast_t
{
public:
	auto_cast_t(const From& val) : m_val(val) {}

	template<typename To>
	operator To() const
	{
		return static_cast<To>( m_val );
	}

private:
	const From& m_val;
};

//! 変換後の型を自動解決するスタティックキャスト
template<typename From>
auto_cast_t<From> auto_cast(const From& i_value)
{
	return auto_cast_t<From>(i_value);
}


}
