#pragma once

//! @file Mix/Parallel/IManager.h
//! @brief 並列パネージャインターフェースインクルードファイル

#include "Mix/Reference.h"

namespace Mix{ namespace Parallel{

	//! @class IManager
	//! @brief 並列マネージャインターフェース
	class IManager : public Mix::Reference
	{
	protected:
		//! @brief デストラクタ
		virtual ~IManager( void ){}

	public:
		//! @brief スレッド数を取得します
		//! @return スレッド数を返します
		virtual UInt32 GetThreadCount( void ) const = 0;

		//! @brief ワークをマップします
		//! @param[in] numWork ワークの数
		//! @param[in] works マップするワークを表す Mix::Parallel::WORK 構造体の配列
		//! @return 成功した場合は、マップしたワークのハンドルを返します
		//! @note
		//! バックグラウンドで動作するファンクションを登録します。<br>
		//! また、ウェイクアップ用同期オブジェクトを共有しているワークは並列で処理されますが、<br>
		//! 同期オブジェクトが異なるワーク同士、 Mix::Parallel::ExecuteFunction にて実行されるファンクションは同期して実行されます。
		virtual HANDLE MapWorks( UInt32 numWork, Mix::Parallel::WORK* works ) = 0;
		//! @brief ワークをアンマップします
		//! @param[in] handle アンマップするワークのハンドル
		//! @return 成功した場合は True を返します
		virtual Boolean UnmapWorks( HANDLE handle ) = 0;

		//! @brief 指定した数のスレッドを使用してファンクションを実行します
		//! @param[in] threadNum 使用するスレッド数
		//! @param[in] pFunc 実行するファンクションのポインタ
		//! @param[in] pData 実行するファンクションに渡すデータのポインタ
		//! @param[in] debugID デバッグ用識別子 ( Mix::Parallel::DEBUG_ID )
		//! @return 成功した場合は True を返します
		//! @note
		//! 使用するスレッド数 ( threadNum ) に 0 を指定した場合は、1 を指定したとみなします。<br>
		//! また、最大スレッド数 ( GetThreadCount ) を超えた場合は、飽和されます。
		virtual Boolean ExecuteFunction( UInt32 threadNum, FunctionPtr pFunc, void* pData, UInt32 debugID = Mix::Parallel::DEBUG_USER ) = 0;

		//! @brief デバッグ : スレッドの情報を取得します
		//! @param[in] threadIndex スレッドのインデックス
		//! @return スレッドの情報を表す Mix::Parallel::DEBUG_THREAD_INFO 構造体を返します
		virtual const Mix::Parallel::DEBUG_THREAD_INFO& Debug_GetThreadInfo( UInt32 threadIndex ) const = 0;
	};

}}
