/**
 * @file
 * @brief Singletonパターンの実装をはしょるためのマクロ定義ファイル
 *
 * STLのauto_ptr を使用しています。　
 * @author S.F.
 * @version $Id:
 *
 * Copyright (C) 2000-2002 Satoshi Fujiwara. All Rights Reserved.
 */

/// 二重インクルード防止マクロ
#ifndef _SINGLETON
#define _SINGLETON
#include <memory>

/** シングルトン定義マクロ
 * @param X 定義するクラス名 */
#define DECLARE_SINGLETON(X) 	\
	public: \
		static X* const instance(void); \
	private: \
	typedef std::auto_ptr<X> _Instance; \
		friend _Instance; \
		static _Instance msInstance;
#ifdef _BORLAND 

/** シングルトン実装マクロ
 * @param X 定義するクラス名（通常は実装クラス) 
 * @param Y インスタンスを生成するクラス名(通常はXと同じ）*/
#define IMPLEMENT_SINGLETON(X,Y) \
	X::_Instance X::msInstance; \
	X* const X::instance(void) \
	{ \
	if(!msInstance.get()){ \
		_Instance temp(new Y); \
		msInstance = temp; \
	} \
	return msInstance.get(); \
	}
#else

/** シングルトン実装マクロ
 *  @param X 定義するクラス名（通常は実装クラス) 
    @param Y インスタンスを生成するクラス名(通常はXと同じ）*/
#define IMPLEMENT_SINGLETON(X,Y) \
	X::_Instance X::msInstance; \
	X* const X::instance(void) \
	{ \
	if(!msInstance.get()){ \
		msInstance = _Instance(new Y); \
	} \
	return msInstance.get(); \
	}

#endif
#endif