// File: timer.h
// A simple high-precision, platform independent timer class.
#pragma once

typedef unsigned long long timer_ticks;

class timer
{
public:
   timer();
   timer(timer_ticks start_ticks);

   void start();
   void start(timer_ticks start_ticks);

   void stop();

   double get_elapsed_secs() const;
   inline double get_elapsed_ms() const { return get_elapsed_secs() * 1000.0f; }
   timer_ticks get_elapsed_us() const;

   static void init();
   static inline timer_ticks get_ticks_per_sec() { return g_freq; }
   static timer_ticks get_init_ticks();
   static timer_ticks get_ticks();
   static double ticks_to_secs(timer_ticks ticks);
   static inline double ticks_to_ms(timer_ticks ticks) { return ticks_to_secs(ticks) * 1000.0f; }
   static inline double get_secs() { return ticks_to_secs(get_ticks()); }
   static inline double get_ms() { return ticks_to_ms(get_ticks()); }

private:
   static timer_ticks g_init_ticks;
   static timer_ticks g_freq;
   static double g_inv_freq;

   timer_ticks m_start_time;
   timer_ticks m_stop_time;

   bool m_started : 1;
   bool m_stopped : 1;
};