#pragma once

namespace FDK
{
	generic< class T >
	public ref class CAtom
	{
	private:
		T _value;
		Object^ lockObject;

	public:
		CAtom()
		{
			// 既定のコンストラクタがないとエラーになる。
			this->lockObject = gcnew Object();
		}
		CAtom( T 初期値 )
			: CAtom()
		{
			this->_value = 初期値;
		}
		~CAtom()
		{
			SAFE_REF_DELETE( this->lockObject );
			//GC::SuppressFinalize( this );   --> コンパイラが勝手にやる
		}

		T Get()
		{
			lock l( this->lockObject );
			return this->_value;
		}
		void Set( T value )
		{
			lock l( this->lockObject );
			this->_value = value;
		}
	};
}
