mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-09-19 12:06:07 +08:00
First version of the SOurce SDK 2013
This commit is contained in:
103
public/tier1/utlmovingaverage.h
Normal file
103
public/tier1/utlmovingaverage.h
Normal file
@ -0,0 +1,103 @@
|
||||
//========= 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/platform.h"
|
||||
#include "tier0/basetypes.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
|
Reference in New Issue
Block a user