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

#ifndef __PerfTestDriver__MemoryGauge__
#define __PerfTestDriver__MemoryGauge__

#include "Gauge.h"
#include "Results.h"

#include <mach/task_info.h>

namespace lldb_perf {

class MemoryStats {
public:
  MemoryStats(mach_vm_size_t virtual_size = 0, mach_vm_size_t resident_size = 0,
              mach_vm_size_t max_resident_size = 0);
  MemoryStats(const MemoryStats &rhs);

  MemoryStats &operator=(const MemoryStats &rhs);

  MemoryStats &operator+=(const MemoryStats &rhs);

  MemoryStats operator-(const MemoryStats &rhs);

  MemoryStats operator+(const MemoryStats &rhs);

  MemoryStats operator/(size_t rhs);

  MemoryStats operator*(const MemoryStats &rhs);

  mach_vm_size_t GetVirtualSize() const { return m_virtual_size; }

  mach_vm_size_t GetResidentSize() const { return m_resident_size; }

  mach_vm_size_t GetMaxResidentSize() const { return m_max_resident_size; }

  void SetVirtualSize(mach_vm_size_t vs) { m_virtual_size = vs; }

  void SetResidentSize(mach_vm_size_t rs) { m_resident_size = rs; }

  void SetMaxResidentSize(mach_vm_size_t mrs) { m_max_resident_size = mrs; }

  Results::ResultSP GetResult(const char *name, const char *description) const;

private:
  mach_vm_size_t m_virtual_size;
  mach_vm_size_t m_resident_size;
  mach_vm_size_t m_max_resident_size;
};

class MemoryGauge : public Gauge<MemoryStats> {
public:
  MemoryGauge();

  virtual ~MemoryGauge() {}

  void Start();

  ValueType Stop();

  virtual ValueType GetStartValue() const { return m_start; }

  virtual ValueType GetStopValue() const { return m_stop; }

  virtual ValueType GetDeltaValue() const;

private:
  enum class State { eNeverUsed, eCounting, eStopped };

  ValueType Now();

  State m_state;
  ValueType m_start;
  ValueType m_stop;
  ValueType m_delta;
};

template <>
Results::ResultSP GetResult(const char *description, MemoryStats value);

} // namespace lldb_perf

lldb_perf::MemoryStats sqrt(const lldb_perf::MemoryStats &arg);

#endif // #ifndef __PerfTestDriver__MemoryGauge__
