This repository has been archived on 2024-06-13. You can view files and clone it, but cannot push or open issues or pull requests.
nekohook/modules/source2013/sdk/public/tier1/utlmovingaverage.h
2020-08-04 13:13:01 -04:00

90 lines
2.2 KiB
C++

//========= Copyright Valve Corporation, All rights reserved. ============//
//
// Purpose: Simple moving average class
//
// $NoKeywords: $
//
//
//=============================================================================//
#ifndef MOVING_AVERAGE_H
#define MOVING_AVERAGE_H
#ifdef _WIN32
#pragma once
#endif
#include "tier0/basetypes.h"
#include "tier0/platform.h"
template <uint32 TBufferSize>
class CUtlMovingAverage {
public:
CUtlMovingAverage() : m_nValuesPushed(0), m_flTotal(0.0f) {}
void Reset() {
m_nValuesPushed = 0;
m_flTotal = 0.0f;
}
uint32 GetTotalValuesPushed() const { return m_nValuesPushed; }
float GetAverage() {
uint n = MIN(TBufferSize, m_nValuesPushed);
return n ? (m_flTotal / static_cast<double>(n)) : 0.0f;
}
void GetAverageAndAbsRange(float *pflOutAverage, float *pflOutAbsRange,
float *pflMinTime, float *pflMaxTime) {
if (m_nValuesPushed == 0) {
*pflOutAverage = 0;
*pflOutAbsRange = 0;
*pflMinTime = 0;
*pflMaxTime = 0;
return;
}
*pflOutAverage = GetAverage();
const int nNumValues = MIN(m_nValuesPushed, TBufferSize);
float flAbsRange = 0;
float flMinTime = 9e+9;
float flMaxTime = 0;
for (int i = 0; i < nNumValues; ++i) {
float flDif = (m_Buffer[i] - *pflOutAverage);
flAbsRange = MAX(flAbsRange, abs(flDif));
flMinTime = MIN(flMinTime, m_Buffer[i]);
flMaxTime = MAX(flMaxTime, m_Buffer[i]);
}
*pflOutAbsRange = flAbsRange;
*pflMinTime = flMinTime;
*pflMaxTime = flMaxTime;
}
void PushValue(float v) {
uint nIndex = m_nValuesPushed % TBufferSize;
if (m_nValuesPushed >= TBufferSize) {
m_flTotal = MAX(m_flTotal - m_Buffer[nIndex], 0.0f);
}
m_flTotal += v;
m_Buffer[nIndex] = v;
m_nValuesPushed++;
if (UINT_MAX == m_nValuesPushed) {
Reset();
}
}
private:
float m_Buffer[TBufferSize];
uint32 m_nValuesPushed;
double m_flTotal;
};
#endif // MOVING_AVERAGE_H