Blob Blame Raw
#pragma once

#ifndef T_STOPWATCH_INCLUDED
#define T_STOPWATCH_INCLUDED

#include "tcommon.h"

#undef DVAPI
#undef DVVAR
#ifdef TNZCORE_EXPORTS
#define DVAPI DV_EXPORT_API
#define DVVAR DV_EXPORT_VAR
#else
#define DVAPI DV_IMPORT_API
#define DVVAR DV_IMPORT_VAR
#endif

#ifdef _WIN32
#include "windows.h"
#endif

//===============================================================
/** 
  * This is an example of how to use stopwatch.
*/
/*! The TStopWatch class allows you to recording time (in milliseconds)
    taken by your process or by system to perform various tasks.
    It is possible to record these times:
    Total Time, User Time and System Time. 
    A stop watch is identified by a name that describes meaningfully its use.
*/
#ifdef _WIN32

#define TM_TOTAL DWORD
#define TM_USER __int64		  //user time (time associated to the process calling stop watch)(unit=100-nanosecond)
#define TM_SYSTEM __int64	 //system time (unit=100-nanosecond)
#define START DWORD			  //total starting reference time in milliseconds
#define START_USER FILETIME   //process starting reference time (unit=100-nanosecond)
#define START_SYSTEM FILETIME //system starting reference time  (unit=100-nanosecond)
#else

#define TM_TOTAL clock_t
#define TM_USER clock_t
#define TM_SYSTEM clock_t
#define START clock_t
#define START_USER clock_t
#define START_SYSTEM clock_t
#endif

class DVAPI TStopWatch
{
	std::string m_name; //stopwatch name

	TM_TOTAL m_tm;				//elapsed total time (in milliseconds)
	TM_USER m_tmUser;			//elapsed user time (time associated to the process calling stop watch)(unit=100-nanosecond)
	TM_SYSTEM m_tmSystem;		//elapsed system time (unit=100-nanosecond)
	START m_start;				//total starting reference time in milliseconds
	START_USER m_startUser;		//process starting reference time (unit=100-nanosecond)
	START_SYSTEM m_startSystem; //system starting reference time  (unit=100-nanosecond)

#ifdef _WIN32
	LARGE_INTEGER m_hrStart; // high resolution starting reference (total) time
#endif

	bool m_active;	// sw e' stato usato (e' stato invocato il metodo start())
	bool m_isRunning; // fra start() e stop()

	void setStartToCurrentTime();
	void getElapsedTime(TM_TOTAL &tm, TM_USER &user, TM_SYSTEM &system);

public:
	TStopWatch(std::string name = "");
	~TStopWatch();

	void reset();

	/*!Start the stop watch. If reset=true the stop watch is firstly reset.*/
	void start(bool resetFlag = false);
	void stop();

	/*!Returns the number of milliseconds that have elapsed in all the start()-stop() intervals since 
  the stopWatch was resetted up to the getTotalTime() call. The method can be called during a start()-stop() interval */
	TUINT32 getTotalTime();

	/*!Returns the amount of time that the process has spent executing application code. see getTotalTime() */
	TUINT32 getUserTime();

	/*!Returns the amount of time that the process has spent executing operating system code. see getTotalTime() */
	TUINT32 getSystemTime();

	const std::string &getName() { return m_name; };
	void setName(std::string name) { m_name = name; };

	/*!Returns a string containing the recorded times.*/
	operator std::string();

	/*!Print (to cout) the name and the relative total,user and system times of the stop watch. see getTotalTime()*/
	void print(std::ostream &out);
	void print();

private:
	static TStopWatch StopWatch[10];

public:
	/*!
  TStopWatch::global(index) is a global array of 10 stop watches.
  */
	static TStopWatch &global(int index)
	{
		assert(0 <= index && index < 10);
		return StopWatch[index];
	};

	/*!
Allows you to print the name and the relative total,
  user and system times of all the active stop watches.
*/
	static void printGlobals(std::ostream &out);
	static void printGlobals();
};

//-----------------------------------------------------------

#endif //  __T_STOPWATCH_INCLUDED