#pragma once
#include <ctime>

#include "GlobalDefs.h"

class SysPerfTimer
{
public:
	SysPerfTimer() : 
		m_freq(0),
		m_startTime(0),
		m_endTime(0),
		m_bStartup( true )
	{ 
		// BAN constructor oddity.  QueryPerfFreq fails if inputing m_freq, because its in a constructor
		// using local variable is ok - it has to do with rules of construction
		__int64 tfreq;
		::QueryPerformanceFrequency( (LARGE_INTEGER*)&tfreq ); 
		m_freq = tfreq;
	}
   ~SysPerfTimer() {}

   void StartTimer()	
	{
		if( m_bStartup ) { ::QueryPerformanceFrequency( (LARGE_INTEGER*)&m_freq ); m_bStartup = false; }

		::QueryPerformanceCounter( (LARGE_INTEGER*)&m_startTime ); 
	}
	void StopTimer() { ::QueryPerformanceCounter( (LARGE_INTEGER*)&m_endTime ); }
	void GetTime(double* time) { *time = (double)(m_endTime - m_startTime)/(double)(m_freq); }
	double GetTime() { return( (double)(m_endTime - m_startTime) / (double)m_freq ); }
	double GetElapsedTime() 
	{ 
		INT64 curTime;
		::QueryPerformanceCounter( (LARGE_INTEGER*)&curTime );
		return( (double)(curTime - m_startTime) / (double)m_freq ); 
	}
	void DelayFromStart_ms( UINT32 delay_ms )
	{
		INT64 ticks = ( (INT64)(delay_ms/1000)*m_freq ) + m_startTime;
		INT64 tm;
		do
		{
			::QueryPerformanceCounter( (LARGE_INTEGER*)&tm );
		} while( tm < ticks );
	}

//private:
   INT64 m_freq;
   INT64 m_startTime;
   INT64 m_endTime;
	bool m_bStartup;
};

