/*** 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 { struct IWorkItem { virtual AuSPtr WaitFor(const AuSPtr &workItem) = 0; virtual AuSPtr WaitFor(const AuList> &workItem) = 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; virtual AuSPtr Then(const AuSPtr &next) = 0; virtual AuSPtr Dispatch() = 0; // per work frame, available work is dequed and sorted. // work is sorted by prio and then by initial submission index. // // prios under .25 will yield for new work at time of possible dispatch // only if there are work entries of > .5 in the pending work queue. virtual void SetPrio(float val = 0.5f) = 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; }; }