/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: IIOProcessor.hpp Date: 2022-6-6 Author: Reece ***/ #pragma once namespace Aurora::IO { struct IIOProcessor { virtual AuUInt32 TryTick () = 0; virtual AuUInt32 RunTick () = 0; virtual AuUInt32 TickFor (const AuSPtr &ioEvent) = 0; virtual AuUInt32 ManualTick () = 0; virtual AuUInt64 SetRefreshRate (AuUInt64 ns) = 0; virtual bool HasRefreshRate () = 0; virtual bool MultiplexRefreshRateWithIOEvents() = 0; virtual AuUInt64 GetOwnedThreadId () = 0; virtual AuSPtr StartIOWatch (const AuSPtr &object, const AuSPtr &listener) = 0; virtual AuSPtr StartIOWatchEx (const AuSPtr &object, const AuSPtr &listener, bool singleshot) = 0; virtual AuSPtr StartSimpleIOWatch (const AuSPtr &object, const AuSPtr &listener) = 0; virtual AuSPtr StartSimpleIOWatchEx(const AuSPtr &object, const AuSPtr &listener, bool singleshot) = 0; virtual AuSPtr StartSimpleLSWatch (const AuSPtr &source, const AuSPtr &listener) = 0; virtual AuSPtr StartSimpleLSWatchEx(const AuSPtr &source, const AuSPtr &listener, bool singleshot, AuUInt32 msTimeout = 0) = 0; virtual bool SubmitIOWorkItem (const AuSPtr &work) = 0; // Inter-frame callbacks indicating point of execution throughout the [START](optional [yield])[IO][IO TICK][WORK ITEMS][EPILOGUE][END OF FRAME] frame virtual bool AddEventListener (const AuSPtr &eventListener) = 0; virtual void RemoveEventListener(const AuSPtr &eventListener) = 0; virtual AuSPtr ToPipeProcessor () = 0; // Reference loop queue virtual AuSPtr ToQueue () = 0; virtual void ReleaseAllWatches () = 0; virtual bool HasItems () = 0; }; AUKN_SYM AuSPtr NewIOProcessor(bool tickOnly, const AuSPtr &queue); AUKN_SYM AuSPtr NewIOProcessorOnThread(bool tickOnly, Async::WorkerPId_t id); AUKN_SYM AuSPtr NewIOProcessorNoQueue(bool tickOnly); }