2025-03-06 15:35:34 +01:00

206 lines
4.1 KiB
C++

#pragma once
#include "3ds/types.h"
namespace CTRPluginFramework
{
class Time
{
public :
constexpr Time(void) : _ticks(0) {}
float AsSeconds(void) const;
int AsMilliseconds(void) const;
s64 AsMicroseconds(void) const;
inline s64 AsTicks(void) const { return _ticks; }
static const Time Zero; ///< Predefined "zero" time value
static constexpr u32 TicksPerSecond = 268111856U;
private :
friend constexpr Time Seconds(float amount);
friend constexpr Time Milliseconds(int amount);
friend constexpr Time Microseconds(s64 amount);
friend constexpr Time Ticks(s64 amount);
constexpr Time(s64 ticks) : _ticks(ticks) {}
private :
s64 _ticks;
};
constexpr Time Seconds(float amount)
{
return (Time(static_cast<s64>(amount * Time::TicksPerSecond)));
}
constexpr Time Milliseconds(int amount)
{
return (Time(static_cast<s64>(amount * (Time::TicksPerSecond / 1000.f))));
}
constexpr Time Microseconds(s64 amount)
{
return (Time(static_cast<s64>(amount * (Time::TicksPerSecond / 1000000.f))));
}
constexpr Time Ticks(s64 amount)
{
return (Time(amount));
}
inline bool operator ==(const Time& left, const Time& right)
{
return (left.AsTicks() == right.AsTicks());
}
inline bool operator !=(const Time& left, const Time& right)
{
return (left.AsTicks() != right.AsTicks());
}
inline bool operator <(const Time& left, const Time& right)
{
return (left.AsTicks() < right.AsTicks());
}
inline bool operator >(const Time& left, const Time& right)
{
return (left.AsTicks() > right.AsTicks());
}
inline bool operator <=(const Time& left, const Time& right)
{
return (left.AsTicks() <= right.AsTicks());
}
inline bool operator >=(const Time& left, const Time& right)
{
return (left.AsTicks() >= right.AsTicks());
}
inline Time operator -(const Time& right)
{
return (Ticks(-right.AsTicks()));
}
inline Time operator +(const Time& left, const Time& right)
{
return (Ticks(left.AsTicks() + right.AsTicks()));
}
inline Time& operator +=(Time& left, const Time& right)
{
return (left = left + right);
}
inline Time operator -(const Time& left, const Time& right)
{
return (Ticks(left.AsTicks() - right.AsTicks()));
}
inline Time& operator -=(Time& left, const Time& right)
{
return left = left - right;
}
inline Time operator *(const Time& left, float right)
{
return (Seconds(left.AsSeconds() * right));
}
inline Time operator *(const Time& left, s64 right)
{
return (Microseconds(left.AsMicroseconds() * right));
}
inline Time operator *(float left, const Time& right)
{
return (right * left);
}
inline Time operator *(s64 left, const Time& right)
{
return (right * left);
}
inline Time& operator *=(Time& left, float right)
{
return (left = left * right);
}
inline Time& operator *=(Time& left, s64 right)
{
return (left = left * right);
}
inline Time operator /(const Time& left, float right)
{
return Seconds(left.AsSeconds() / right);
}
inline Time operator /(const Time& left, s64 right)
{
return (Microseconds(left.AsMicroseconds() / right));
}
inline Time& operator /=(Time& left, float right)
{
return (left = left / right);
}
inline Time& operator /=(Time& left, s64 right)
{
return (left = left / right);
}
inline float operator /(const Time& left, const Time& right)
{
return (left.AsSeconds() / right.AsSeconds());
}
inline Time operator %(const Time& left, const Time& right)
{
return (Ticks(left.AsTicks() % right.AsTicks()));
}
inline Time& operator %=(Time& left, const Time& right)
{
return (left = left % right);
}
}