// Authors / Maintainers: Harijs Grinbergs
// Version 1.0 - 08.08.2017

#ifndef TIMER_H
#define TIMER_H

#include <chrono>

/// Timer class based on C++11 std::chrono
class Timer {
  public:

    /// @brief Constructor calls reset(), so timer is usable from creation
    Timer() { reset(); }

    /// @brief Resets "counter" to zero, so elapsedX calls will start from this point in time
    void reset() { timepoint_t = std::chrono::steady_clock::now(); }

    /// @brief Returns elapsed seconds as a decimal number
    double elapsedS() const { 
      auto t = std::chrono::steady_clock::now() - timepoint_t;
      return (std::chrono::duration_cast<std::chrono::microseconds>(t).count()) / 1000000.0;
    }

    /// @brief Returns elapsed milliseconds as a decimal number
    double elapsedMs() const { 
      auto t = std::chrono::steady_clock::now() - timepoint_t;
      return (std::chrono::duration_cast<std::chrono::microseconds>(t).count()) / 1000.0;
    }

    /// @brief Returns elapsed microseconds as a decimal number
    double elapsedUs() const { 
      auto t = std::chrono::steady_clock::now() - timepoint_t;
      return (std::chrono::duration_cast<std::chrono::microseconds>(t).count());
    }

  private:
    std::chrono::time_point<std::chrono::steady_clock> timepoint_t; ///< Timepoint for last reset point
};

#endif //TIMER_H
