diff --git a/include/bx/inline/timer.inl b/include/bx/inline/timer.inl new file mode 100644 index 0000000..2e77c54 --- /dev/null +++ b/include/bx/inline/timer.inl @@ -0,0 +1,66 @@ +/* + * Copyright 2011-2025 Branimir Karadzic. All rights reserved. + * License: https://github.com/bkaradzic/bx/blob/master/LICENSE + */ + +#ifndef BX_TIMER_H_HEADER_GUARD +# error "Must be included from bx/timer.h!" +#endif // BX_TIMER_H_HEADER_GUARD + +namespace bx +{ + inline Ticks::Ticks(InitNoneTag) + { + } + + inline constexpr Ticks::Ticks(InitZeroTag) + : Ticks(0) + { + } + + inline Ticks::Ticks(InitIdentityTag) + : Ticks(getHPCounter() ) + { + } + + inline constexpr Ticks::Ticks(int64_t _ticks) + : ticks(_ticks) + { + } + + inline constexpr Ticks Ticks::operator+ (Ticks _rhs) const { return Ticks(ticks + _rhs.ticks); } + inline constexpr Ticks Ticks::operator- (Ticks _rhs) const { return Ticks(ticks - _rhs.ticks); } + inline constexpr Ticks Ticks::operator* (float _rhs) const { return Ticks(int64_t(double(ticks * _rhs) ) ); } + inline constexpr Ticks& Ticks::operator+=(Ticks _rhs) { ticks += _rhs.ticks; return *this; } + inline constexpr Ticks& Ticks::operator-=(Ticks _rhs) { ticks -= _rhs.ticks; return *this; } + inline constexpr Ticks& Ticks::operator*=(float _rhs) { ticks = int64_t(double(ticks * _rhs) ); return *this; } + inline constexpr bool Ticks::operator==(Ticks _rhs) const { return ticks == _rhs.ticks; } + inline constexpr bool Ticks::operator!=(Ticks _rhs) const { return ticks != _rhs.ticks; } + inline constexpr bool Ticks::operator< (Ticks _rhs) const { return ticks < _rhs.ticks; } + inline constexpr bool Ticks::operator<=(Ticks _rhs) const { return ticks <= _rhs.ticks; } + inline constexpr bool Ticks::operator> (Ticks _rhs) const { return ticks > _rhs.ticks; } + inline constexpr bool Ticks::operator>=(Ticks _rhs) const { return ticks >= _rhs.ticks; } + + inline Ticks getNow() + { + return Ticks(getHPCounter() ); + } + + inline Ticks getTicksSinceStartup() + { + return Ticks(getNow() - Ticks::s_kStartup); + } + + template + inline constexpr Ty toSeconds(const Ticks& _ticks) + { + return Ty(double(_ticks.ticks * Ticks::s_kInvFreq) ); + } + + template + inline constexpr Ty toMilliseconds(const Ticks& _ticks) + { + return Ty(double(_ticks.ticks * 1000 * Ticks::s_kInvFreq) ); + } + +} // namespace bx diff --git a/include/bx/timer.h b/include/bx/timer.h index 26d3921..4efa76c 100644 --- a/include/bx/timer.h +++ b/include/bx/timer.h @@ -16,6 +16,63 @@ namespace bx /// int64_t getHPFrequency(); + /// Ticks. + struct Ticks + { + /// No default constructor. + Ticks() = delete; + + /// No initialization. + Ticks(InitNoneTag); + + /// Initialize to zero. + constexpr Ticks(InitZeroTag); + + /// Initialize to current time. + Ticks(InitIdentityTag); + + /// Initialize to specific time in ticks. + explicit constexpr Ticks(int64_t _ticks); + + /// Binary arithmetic operators. + constexpr Ticks operator+ (Ticks _rhs) const; + constexpr Ticks operator- (Ticks _rhs) const; + constexpr Ticks operator* (float _rhs) const; + constexpr Ticks& operator+=(Ticks _rhs); + constexpr Ticks& operator-=(Ticks _rhs); + constexpr Ticks& operator*=(float _rhs); + + /// Comparison operators. + constexpr bool operator==(Ticks _rhs) const; + constexpr bool operator!=(Ticks _rhs) const; + constexpr bool operator< (Ticks _rhs) const; + constexpr bool operator<=(Ticks _rhs) const; + constexpr bool operator> (Ticks _rhs) const; + constexpr bool operator>=(Ticks _rhs) const; + + static const Ticks s_kStartup; //!< App start time. + static const Ticks s_kFreq; //!< Frequency, ticks per second. + static const double s_kInvFreq; //!< 1.0/s_kFreq + + int64_t ticks; //!< Timer ticks. + }; + + /// Returns current time. + Ticks getNow(); + + /// Returns time since app startup. + Ticks getTicksSinceStartup(); + + /// Returns time in seconds. + template + constexpr Ty toSeconds(const Ticks& _time); + + /// Returns time in milliseconds. + template + constexpr Ty toMilliseconds(const Ticks& _time); + } // namespace bx +#include "inline/timer.inl" + #endif // BX_TIMER_H_HEADER_GUARD diff --git a/src/timer.cpp b/src/timer.cpp index 5dc3cc5..77dbb61 100644 --- a/src/timer.cpp +++ b/src/timer.cpp @@ -68,4 +68,8 @@ namespace bx #endif // BX_PLATFORM_ } + const Ticks Ticks::s_kStartup = getNow(); + const Ticks Ticks::s_kFreq = Ticks(getHPFrequency() ); + const double Ticks::s_kInvFreq = 1.0/double(Ticks::s_kFreq.ticks); + } // namespace bx