aboutsummaryrefslogtreecommitdiff
path: root/sp/src/public/tier1/utlmovingaverage.h
diff options
context:
space:
mode:
authorJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
committerJoe Ludwig <[email protected]>2013-06-26 15:22:04 -0700
commit39ed87570bdb2f86969d4be821c94b722dc71179 (patch)
treeabc53757f75f40c80278e87650ea92808274aa59 /sp/src/public/tier1/utlmovingaverage.h
downloadsource-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.tar.xz
source-sdk-2013-39ed87570bdb2f86969d4be821c94b722dc71179.zip
First version of the SOurce SDK 2013
Diffstat (limited to 'sp/src/public/tier1/utlmovingaverage.h')
-rw-r--r--sp/src/public/tier1/utlmovingaverage.h103
1 files changed, 103 insertions, 0 deletions
diff --git a/sp/src/public/tier1/utlmovingaverage.h b/sp/src/public/tier1/utlmovingaverage.h
new file mode 100644
index 00000000..997b07c9
--- /dev/null
+++ b/sp/src/public/tier1/utlmovingaverage.h
@@ -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