/***************************************************************************/
/** @file       pch_common.h
    @brief      共通で使用するマクロや定数の定義
    @author     shom
****************************************************************************/

#pragma once

///--	コンパイル時のオプション指定

//#define STRICT			// 型チェックを厳密に行う

#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN	// ヘッダーからあまり使われない関数を省く
#endif

///--


///--	警告の抑制

#pragma warning (disable: 4127)	//"条件式が定数です"
#pragma warning (disable: 4238)	//"右辺値のクラスが左辺値に使用されます"
#pragma warning (disable: 4351)	//"新しい動作: 配列 '配列' の要素は既定で初期化されます"

///--


///--	往々に用いられるヘッダのインクルード

//ユニコード対応（_Tマクロ）
#include <tchar.h>

//エラー対処
#include <crtdbg.h>

//stl
#include <string>
#include <vector>
#include <map>
#include <algorithm>
#include <cstdlib>  // for "rand"
#include <bitset>

//boost
#include <boost/format.hpp>
#include <boost/scoped_ptr.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/foreach.hpp>
#include <boost/static_assert.hpp>
#include <boost/array.hpp>

//メモリリーク検出
#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif

///--


///--	define types

typedef	short int          u8;
typedef	short unsigned int u16;
typedef	unsigned int       u32;
typedef short signed int   s16;
typedef signed int         s32;
typedef	float              f32;
typedef	double             f64;
typedef u8                 b8;
typedef u32                b32;

#define ct	const

typedef ct u8	cu8;
typedef ct u16	cu16;
typedef ct u32	cu32;
typedef ct s16	cs16;
typedef	ct s32	cs32;
typedef	ct f32	cf32;
typedef ct f64	cf64;
typedef cu8		cb8;
typedef cu32	cb32;

#undef TRUE
#define TRUE 1
#undef FALSE
#define FALSE 0

typedef std::basic_string<TCHAR> tstring;

///--

///--	マクロの定義

//--	max
#define U32_MAX			( static_cast<u32>( -1 ) )
#define F32_MAX			( FLT_MAX )
//--

//--	invalid
#define UINT_INVALID	( static_cast<UINT>( -1 ) )
#define U32_INVALID		( U32_MAX )
#define F32_INVALID		( F32_MAX )

#define TEX_IDX_INVALID	( U32_MAX )
//--

//--	smart pointer
#define CREATE_SPTR( _class, ... )	\
( boost::shared_ptr< _class >( new _class( __VA_ARGS__ ) ) )

#define SPTR_T( _class ) boost::shared_ptr< _class >
//--

//--    boost
#define foreach BOOST_FOREACH
//--

//--    if-else
#define ifnot( expr ) if( !( expr ) )

#define USING_PTR( ptr ) if( ( ptr ) != NULL )
#define SAFE_CALL( ptr ) if( ( ptr ) != NULL ) ( ptr )
//--

//--	UNUSED
#define UNUSED( _var )	( (void)_var )
//--

//--	ELEMENTSOF
#define ELEMENTSOF( _tbl )	( sizeof( _tbl ) / sizeof( _tbl[0] ) )
//--

//--	debug util
#ifdef _DEBUG
	#define DEBUG_PRINTF( str, ... )					\
		do{												\
			TCHAR sz_temp[256];							\
			_stprintf_s( sz_temp, str, __VA_ARGS__ );	\
			OutputDebugString( sz_temp );				\
		} while( false )
#else
	#define DEBUG_PRINTF( str, ... )
		//vacant
#endif

#ifdef _DEBUG
	#define ASSERT( expr ) \
		if( !( expr ) )	\
		{	\
			DEBUG_PRINTF(	\
				_T( "Assertion failed! in (%d)\n" ), \
				 __LINE__	\
				); \
			DebugBreak(); \
		}
	#define VERIFY( expr )	do { ASSERT( expr ); } while( false )
	#define DEBUG_BREAK()	do { ASSERT( false ); } while( false )
	#define STATIC_ASSERT( expr )	BOOST_STATIC_ASSERT( expr )
#else
	#define ASSERT( expr )	
	#define VERIFY( expr )  if( expr ) {;}
	#define DEBUG_BREAK()	
	#define STATIC_ASSERT( expr )	
#endif
//--

//--	FAILED
#define DBREAK_IF_FAILED( hr )	\
		do { if( FAILED( hr ) ) { DEBUG_BREAK(); } } while( false )
#define DBREAK_IF_SUCCEED( hr )	\
		do { if( SUCCEED( hr ) ) { DEBUG_BREAK(); } } while( false )
//--

//--	color
#define COLOR_RED		( set_color_rgba( 0xff, 0x00, 0x00 ) )
#define COLOR_MAROON	( set_color_rgba( 0x80, 0x00, 0x00 ) )
#define COLOR_FUCHSIA	( set_color_rgba( 0xff, 0x00, 0xff ) )
#define COLOR_PURPLE	( set_color_rgba( 0x80, 0x00, 0x80 ) )
#define COLOR_LIME		( set_color_rgba( 0x00, 0xff, 0x00 ) )
#define COLOR_GREEN		( set_color_rgba( 0x00, 0x80, 0x00 ) )
#define COLOR_YELLOW	( set_color_rgba( 0xff, 0xff, 0x00 ) )
#define COLOR_OLIVE		( set_color_rgba( 0x80, 0x80, 0x00 ) )
#define COLOR_BLUE		( set_color_rgba( 0x00, 0x00, 0xff ) )
#define COLOR_NAVY		( set_color_rgba( 0x00, 0x00, 0x80 ) )
#define COLOR_AQUA		( set_color_rgba( 0x00, 0xff, 0xff ) )
#define COLOR_TEAL		( set_color_rgba( 0x00, 0x80, 0x80 ) )
#define COLOR_WHITE		( set_color_rgba( 0xff, 0xff, 0xff ) )
#define COLOR_SILVER	( set_color_rgba( 0xC0, 0xC0, 0xC0 ) )
#define COLOR_GRAY		( set_color_rgba( 0x80, 0x80, 0x80 ) )
#define COLOR_BLACK		( set_color_rgba( 0x00, 0x00, 0x00 ) )

#define COLOR_LIGHT_YELLOW	( set_color_rgba( 255, 255, 25 ) )
//--

//--	cast
#define SCAST	static_cast
#define CCAST	const_cast
#define RCAST	reinterpret_cast
#define DCAST	dynamic_cast
//--

//--	time
extern u32 get_time();
//--

//--	switch
#define DEFAULT_NOEFFECT	default: break
#define DEFAULT_UNUSED		default: DEBUG_BREAK(); break
//--

///--
