// timer.cpp

#include "stdafx.h"

#include <iostream>
#include "timer.h"

Timer::Timer ()
{
  label = "Process Timer";
  reset();
}

Timer::Timer (const std::string &label)
{
  Timer::label = label;
  reset();
}

Timer::~Timer()
{
}

void
Timer::reset(void)
{
  #ifdef WIN32
    tps = CLOCKS_PER_SEC;
  #else
    tps = sysconf ( _SC_CLK_TCK );
  #endif
  end_time = 0;
  usertime = 0;
  systemtime = 0;
  elapsedtime = 0;
  waittime = 0;
}

void
Timer::start(void)
{
  #ifdef WIN32
    start_time = clock();
  #else
    start_time = times(&(start_cpu_time));
  #endif
}

void
Timer::show(void)
{
  #ifdef WIN32
    std::cout 
      << "  "
      << label << "\n"
      << "  -------------------------------\n"
      << "  Elapsed Time   : "
      << elapsedtime
      << "s" << std::endl;
  #else
    std::cout 
      << "  "
      << label << "\n"
      << "  -------------------------------\n"
      << "  User CPU Time  : "
      << usertime << " s\n"
      << "  System CPU Time: "
      << systemtime << " s\n"
      << "  Wait Time      : "
      << waittime << " s\n"
      << "  -------------------------------\n"
      << "  Elapsed Time   : "
      << elapsedtime << " s\n" << std::endl;
  #endif
}

void
Timer::stop(void)
{
  #ifdef WIN32
    end_time = clock();
  #else
    end_time = times(&end_cpu_time);
  #endif

  elapsedtime = ((double)(end_time -
                start_time )/(double)tps );
  if (elapsedtime < 0.001)
  {
    elapsedtime = 0.001;
  }

  #ifndef WIN32
    usertime = ((double)(end_cpu_time.tms_utime -
               start_cpu_time.tms_utime)/(double)tps);
    systemtime = ((double)(end_cpu_time.tms_stime -
                 start_cpu_time.tms_stime)/(double)tps);
    waittime = (elapsedtime - (usertime + systemtime));
  #endif

  if ( waittime < 0.00 )
  {
    waittime = 0.00;
  }
}

double Timer::get_user_time(void)
{
  return usertime;
}

double Timer::get_system_time(void)
{
   return systemtime;
}

double Timer::get_wait_time(void)
{
  return waittime;
}

double Timer::get_non_wait_time(void)
{
  return usertime + systemtime;
}

double Timer::get_elapsed_time(void)
{
  return elapsedtime;
}

#ifdef TIMER_TEST

int
main(void)
{
  Timer
    t1("Example Process Timing");

  t1.begin();

  // begin some processing ...
  for (int i=0; i<1000; i++)
  {
    std::string
      name = getenv("PATH");
    std::cout << name << std::endl;
  }

  // end some processing ...

  t1.end();

  t1.show();

  return 0;
}
#endif
// eof timer.cpp
