#pragma once

//! @file Mix/AtomicValue.h
//! @brief アトミック変数クラス インクルードファイル

namespace Mix{

	//! @class AtomicValue
	//! @brief アトミック変数クラス
	class _MIX_DLL_API AtomicValue
	{
	private:
		volatile Long32 m_Value;

	public:
		//! @brief コンストラクタ
		AtomicValue( void );
		//! @brief コンストラクタ
		//! @param[in] v 初期値
		AtomicValue( const Long32 v );

	public:
		//! @brief 値を設定します
		//! @param[in] v 設定する値
		//! @return 設定前の値
		Long32 Set( Long32 v );
		//! @brief 値を取得します
		//! @return 値
		Long32 Get( void ) const;
		//! @brief 指定した値を加算します
		//! @param[in] v 加算する値
		//! @return 加算前の値
		Long32 Add( Long32 v );
		//! @brief 値を一つ増やします
		//! @return 一つ増やした値
		Long32 Increment( void );
		//! @brief 値を一つ減らします
		//! @return 一つ減らした値
		Long32 Decrement( void );
		//! @brief 引数 cv と 自身と比較し、等しい場合は、自身に引数 v を設定します
		//! @param[in] v 設定する値
		//! @param[in] cv 比較する値
		//! @return 設定前の値
		Long32 CompareAndSet( Long32 v, Long32 cv );

		//! @brief 値を設定します
		//! @param[in] v 設定する値
		void operator = ( Long32 v );
	};
}
