// Copyright (C) 2007 Id Software, Inc. // #ifndef __TIMER_H__ #define __TIMER_H__ /* =============================================================================== Clock tick counter. Should only be used for profiling. =============================================================================== */ class idTimer { public: enum timerState_t { TS_STARTED, TS_STOPPED }; public: idTimer( void ); idTimer( double clockTicks ); virtual ~idTimer( void ); idTimer operator+( const idTimer &t ) const; idTimer operator-( const idTimer &t ) const; idTimer & operator+=( const idTimer &t ); idTimer & operator-=( const idTimer &t ); void Start( void ); void Stop( void ); void Clear( void ); double ClockTicks( void ) const; double Milliseconds( void ) const; timerState_t State( void ) const; const char* ToString() const; private: static double base; timerState_t state; double start; double clockTicks; void InitBaseClockTicks( void ) const; }; /* ================= idTimer::idTimer ================= */ ID_INLINE idTimer::idTimer( void ) { state = TS_STOPPED; clockTicks = 0.0; } /* ================= idTimer::idTimer ================= */ ID_INLINE idTimer::idTimer( double clockTicks ) { state = TS_STOPPED; this->clockTicks = clockTicks; } /* ================= idTimer::~idTimer ================= */ ID_INLINE idTimer::~idTimer( void ) { } /* ================= idTimer::operator+ ================= */ ID_INLINE idTimer idTimer::operator+( const idTimer &t ) const { assert( state == TS_STOPPED && t.state == TS_STOPPED ); return idTimer( clockTicks + t.clockTicks ); } /* ================= idTimer::operator- ================= */ ID_INLINE idTimer idTimer::operator-( const idTimer &t ) const { assert( state == TS_STOPPED && t.state == TS_STOPPED ); return idTimer( clockTicks - t.clockTicks ); } /* ================= idTimer::operator+= ================= */ ID_INLINE idTimer &idTimer::operator+=( const idTimer &t ) { assert( state == TS_STOPPED && t.state == TS_STOPPED ); clockTicks += t.clockTicks; return *this; } /* ================= idTimer::operator-= ================= */ ID_INLINE idTimer &idTimer::operator-=( const idTimer &t ) { assert( state == TS_STOPPED && t.state == TS_STOPPED ); clockTicks -= t.clockTicks; return *this; } /* ================= idTimer::Start ================= */ ID_INLINE void idTimer::Start( void ) { assert( state == TS_STOPPED ); state = TS_STARTED; start = idLib::sys->GetClockTicks(); } /* ================= idTimer::Stop ================= */ ID_INLINE void idTimer::Stop( void ) { assert( state == TS_STARTED ); clockTicks += idLib::sys->GetClockTicks() - start; if ( base < 0.0 ) { InitBaseClockTicks(); } if ( clockTicks > base ) { clockTicks -= base; } state = TS_STOPPED; } /* ================= idTimer::Clear ================= */ ID_INLINE void idTimer::Clear( void ) { clockTicks = 0.0; } /* ================= idTimer::ClockTicks ================= */ ID_INLINE double idTimer::ClockTicks( void ) const { assert( state == TS_STOPPED ); return clockTicks; } /* ================= idTimer::Milliseconds ================= */ ID_INLINE double idTimer::Milliseconds( void ) const { assert( state == TS_STOPPED ); return clockTicks / ( idLib::sys->ClockTicksPerSecond() * 0.001 ); } /* =============== State =============== */ ID_INLINE idTimer::timerState_t idTimer::State( void ) const { return state; } /* =============================================================================== Report of multiple named timers. =============================================================================== */ class idTimerReport { public: idTimerReport( void ); ~idTimerReport( void ); void SetReportName( const char *name ); int AddReport( const char *name ); void Clear( void ); void Reset( void ); void PrintReport( void ); void AddTime( const char *name, idTimer *time ); private: idListtimers; idStrList names; idStr reportName; }; #endif /* !__TIMER_H__ */