AuroraRuntime/Include/Aurora/Time/Time.hpp

123 lines
3.8 KiB
C++
Raw Normal View History

2021-06-27 21:25:29 +00:00
/***
Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved.
File: Time.hpp
Date: 2021-6-9
Author: Reece
***/
#pragma once
namespace Aurora::Time
{
2022-01-21 22:37:29 +00:00
static auline AuString TimeLocaleGetDayChar()
{
return "d"; //for.now
}
static auline AuString TimeLocaleS()
{
return "s";
}
static auline AuString TimeLocaleGetMSChar()
{
return "ms"; //for.now
}
static AuString &_TextPrepadZeroIfOne(AuString &in)
{
if (in.size() == 1) in.insert(in.begin(), '0');
return in;
}
static AuString _TextPrepadZeroIfOne(const AuString &in)
{
AuString ret = in;
if (ret.size() == 1) ret.insert(ret.begin(), '0');
return ret;
}
static AuString _TextPrepadZeroMS(const AuString &in)
{
AuString ret = in;
if (ret.size() == 1) ret.insert(0, "000", 3);
if (ret.size() == 2) ret.insert(0, "000", 2);
if (ret.size() == 3) ret.insert(0, "000", 1);
while (ret.size() > 1 && ret[ret.size() - 1] == '0')
ret.pop_back();
return ret;
}
static AuString _TextPrepadZeroNS(const AuString &in)
{
AuString ret = in;
if (ret.size() == 1) ret.insert(0, "000000", 6);
if (ret.size() == 2) ret.insert(0, "000000", 5);
if (ret.size() == 3) ret.insert(0, "000000", 4);
if (ret.size() == 4) ret.insert(0, "000000", 3);
if (ret.size() == 5) ret.insert(0, "000000", 2);
if (ret.size() == 6) ret.insert(0, "000000", 1);
while (ret.size() > 1 && ret[ret.size() - 1] == '0')
ret.pop_back();
return ret;
}
static auline AuString ConvertMSToTimescale(AuUInt32 ms)
2021-06-27 21:25:29 +00:00
{
const auto msDiv1000 = ms / 1000; // seconds
const auto msDiv1000Mod60 = msDiv1000 % 60; // remaining seconds relative to next whole minute
const auto msDiv1000Div60 = msDiv1000 / 60; // total minutes
if (ms < 1000)
{
2022-01-21 22:37:29 +00:00
return AuToString(ms) + TimeLocaleGetMSChar();
2021-06-27 21:25:29 +00:00
}
2022-01-21 19:36:56 +00:00
else if (ms < (1000 * 60))
2021-06-27 21:25:29 +00:00
{
auto s = msDiv1000;
auto remMs = ms % 1000;
2022-01-21 22:37:29 +00:00
return _TextPrepadZeroIfOne(AuToString(s)) + "." + _TextPrepadZeroMS(AuToString(remMs)) + TimeLocaleS();
2021-06-27 21:25:29 +00:00
}
2022-01-21 19:36:56 +00:00
else if (ms < (1000 * 60 * 60))
2021-06-27 21:25:29 +00:00
{
auto m = msDiv1000Div60;
auto remS = msDiv1000Mod60;
2022-01-21 22:37:29 +00:00
return _TextPrepadZeroIfOne(AuToString(m)) + ":" + _TextPrepadZeroIfOne(AuToString(remS));
2021-06-27 21:25:29 +00:00
}
2022-01-21 19:36:56 +00:00
else if (ms < (1000 * 60 * 60 * 24))
2021-06-27 21:25:29 +00:00
{
2022-01-21 19:36:56 +00:00
auto h = msDiv1000Div60 / 60;
auto remM = msDiv1000Div60;
2021-06-27 21:25:29 +00:00
auto remS = msDiv1000Mod60;
2022-01-21 22:37:29 +00:00
return _TextPrepadZeroIfOne(AuToString(h)) + ":" + _TextPrepadZeroIfOne(AuToString(remM)) + ":" + _TextPrepadZeroIfOne(AuToString(remS));
2021-06-27 21:25:29 +00:00
}
else
{
2022-01-21 19:36:56 +00:00
auto d = (msDiv1000Div60 / 60 / 24);
auto h = (msDiv1000Div60 / 60) - (d * 24);
auto remM = msDiv1000Div60;
auto remS = msDiv1000Mod60;
2022-01-21 22:37:29 +00:00
return AuToString(d) + TimeLocaleGetDayChar() + " " + _TextPrepadZeroIfOne(AuToString(h)) + ":" + _TextPrepadZeroIfOne(AuToString(remM)) + ":" + _TextPrepadZeroIfOne(AuToString(remS));
2021-06-27 21:25:29 +00:00
}
}
2022-01-21 22:37:29 +00:00
static auline AuString ConvertNSToTimescale(AuUInt64 ns)
{
if (ns < AuUInt64(1000000000))
{
const auto ms = ns / 1000000;
const auto remNs = ns % 1000000;
return _TextPrepadZeroMS(AuToString(ms)) + "." + _TextPrepadZeroNS(AuToString(remNs)) + TimeLocaleGetMSChar();
}
else
{
return ConvertMSToTimescale(ns / AuUInt64(1000000000));
}
}
2021-06-27 21:25:29 +00:00
}
#include "Clock.hpp"
#include "Timer.hpp"
#include "TimerHighRes.hpp"
#include "DebugBenchmark.hpp"