#pragma once

//! @file Mix/MultipleEvent.h
//! @brief 複数イベントクラスインクルードファイル

#include "Mix/Noncopyable.h"

namespace Mix{

	//! @class MultipleEvent
	//! @brief 複数イベントクラス
	class _MIX_DLL_API MultipleEvent : public Mix::Noncopyable
	{
	private:
		UInt32	m_EventCount;							///< イベント数
		HANDLE	m_hEventArray[MAXIMUM_WAIT_OBJECTS];	///< イベントハンドル配列

	public:
		//! @brief コンストラクタ
		//! @param[in] bSignal シグナル状態でイベントを作成するには TRUE
		//! @param[in] bManualReset 手動でリセットする場合は True
		//! @param[in] count イベント数 ( MAXIMUM_WAIT_OBJECTS 以下 )
		MultipleEvent( Boolean bSignal = False, Boolean bManualReset = False, UInt32 count = 1 );
		//! @brief デストラクタ
		~MultipleEvent( void );

		//! @brief シグナル状態にする
		//! @param[in] index イベントインデックス
		void Set( UInt32 index = 0 );
		//! @brief 非シグナル状態にする
		//! @param[in] index イベントインデックス
		void Reset( UInt32 index = 0 );
		//! @brief すべてのイベントをシグナル状態にする
		void SetAll( void );
		//! @brief すべてのイベントを非シグナル状態にする
		void ResetAll( void );

		//! @brief シグナル状態になるまで待機
		//! @param[in] index イベントインデックス
		//! @param[in] timeOut タイムアウト時間( 1000ms 単位 )<br>
		//! INFINITE 無限に待つ
		//! @retval TRUE シグナル状態
		//! @retval FALSE 非シグナル状態
		Boolean Wait( UInt32 index = 0, UInt32 timeOut = INFINITE );

		//! @brief 全てのイベントがシグナル状態になるまで待機する
		//! @param[in] bAll すべてのイベントがシグナル状態になるまで待機する場合は TRUE
		//! @param[in] timeOut タイムアウト時間\n
		//! INFINITE で無限に待機する
		//! @return シグナル状態になったイベントのインデックス
		//! @retval 0xFFFFFFFF シグナル状態になったイベントは無かった
		UInt32 WaitAll( Boolean bAll = FALSE, UInt32 timeOut = INFINITE );

		//! @brief ハンドルを取得します
		//! @param[in] index 取得するハンドルのインデックス
		//! @return ハンドルを返します
		HANDLE GetHandle( UInt32 index ) const;
	};

}
