#pragma once

//! @file Mix/Semaphore.h
//! @brief セマフォクラスインクルードファイル

#include "Mix/Noncopyable.h"

namespace Mix{

	//! @class Semaphore
	//! @brief セマフォクラス
	class _MIX_DLL_API Semaphore : public Mix::Noncopyable
	{
	private:
		HANDLE m_hSema;

	public:
		//! @brief コンストラクタ
		//! @param[in] initCount 初期カウント数
		//! @param[in] maxCount 最大カウント数
		//! 指定した名所の同期オブジェクトが生成されていた場合、失敗します
		Semaphore( UInt32 initCount = 0, UInt32 maxCount = 1 );
		//! @brief デストラクタ
		~Semaphore( void );

		//! @brief 資源を一つ減らします
		//! @param[in] timeOut タイムアウト時間( 1/1000秒単位 )<br>
		//! INFINITE 無限に待つ
		//! @return シグナル状態になった場合は True を返します
		Boolean Reduce( UInt32 timeOut = INFINITE );

		//! @brief 資源を指定された数だけ増やします
		//! @param[in] count 増やす数
		void Increase( UInt32 count = 1 );

		//! @brief ハンドルを取得します
		//! @return ハンドルを返します
		HANDLE GetHandle( void ) const;
	};

}
