// // TimeWeightedAvg.h // libraries/shared/src // // Created by Yixin Wang on 7/29/2014 // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html // #ifndef hifi_TimeWeightedAvg_h #define hifi_TimeWeightedAvg_h #include "SharedUtil.h" template class TimeWeightedAvg { public: TimeWeightedAvg() : _firstSampleTime(0), _lastSample(), _lastSampleTime(0), _weightedSampleSumExcludingLastSample(0.0) {} void reset() { _firstSampleTime = 0; _lastSampleTime = 0; _weightedSampleSumExcludingLastSample = 0.0; } void updateWithSample(T sample) { quint64 now = usecTimestampNow(); if (_firstSampleTime == 0) { _firstSampleTime = now; } else { _weightedSampleSumExcludingLastSample = getWeightedSampleSum(now); } _lastSample = sample; _lastSampleTime = now; } double getAverage() const { if (_firstSampleTime == 0) { return 0.0; } quint64 now = usecTimestampNow(); quint64 elapsed = now - _firstSampleTime; return getWeightedSampleSum(now) / (double)elapsed; } quint64 getElapsedUsecs() const { if (_firstSampleTime == 0) { return 0; } return usecTimestampNow() - _firstSampleTime; } private: // if no sample has been collected yet, the return value is undefined double getWeightedSampleSum(quint64 now) const { quint64 lastSampleLasted = now - _lastSampleTime; return _weightedSampleSumExcludingLastSample + (double)_lastSample * (double)lastSampleLasted; } private: quint64 _firstSampleTime; T _lastSample; quint64 _lastSampleTime; double _weightedSampleSumExcludingLastSample; }; #endif // hifi_TimeWeightedAvg_h