/*** Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: AuClocks.cpp Date: 2023-3-21 Author: Reece ***/ #include #include "AuClocks.hpp" namespace Aurora::Time { #define ADD_CLOCK(name, enum, jiffies, getNs, getMs) \ struct name ## Clock_t : IClock \ { \ EClock GetType() override \ { \ return EClock::enum; \ } \ \ AuUInt64 GetHertz() override \ { \ return jiffies(); \ } \ \ AuUInt64 NowNS() override \ { \ return getNs(); \ } \ \ AuUInt64 NowMS() override \ { \ return getMs(); \ } \ }; \ \ static name ## Clock_t gClock## name ## Instance; \ \ AUKN_SYM AuSPtr Get ## name ## Clock() \ { \ return AuUnsafeRaiiToShared(&gClock## name ## Instance); \ } #define FILE_AND_USR_DIR_STEP (AuMSToNS(AuSToMS(1)) / 100ull) ADD_CLOCK(Steady, eSteady, SteadyClockJiffies, SteadyClockNS, SteadyClockMS); ADD_CLOCK(Wall, eWall, FILE_AND_USR_DIR_STEP + AuUInt64, CurrentClockNS, CurrentClockMS); ADD_CLOCK(Process, eProcessTime, HighResClockJiffies, HighResClockNS, HighResClockMS); #undef FILE_AND_USR_DIR_STEP #undef ADD_CLOCK AUKN_SYM AuSPtr GetClockFromEnum(EClock clock) { switch (clock) { case EClock::eWall: return GetWallClock(); case EClock::eProcessTime: return GetProcessClock(); case EClock::eSteady: return GetSteadyClock(); default: SysPushErrorArg("Invalid clock"); return {}; } } }