/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: IWorkItem.hpp Date: 2021-11-1 Author: Reece ***/ #pragma once namespace Aurora::Async { AUE_DEFINE(EWorkPrio, ( eLowestPrio, eLowPrio, eNormalPrio, eHighPrio, eHighestPrio )); struct IWorkItem { virtual AuSPtr WaitFor(const AuSPtr &pWorkItem) = 0; virtual AuSPtr WaitFor(const AuList> &workItems) = 0; // ms = time relative to the current time virtual AuSPtr SetSchedTime(AuUInt32 ms) = 0; // ns = Aurora::Time::CurrentClockMS() + relativeMs virtual AuSPtr SetSchedTimeAbs(AuUInt32 ms) = 0; // ns = time relative to the current time virtual AuSPtr SetSchedTimeNs(AuUInt64 ns) = 0; // ns = Aurora::Time::CurrentClockNS() + relativeNs virtual AuSPtr SetSchedTimeNsAbs(AuUInt64 ns) = 0; // ms = time relative to the time at which the work item would otherwise dispatch virtual AuSPtr AddDelayTime(AuUInt32 ms) = 0; // ns = time relative to the time at which the work item would otherwise dispatch virtual AuSPtr AddDelayTimeNs(AuUInt64 ns) = 0; // inverted WaitFor virtual AuSPtr Then(const AuSPtr &next) = 0; virtual AuSPtr Dispatch() = 0; virtual void SetPrio(EWorkPrio prio) = 0; virtual bool BlockUntilComplete() = 0; virtual bool HasFinished() = 0; virtual bool HasFailed() = 0; virtual void Cancel() = 0; virtual void *GetPrivateData() = 0; virtual AuOptional ToWorkResultT() = 0; }; }