#pragma once #include "base/base.hpp" #include #include namespace base { template class NoopStats { public: NoopStats() {} void operator() (T const &) {} std::string GetStatsStr() const { return ""; } }; template class AverageStats { public: AverageStats() : m_Count(0), m_Sum(0) {} void operator() (T const & x) { ++m_Count; m_Sum += x; } std::string GetStatsStr() const { std::ostringstream out; out << "N: " << m_Count; if (m_Count > 0) out << " Av: " << m_Sum / m_Count; return out.str(); } double GetAverage() const { return m_Count ? m_Sum / m_Count : 0.0; } uint32_t GetCount() const { return m_Count; } private: uint32_t m_Count; double m_Sum; }; } // namespace base