/* =========================================================================== Doom 3 GPL Source Code Copyright (C) 1999-2011 id Software LLC, a ZeniMax Media company. This file is part of the Doom 3 GPL Source Code (?Doom 3 Source Code?). Doom 3 Source Code is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. Doom 3 Source Code is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with Doom 3 Source Code. If not, see . In addition, the Doom 3 Source Code is also subject to certain additional terms. You should have received a copy of these additional terms immediately following the terms and conditions of the GNU General Public License which accompanied the Doom 3 Source Code. If not, please request a copy in writing from id Software at the address below. If you have questions concerning this license or the applicable additional terms, you may contact in writing id Software LLC, c/o ZeniMax Media Inc., Suite 120, Rockville, Maryland 20850 USA. =========================================================================== */ #ifndef __TIMER_H__ #define __TIMER_H__ /* =============================================================================== Clock tick counter. Should only be used for profiling. =============================================================================== */ class idTimer { public: idTimer( void ); idTimer( double clockTicks ); ~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; private: static double base; enum { TS_STARTED, TS_STOPPED } 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; 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 ); } /* =============================================================================== 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__ */