diff --git a/engine.build.lua b/engine.build.lua index 9d3f97b..95f5af9 100644 --- a/engine.build.lua +++ b/engine.build.lua @@ -115,7 +115,8 @@ local math_module = Module("source/Math", { "Color.cpp", "Logarithm.cpp", "Math.cpp", - "Transform.cpp" + "Transform.cpp", + "Time.cpp" }) local game_module = Module("source", { diff --git a/include/Spectre/Math/Time.h b/include/Spectre/Math/Time.h new file mode 100644 index 0000000..9abb7d3 --- /dev/null +++ b/include/Spectre/Math/Time.h @@ -0,0 +1,50 @@ + +#ifndef SPECTRE_MATH_TIME_H +#define SPECTRE_MATH_TIME_H + +namespace sp { + +class Time { +public : + Time(long value = 0); + + double seconds() const; + + int milliseconds() const; + + long microseconds() const; + + // ---------------------------- + // Helper construct functions + // ---------------------------- + static Time seconds(double value); + static Time milliseconds(int value); + static Time microseconds(long value); + +private : + + // In microseconds. + long m_value; +}; + +// ---------------------------- +// Compare +// ---------------------------- +bool operator ==(const Time& a, const Time& b); +bool operator !=(const Time& a, const Time& b); +bool operator <(const Time& a, const Time& b); +bool operator <=(const Time& a, const Time& b); +bool operator >(const Time& a, const Time& b); +bool operator >=(const Time& a, const Time& b); + +// ---------------------------- +// Arithmetic +// ---------------------------- +Time operator +(const Time& a, const Time& b); +Time& operator +=(Time& a, const Time& b); +Time operator -(const Time& a, const Time& b); +Time& operator -=(Time& a, const Time& b); + +}; // namespace sp + +#endif /* SPECTRE_MATH_TIME_H */ diff --git a/source/Math/Time.cpp b/source/Math/Time.cpp new file mode 100644 index 0000000..2e62b4c --- /dev/null +++ b/source/Math/Time.cpp @@ -0,0 +1,101 @@ + +#include +#include + +namespace sp { + +Time::Time(long value) : +m_value(value) +{ +} + +double Time::seconds() const +{ + return ((double) m_value) / 1000000.0f; +} + +int Time::milliseconds() const +{ + return ((double) m_value) / 1000; +} + +long Time::microseconds() const +{ + return m_value; +} + +// ---------------------------- +// Helper construct functions +// ---------------------------- +Time Time::seconds(double value) +{ + return Time((long) std::round(value * 1000000.0f)); +} + +Time Time::milliseconds(int value) +{ + return Time((long) (value * 1000)); +} + +Time Time::microseconds(long value) +{ + return Time(value); +} + +// ---------------------------- +// Compare +// ---------------------------- +bool operator ==(const Time& a, const Time& b) +{ + return a.microseconds() == b.microseconds(); +} + +bool operator !=(const Time& a, const Time& b) +{ + return a.microseconds() != b.microseconds(); +} + +bool operator <(const Time& a, const Time& b) +{ + return a.microseconds() < b.microseconds(); +} + +bool operator <=(const Time& a, const Time& b) +{ + return a.microseconds() <= b.microseconds(); +} + +bool operator >(const Time& a, const Time& b) +{ + return a.microseconds() > b.microseconds(); +} + +bool operator >=(const Time& a, const Time& b) +{ + return a.microseconds() >= b.microseconds(); +} + +// ---------------------------- +// Arithmetic +// ---------------------------- +Time operator +(const Time& a, const Time& b) +{ + return Time(a.microseconds() + b.microseconds()); +} + +Time& operator +=(Time& a, const Time& b) +{ + return a = a + b; +} + +Time operator -(const Time& a, const Time& b) +{ + return Time(a.microseconds() - b.microseconds()); +} + +Time& operator -=(Time& a, const Time& b) +{ + return a = a - b; +} + +} // namespace sp