/*!
 *   \file  wallclock.h
 *   \brief Pomiar czasu rzeczywistego
 */




#ifndef WALLCLOCK_H__
#define WALLCLOCK_H__

#include <sys/time.h>


enum ProcType
{
  CPU = 0,
//  GPU = 1
};


/*!
 * \brief Pomiaru czasu rzeczywistego (<i>wall clock</i>), jaki upłynął między kolejnymi wywołaniami funkcji
 *
 * restart zeruje zegar
 * elapsed_time zwraca czas od ostatniego restart lub od konstrukcji obiektu
 * dostępne wersje na CPU i GPU
*/



template <ProcType PT>
class timer
{
    public:
      timer();
      ~timer();
      void restart();
      double elapsed_time();
};

template <>
class timer <CPU>
{
    public:
      timer()
      {
         restart();
      }
      ~timer()
      {

      }
      void restart()
      {
        struct timeval tp;
        struct timezone tzp;

        gettimeofday(&tp, &tzp);
        _base_sec = tp.tv_sec;
        _base_usec = tp.tv_usec;
      }
      double elapsed_time()
      {
        const double mega = 0.000001;

        struct timeval tp;
        struct timezone tzp;
        gettimeofday(&tp, &tzp);

        double time = (double) (tp.tv_sec - _base_sec);
        double mic = (double) (tp.tv_usec - _base_usec);
        return time + mic * mega;
      }
    private:
      long int _base_sec;
      long int _base_usec;
};
#endif

