/*** Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: CompletionGroup.hpp Date: 2023-12-28 Author: Reece ***/ #pragma once namespace Aurora::Async { struct IWorkItem; } namespace Aurora::IO::Loop { struct ILSEvent; } namespace Aurora::IO::CompletionGroup { struct ICompletionGroup { virtual AuSPtr ToAndLoopSource() = 0; virtual AuSPtr ToAnyLoopSource() = 0; virtual AuSPtr OnCompletion() = 0; virtual AuSPtr OnSingleCompletion() = 0; virtual bool HasCompleted() = 0; virtual AuPair GetStats() = 0; virtual void SetCallbacks(const AuSPtr &pCallbacks) = 0; virtual void AddWorkItem(AuSPtr pCompletable) = 0; virtual AuSPtr GetTriggerLoopSource() = 0; virtual void TryTrigger() = 0; // 0 = indefinite virtual bool WaitForAnyMS(AuUInt32 uTimeoutOrZeroMS = 0) = 0; virtual bool WaitForAllMS(AuUInt32 uTimeoutOrZeroMS = 0) = 0; }; AUKN_SYM AuSPtr NewCompletionGroup(); }