#include "timer.h"

#include <chrono>

Timer::Timer() { start(); };

void Timer::start() { start_ = std::chrono::high_resolution_clock::now(); }

void Timer::stop() { end_ = std::chrono::high_resolution_clock::now(); }

long Timer::us() const {
  return std::chrono::duration_cast<std::chrono::microseconds>(end_ - start_)
      .count();
}

std::ostream &operator<<(std::ostream &os, const Timer &timer) {
  long time = timer.us();

  if (time >= 1e6) {
    os << time / static_cast<long>(1e6) << " s ";
    time %= static_cast<long>(1e6);
  }

  if (time >= 1e3) {
    os << time / static_cast<long>(1e3) << " ms ";
    time %= static_cast<long>(1e3);
  }

  os << time << " µs";

  return os;
}
