#ifndef FURROVINESTOPWATCH_H
#define FURROVINESTOPWATCH_H
#include <Furrovine++/Core.h>
#include <Furrovine++/TimeSpan.h>
namespace Furrovine {
class furrovineexport Stopwatch {
private:
#ifdef FURROVINEWIN
LARGE_INTEGER countstart;
LARGE_INTEGER countend;
LARGE_INTEGER frequency;
#elif FURROVINEAPPLE || FURROVINELINUX
timeval countstart;
timeval countend;
#endif
bool stopped;
public:
Stopwatch () : stopped(true) {
#ifdef FURROVINEWIN
countstart.QuadPart = 0;
countend.QuadPart = 0;
#elif FURROVINEAPPLE || FURROVINELINUX
countstart.tv_sec = countstart.tv_usec = 0;
countend.tv_sec = countend.tv_usec = 0;
#endif
}
void Start () {
stopped = false;
#ifdef FURROVINEWIN
QueryPerformanceCounter(&countstart);
#elif FURROVINEAPPLE || FURROVINELINUX
gettimeofday(&countstart, NULL);
#endif
}
void Restart () {
#ifdef FURROVINEWIN
QueryPerformanceCounter(&countstart);
#elif FURROVINEAPPLE || FURROVINELINUX
gettimeofday(&countstart, NULL);
#endif
}
void Stop (bool queryifstarted = true) {
if ((queryifstarted && !stopped) || (!queryifstarted)) {
#ifdef FURROVINEWIN
QueryPerformanceCounter(&countend);
QueryPerformanceFrequency( &frequency );
#elif FURROVINEAPPLE || FURROVINELINUX
gettimeofday(&countend, NULL);
#endif
}
stopped = true;
}
bool Running () {
return !stopped;
}
bool Stopped () {
return stopped;
}
int64 ElapsedTicks ( ) {
#ifdef FURROVINEWIN
if (!stopped)
QueryPerformanceCounter(&countend);
return countend.QuadPart - countstart.QuadPart;
#elif FURROVINEAPPLE || FURROVINELINUX
if(!stopped)
gettimeofday(&countend, NULL);
return countstart.tv_usec - countend.tv_usec;
#endif
}
double ElapsedSeconds () {
#ifdef FURROVINEWIN
if ( !stopped ) {
QueryPerformanceCounter(&countend);
QueryPerformanceFrequency( &frequency );
}
return (countend.QuadPart - countstart.QuadPart ) / ( frequency.QuadPart * Mathema<double>::InversePow10[0] );
#elif FURROVINEAPPLE || FURROVINELINUX
if(!stopped)
gettimeofday(&countend, NULL);
double microstarttime = (countstart.tv_sec * Mathema<double>::Pow10[7]) + countstart.tv_usec;
double microendtime = (countend.tv_sec * Mathema<double>::Pow10[7]) + countend.tv_usec;
return microendtime - microstarttime;
#endif
}
double ElapsedMilliseconds() {
#ifdef FURROVINEWIN
if ( !stopped ) {
QueryPerformanceCounter(&countend);
QueryPerformanceFrequency( &frequency );
}
return (countend.QuadPart - countstart.QuadPart ) / ( frequency.QuadPart * Mathema<double>::InversePow10[3] );
#elif FURROVINEAPPLE || FURROVINELINUX
if(!stopped)
gettimeofday(&countend, NULL);
double microstarttime = (countstart.tv_sec * Mathema<double>::Pow10[7]) + countstart.tv_usec;
double microendtime = (countend.tv_sec * Mathema<double>::Pow10[7]) + countend.tv_usec;
return microendtime - microstarttime;
#endif
}
double ElapsedMicroseconds() {
#ifdef FURROVINEWIN
if ( !stopped ) {
QueryPerformanceCounter(&countend);
QueryPerformanceFrequency( &frequency );
}
return (countend.QuadPart - countstart.QuadPart ) / ( frequency.QuadPart * Mathema<double>::InversePow10[6] );
#elif FURROVINEAPPLE || FURROVINELINUX
if(!stopped)
gettimeofday(&countend, NULL);
double microstarttime = (countstart.tv_sec * Mathema<double>::Pow10[7]) + countstart.tv_usec;
double microendtime = (countend.tv_sec * Mathema<double>::Pow10[7]) + countend.tv_usec;
return microendtime - microstarttime;
#endif
}
TimeSpan ElapsedTime () {
#ifdef FURROVINEWIN
if ( !stopped ) {
QueryPerformanceCounter(&countend);
QueryPerformanceFrequency( &frequency );
}
return TimeSpan( countend.QuadPart - countstart.QuadPart );
#elif FURROVINEAPPLE || FURROVINELINUX
if(!stopped)
gettimeofday(&countend, NULL);
return TimeSpan( countstart.tv_usec - countend.tv_usec );
#endif
}
};
}
#endif /* FURROVINESTOPWATCH_H */