//===-- Metric.cpp ----------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//

#include "Metric.h"
#include "MemoryGauge.h"
#include <cmath>

using namespace lldb_perf;

template <class T> Metric<T>::Metric() : Metric("") {}

template <class T>
Metric<T>::Metric(const char *n, const char *d)
    : m_name(n ? n : ""), m_description(d ? d : ""), m_dataset() {}

template <class T> void Metric<T>::Append(T v) { m_dataset.push_back(v); }

template <class T> size_t Metric<T>::GetCount() const {
  return m_dataset.size();
}

template <class T> T Metric<T>::GetSum() const {
  T sum = 0;
  for (auto v : m_dataset)
    sum += v;
  return sum;
}

template <class T> T Metric<T>::GetAverage() const {
  return GetSum() / GetCount();
}

// Knuth's algorithm for stddev - massive cancellation resistant
template <class T>
T Metric<T>::GetStandardDeviation(StandardDeviationMode mode) const {
  size_t n = 0;
  T mean = 0;
  T M2 = 0;
  for (auto x : m_dataset) {
    n = n + 1;
    T delta = x - mean;
    mean = mean + delta / n;
    M2 = M2 + delta * (x - mean);
  }
  T variance;
  if (mode == StandardDeviationMode::ePopulation || n == 1)
    variance = M2 / n;
  else
    variance = M2 / (n - 1);
  return sqrt(variance);
}

template class lldb_perf::Metric<double>;
template class lldb_perf::Metric<MemoryStats>;
