// TODO: プログラムに必要な追加ヘッダーをここで参照してください。

// stdafx.h : 標準のシステム インクルード ファイルのインクルード ファイル、または
// 参照回数が多く、かつあまり変更されない、プロジェクト専用のインクルード ファイル
// を記述します。

#pragma once

#ifndef _SECURE_ATL
#define _SECURE_ATL 1
#endif

#ifndef VC_EXTRALEAN
#define VC_EXTRALEAN            // Windows ヘッダーから使用されていない部分を除外します。
#endif

#include "targetver.h"

#define _ATL_CSTRING_EXPLICIT_CONSTRUCTORS      // 一部の CString コンストラクタは明示的です。

// 一般的で無視しても安全な MFC の警告メッセージの一部の非表示を解除します。
#define _AFX_ALL_WARNINGS

#include <afxwin.h>         // MFC のコアおよび標準コンポーネント
#include <afxext.h>         // MFC の拡張部分


#include <afxdisp.h>        // MFC オートメーション クラス



#ifndef _AFX_NO_OLE_SUPPORT
#include <afxdtctl.h>           // MFC の Internet Explorer 4 コモン コントロール サポート
#endif
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h>             // MFC の Windows コモン コントロール サポート
#endif // _AFX_NO_AFXCMN_SUPPORT

#include <afxcontrolbars.h>     // MFC におけるリボンとコントロール バーのサポート









#ifdef _UNICODE
#if defined _M_IX86
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='x86' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_IA64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='ia64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#elif defined _M_X64
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='amd64' publicKeyToken='6595b64144ccf1df' language='*'\"")
#else
#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")
#endif
#endif



// ATL 及び boost で必要なインクルードをひとまとめにした物
// このファイルを各プロジェクトの stdafx.h でインクルードするがよろし

#pragma once

// TODO: プログラムに必要な追加ヘッダーをここで参照してください。

//#if _MSC_VER < 1600			// VisualStudio2010未満なら
//	#define _HAS_ITERATOR_DEBUGGING 0		// デバッグ時の STL の範囲チェックは不要
//#endif

#include <typeinfo.h>

#define _USE_MATH_DEFINES
#include <math.h>



#include <afx.h>
#include <afxwin.h>         // MFC のコアおよび標準コンポーネント
#include <afxext.h>         // MFC の拡張部分

#include <atlbase.h>
#include <atlcom.h>
//#include <atlstr.h>
#include <atlutil.h>
#include <atlfile.h>
#include <atlimage.h>
#include <atlwin.h>

#include <mmsystem.h>

#include <iostream>
#include <strstream>
#include <fstream> 
#include <vector>
#include <list>
#include <set>
#include <hash_set>
#include <map>
#include <hash_map>
#include <algorithm>
#include <limits>
#include <deque>

#ifdef _DEBUG
	#define BOOST_ENABLE_ASSERT_HANDLER
#else
	#define BOOST_DISABLE_ASSERTS
#endif
#define BOOST_ASIO_DISABLE_IOCP 1

#include <boost/version.hpp>
#include <boost/cstdint.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/weak_ptr.hpp>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/optional.hpp>
#include <boost/enable_shared_from_this.hpp>
#include <boost/noncopyable.hpp>
#include <boost/any.hpp>
#include <boost/asio.hpp>
#include <boost/thread.hpp>
#include <boost/thread/condition.hpp>
#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/crc.hpp>
#include <boost/lexical_cast.hpp>
#include <boost/tuple/tuple.hpp>


// よく登場するものだけは端折れるように
namespace RLib
{
	using std::vector;
	using std::list;
	using std::auto_ptr;
	//using boost::shared_ptr;
	//using boost::weak_ptr;
	namespace asio = boost::asio;
}

#ifdef _DEBUG
	namespace RLib
	{
		// スレッドチェッカー
		// ・構築時と違うスレッドかどうかチェック
		// ・構築時と違うスレッドで破棄された場合にはASSERT
		template <typename Tag> class CRThreadCheckerWithoutDestruct
		{
			const boost::thread::id	m_threadId;	// 構築時のThreadId
		public:
			CRThreadCheckerWithoutDestruct()
				:m_threadId( boost::this_thread::get_id() )
				{}
			// カレントスレッドが構築時と同じスレッドか？
			bool IsConstructThread()const
				{
					const bool b = boost::this_thread::get_id() == m_threadId;
					return b;
				}
		};
		template <typename Tag> struct CRThreadChecker : public CRThreadCheckerWithoutDestruct<Tag>
		{
			~CRThreadChecker()
				{
					BOOST_ASSERT( IsConstructThread() );
				}
		};
		struct tagRTHREADCHECKER_DEBUG{};
	}
	// クラスメンバ変数
	#define RTHREADCHECKER_INSTANCE	RLib::CRThreadChecker<RLib::tagRTHREADCHECKER_DEBUG> _RThreadChecker;
	#define RTHREADCHECKER_INSTANCE_WITHOUTDESTRUCT	RLib::CRThreadCheckerWithoutDestruct<RLib::tagRTHREADCHECKER_DEBUG> _RThreadChecker;
	// カレントスレッドが構築時と同じスレッドでないならASSERT
	#define RTHREADCHECKER_ASSERT	BOOST_ASSERT( _RThreadChecker.IsConstructThread() );
#else
	#define RTHREADCHECKER_INSTANCE	;
	#define RTHREADCHECKER_INSTANCE_WITHOUTDESTRUCT	;
	#define RTHREADCHECKER_ASSERT	((void)0);
#endif

