//	Darkstar Engine  (c) UnderWorld Interactive Studio (all coding by Svarog    2007)
//
//      Данный файл является частью Darkstar Engine. Любое использование кода файла
//      без согласия компании, является нарушением закона об авторском праве (в слу-
//      чае если не оговорено обратное).
//
//      Имя файла: profiler.inl
//      Краткое описание: Профилятор
//

namespace ker
{
	inline Profiler::Profiler()
	{
		start_time = 0;
		end_time = 0;
		_getCPF();
		el_time = 0;
	};

	inline Profiler::~Profiler()
	{

	};

	inline unsigned __int64 Profiler::_getTicks()
	{
		__asm rdtsc;
	};

	inline void Profiler::_getCPF()
	{
		LARGE_INTEGER stime, etime, atime;
		__int64 sticks = _getTicks();
		if(!QueryPerformanceCounter(&stime))
			return;
		DWORD stgt = timeGetTime();
		DWORD etgt;
		DWORD wait=200; 
		while((etgt = timeGetTime()) - stgt <= wait)
			Sleep(1);
		QueryPerformanceCounter(&etime);
		__int64 eticks = _getTicks();
		QueryPerformanceFrequency(&atime);
		cpf = (float)(eticks - sticks)/((float)(etime.QuadPart - stime.QuadPart)/(float)(atime.QuadPart));
		cpf *= 0.001f;
	};

	inline void Profiler::startTimer()
	{
		start_time = _getTicks();
	};

	inline float Profiler::endTimer()
	{
		end_time = _getTicks();
		el_time = ((float)end_time - (float)start_time)/cpf;
		return el_time;
	};

	inline float Profiler::getElapsedTime()
	{
		return ((float)_getTicks() - (float)start_time)/cpf;
	};

	inline void Profiler::startProfileFunction()
	{
		startTimer();
	};

	inline void Profiler::endProfileFunction(const std::string& func_name)
	{
		float end = endTimer();
		bool to_console = Log::ptr()->getIsToConsole();
		Log::ptr()->setIsToConsole(false);
		lmes << "Function " << func_name << " doing for " << end << "ms";
		Log::ptr()->setIsToConsole(to_console);
	};
};
