// WS-POS version 1.3 参照実装
// 
// 実装 version 0.6 

using System;

namespace WSPOSInitiative.Common
{
    /// <summary>
    /// イベント待ち用・同期用のインターフェース
    /// イベント待ち・同期のコードは、言語処理系の実装に依存するため
    /// 他の処理系・言語系への移植のために隠ぺいします。
    /// 
    /// Implementations for waiting event and synchronization.
    /// Since the code for event waiting and synchronization depends on the implementation language, 
    /// hides for transplantation into the other processing systems and languages.
    /// </summary>
    public interface IEventWait : IDisposable
    {
        /// <summary>
        /// 同期リソースのシグナル化を待つ
        /// Wait for the signal of sync resources
        /// </summary>
        /// <param name="millisecondsTimeout">タイムアウトを指定(ミリ秒) | Specifies the time-out (in milliseconds)</param>
        /// <returns>同期リソースがシグナル化したか否か | Did the synchronous resource signal-ize or not? </returns>
        bool Wait(int millisecondsTimeout);

        /// <summary>
        /// 同期リソースをシグナル化する
        /// A synchronous resource is signal-ized. 
        /// </summary>
        /// <returns>正常にシグナル化できたか否か | If successfully managed signaling or not</returns>
        bool Signal();

        /// <summary>
        /// 同期リソースを非シグナル化する
        /// Non-signaling synchronization resources
        /// </summary>
        /// <returns>正常に非シグナル化できたか否か | Successfully able to non-signal or not?</returns>
        bool NonSignal();

        /// <summary>
        /// 渡された複数の同期リソースのいずれかのシグナル化を待つ
        /// Wait for the signaling of one of multiple synchronous resource passed.
        /// </summary>
        /// <param name="waits">同期リソースのリスト | List of synchronous resource</param>
        /// <param name="millisecondsTimeout">タイムアウト指定(ミリ秒) | timeout (millisecondsTimeout)</param>
        /// <returns>シグナル化した同期リソースwaitsのインデックス | index of waits which signalized.</returns>
        int WaitForAny(IEventWait[] waits, int millisecondsTimeout);
    }
}
