AuroraRuntime/Source/Time/AuClocks.cpp
2023-03-22 16:59:21 +00:00

68 lines
3.0 KiB
C++

/***
Copyright (C) 2023 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: AuClocks.cpp
Date: 2023-3-21
Author: Reece
***/
#include <RuntimeInternal.hpp>
#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<IClock> Get ## name ## Clock() \
{ \
return AuUnsafeRaiiToShared(&gClock## name ## Instance); \
}
#define FILE_AND_USR_DIR_STEP (AuMSToNS<AuUInt64>(AuSToMS<AuUInt64>(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<IClock> 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 {};
}
}
}