Browse Source

Added bx::Ticks. (#359)

Branimir Karadžić 1 month ago
parent
commit
acc565e47e
3 changed files with 127 additions and 0 deletions
  1. 66 0
      include/bx/inline/timer.inl
  2. 57 0
      include/bx/timer.h
  3. 4 0
      src/timer.cpp

+ 66 - 0
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<typename Ty>
+	inline constexpr Ty toSeconds(const Ticks& _ticks)
+	{
+		return Ty(double(_ticks.ticks * Ticks::s_kInvFreq) );
+	}
+
+	template<typename Ty>
+	inline constexpr Ty toMilliseconds(const Ticks& _ticks)
+	{
+		return Ty(double(_ticks.ticks * 1000 * Ticks::s_kInvFreq) );
+	}
+
+} // namespace bx

+ 57 - 0
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<typename Ty>
+	constexpr Ty toSeconds(const Ticks& _time);
+
+	/// Returns time in milliseconds.
+	template<typename Ty>
+	constexpr Ty toMilliseconds(const Ticks& _time); 
+
 } // namespace bx
 
+#include "inline/timer.inl"
+
 #endif // BX_TIMER_H_HEADER_GUARD

+ 4 - 0
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