/*
 * Copyright (c) Advanced Micro Devices, Inc., or its affiliates.
 *
 * SPDX-License-Identifier: MIT
 */

#include "Timer.h"

#ifdef _WIN32
#include <windows.h>
#endif

#ifdef __linux__
#include <sys/time.h>
#endif

CPerfCounter::CPerfCounter() : _clocks(0), _start(0) {
#ifdef _WIN32

  QueryPerformanceFrequency((LARGE_INTEGER*)&_freq);

#endif

#ifdef __linux__
  _freq = 1000;
#endif
}

CPerfCounter::~CPerfCounter() {
  // EMPTY!
}

void CPerfCounter::Start(void) {
#ifdef _WIN32

  if (_start) {
    MessageBox(NULL, "Bad Perf Counter Start", "Error", MB_OK);
    exit(0);
  }
  QueryPerformanceCounter((LARGE_INTEGER*)&_start);

#endif
#ifdef __linux__

  struct timeval s;
  gettimeofday(&s, 0);
  _start = (i64)s.tv_sec * 1000 + (i64)s.tv_usec / 1000;

#endif
}

void CPerfCounter::Stop(void) {
  i64 n;

#ifdef _WIN32

  if (!_start) {
    MessageBox(NULL, "Bad Perf Counter Stop", "Error", MB_OK);
    exit(0);
  }

  QueryPerformanceCounter((LARGE_INTEGER*)&n);

#endif
#ifdef __linux__

  struct timeval s;
  gettimeofday(&s, 0);
  n = (i64)s.tv_sec * 1000 + (i64)s.tv_usec / 1000;

#endif

  n -= _start;
  _start = 0;
  _clocks += n;
}

void CPerfCounter::Reset(void) {
#ifdef _WIN32
  if (_start) {
    MessageBox(NULL, "Bad Perf Counter Reset", "Error", MB_OK);
    exit(0);
  }
#endif
  _clocks = 0;
}

double CPerfCounter::GetElapsedTime(void) {
#ifdef _WIN32
  if (_start) {
    MessageBox(NULL, "Trying to get time while still running.", "Error", MB_OK);
    exit(0);
  }
#endif

  return (double)_clocks / (double)_freq;
}
