// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
// -*- mode: C++ -*-
//
// Copyright 2021-2023 Google LLC
//
// Licensed under the Apache License v2.0 with LLVM Exceptions (the
// "License"); you may not use this file except in compliance with the
// License.  You may obtain a copy of the License at
//
//     https://llvm.org/LICENSE.txt
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//
// Author: Giuliano Procida

#include "runtime.h"

#include <time.h>

#include <iomanip>
#include <ostream>

namespace stg {

std::ostream& operator<<(std::ostream& os, const Frequencies& frequencies) {
  bool separate = false;
  for (const auto& [item, frequency] : frequencies.counts) {
    if (separate) {
      os << ' ';
    } else {
      separate = true;
    }
    os << '[' << item << "]=" << frequency;
  }
  return os;
}

std::ostream& operator<<(std::ostream& os, const Nanoseconds& value) {
  const auto millis = value.ns / 1'000'000;
  const auto nanos = value.ns % 1'000'000;
  // fill needs to be reset; width is reset automatically
  return os << millis << '.' << std::setfill('0') << std::setw(6) << nanos
            << std::setfill(' ') << " ms";
}

Time::Time(Runtime& runtime, const char* name)
    : runtime_(runtime), name_(name) {
  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start_);
}

Time::~Time() {
  struct timespec finish;
  clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &finish);
  const auto seconds = finish.tv_sec - start_.tv_sec;
  const auto nanos = finish.tv_nsec - start_.tv_nsec;
  const Nanoseconds value(seconds * 1'000'000'000 + nanos);
  runtime_.PrintMetric(name_, value);
}

Counter::Counter(Runtime& runtime, const char* name)
    : runtime_(runtime), name_(name), value_(0) {
}

Counter::~Counter() {
  runtime_.PrintMetric(name_, value_);
}

Histogram::Histogram(Runtime& runtime, const char* name)
    : runtime_(runtime), name_(name) {
}

Histogram::~Histogram() {
  runtime_.PrintMetric(name_, frequencies_);
}

}  // namespace stg
