/*** Copyright (C) 2022 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: LSTimer.NT.hpp Date: 2022-4-19 Author: Reece ***/ #pragma once #include "LSHandle.hpp" namespace Aurora::IO::Loop { struct LSTimer : ITimer, virtual LSHandle { LSTimer(AuUInt32 reschedStepMsOrZero, AuUInt32 maxIterationsOrZero, bool bSingleshot, int handle); ~LSTimer(); virtual void UpdateTime(AuUInt64 absTimeMs) override; virtual void UpdateTimeNs(AuUInt64 absTimeNs) override; virtual void UpdateTickRateIfAny(AuUInt32 reschedStepMsOrZero, AuUInt32 maxIterationsOrZero) override; virtual void UpdateTickRateIfAnyNs(AuUInt64 reschedStepNsOrZero, AuUInt32 maxIterationsOrZero) override; virtual void Stop() override; virtual bool OnTrigger(AuUInt handle) override; virtual bool IsSignaled() override; virtual bool WaitOn(AuUInt32 timeout) override; virtual ELoopSource GetType() override; void UpdateTimeInternal(AuUInt64 absTimeMs); private: AuUInt32 maxIterationsOrZero_ {}; AuUInt64 reschedStepNsOrZero_ {}, targetTime_ {}; AuUInt32 count_ {}; bool bSingleshot {}; bool IsSignaledNonblocking(); }; }