Overte C++ Documentation
TimeWeightedAvg.h
1 //
2 // TimeWeightedAvg.h
3 // libraries/shared/src
4 //
5 // Created by Yixin Wang on 7/29/2014
6 // Copyright 2013 High Fidelity, Inc.
7 //
8 // Distributed under the Apache License, Version 2.0.
9 // See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
10 //
11 
12 #ifndef hifi_TimeWeightedAvg_h
13 #define hifi_TimeWeightedAvg_h
14 
15 #include "SharedUtil.h"
16 
17 template <typename T>
18 class TimeWeightedAvg {
19 
20 public:
21 
22  TimeWeightedAvg()
23  : _firstSampleTime(0),
24  _lastSample(),
25  _lastSampleTime(0),
26  _weightedSampleSumExcludingLastSample(0.0)
27  {}
28 
29  void reset() {
30  _firstSampleTime = 0;
31  _lastSampleTime = 0;
32  _weightedSampleSumExcludingLastSample = 0.0;
33  }
34 
35  void updateWithSample(T sample) {
36  quint64 now = usecTimestampNow();
37 
38  if (_firstSampleTime == 0) {
39  _firstSampleTime = now;
40  } else {
41  _weightedSampleSumExcludingLastSample = getWeightedSampleSum(now);
42  }
43 
44  _lastSample = sample;
45  _lastSampleTime = now;
46  }
47 
48  double getAverage() const {
49  if (_firstSampleTime == 0) {
50  return 0.0;
51  }
52  quint64 now = usecTimestampNow();
53  quint64 elapsed = now - _firstSampleTime;
54  return getWeightedSampleSum(now) / (double)elapsed;
55  }
56 
57  quint64 getElapsedUsecs() const {
58  if (_firstSampleTime == 0) {
59  return 0;
60  }
61  return usecTimestampNow() - _firstSampleTime;
62  }
63 
64 private:
65  // if no sample has been collected yet, the return value is undefined
66  double getWeightedSampleSum(quint64 now) const {
67  quint64 lastSampleLasted = now - _lastSampleTime;
68  return _weightedSampleSumExcludingLastSample + (double)_lastSample * (double)lastSampleLasted;
69  }
70 
71 private:
72  quint64 _firstSampleTime;
73 
74  T _lastSample;
75  quint64 _lastSampleTime;
76 
77  double _weightedSampleSumExcludingLastSample;
78 };
79 
80 #endif // hifi_TimeWeightedAvg_h