#pragma once #include #include "Util.hpp" SDLU_BEGIN class Time { public: Time(); template> Rep AsValue() const; float AsSeconds() const; Int32 AsMilliseconds() const; Int64 AsMicroseconds() const; template> std::chrono::duration AsChrono() const; std::chrono::seconds AsChronoSeconds() const; std::chrono::milliseconds AsChronoMilliseconds() const; std::chrono::microseconds AsChronoMicroseconds() const; template friend Time Create(const Rep& duration); template friend Time Create(const std::chrono::duration& duration); friend Time Seconds(float seconds); friend Time Milliseconds(Int32 milliseconds); friend Time Microseconds(Int64 microseconds); friend bool operator==(const Time& left, const Time& right); friend bool operator!=(const Time& left, const Time& right); friend bool operator<(const Time& left, const Time& right); friend bool operator>(const Time& left, const Time& right); friend bool operator<=(const Time& left, const Time& right); friend bool operator>=(const Time& left, const Time& right); friend Time operator-(const Time& right); friend Time operator+(const Time& left, const Time& right); friend Time& operator+=(Time& left, const Time& right); friend Time operator-(const Time& left, const Time& right); friend Time& operator-=(Time& left, const Time& right); friend Time operator*(const Time& left, float right); friend Time operator*(const Time& left, Int64 right); friend Time operator*(float left, const Time& right); friend Time operator*(Int64 left, const Time& right); friend Time& operator*=(Time& left, float right); friend Time& operator*=(Time& left, Int64 right); friend Time operator/(const Time& left, float right); friend Time operator/(const Time& left, Int64 right); friend Time& operator/=(Time& left, float right); friend Time& operator/=(Time& left, Int64 right); friend float operator/(const Time& left, const Time& right); friend Time operator%(const Time& left, const Time& right); friend Time& operator%=(Time& left, const Time& right); private: std::chrono::duration microseconds; }; template inline Rep Time::AsValue() const { return std::chrono::duration_cast>(microseconds).count(); } template inline std::chrono::duration Time::AsChrono() const { return std::chrono::duration_cast>(microseconds); } template> inline Time Create(const Rep& duration) { Time newTime; newTime.microseconds = std::chrono::duration_cast>(std::chrono::duration(duration)); return newTime; } template> inline Time Create(const std::chrono::duration& duration) { Time newTime; newTime.microseconds = std::chrono::duration_cast>(duration); return newTime; } SDLU_END