// Common, group WinWrap
// see CW Class library
// Copyright Alexander Liss

#ifndef __WAITABLE_H__
#define __WAITABLE_H__

#include "win0.h"


struct WaitableObject 
{
    virtual HANDLE get_handle() const = 0;
    virtual DWORD get_status() const = 0;
};


class WaitableCollection 
{
friend DWORD wait(const WaitableCollection& , BOOL , DWORD );
friend DWORD wait_APC(const WaitableCollection& , BOOL , DWORD , BOOL);
public:
    WaitableCollection():size(0){}
    WaitableCollection(const WaitableCollection & z){copy(z);}
    WaitableCollection & operator= (const WaitableCollection & z)
	{if(&z!=this) copy(z); return *this;}

    LONG get_number()const{return size;}
    int add(const WaitableObject& object);
    int add(const WaitableCollection & collection);    

private:
    HANDLE handles[MAXIMUM_WAIT_OBJECTS];
    LONG size;
	void copy(const WaitableCollection & );

};

void wait(DWORD milliseconds);
DWORD wait(const WaitableObject& z,DWORD milliseconds=INFINITE);
DWORD wait(const WaitableCollection& z, BOOL bWaitAll=FALSE, DWORD milliseconds=INFINITE);

void wait_APC(DWORD milliseconds,BOOL ignore_APC=FALSE);
DWORD wait_APC(const WaitableObject& z,DWORD milliseconds=INFINITE,BOOL ignore_APC=FALSE);
DWORD wait_APC(const WaitableCollection& z, BOOL bWaitAll=FALSE, DWORD milliseconds=INFINITE,BOOL ignore_APC=FALSE);

#endif