My Project
 All Classes Files Functions Variables Enumerations Enumerator Friends Macros Pages
MovingAverage.h
1 #ifndef GCP_UTIL_MOVING_AVERAGE_H
2 #define GCP_UTIL_MOVING_AVERAGE_H
3 
4 #include <deque>
5 #include "gcp/util/common/Exception.h"
6 
7 namespace gcp {
8  namespace util {
9 
10  template<typename T>
11  class MovingAverage {
12  public:
13  MovingAverage(unsigned int numSamples);
14  MovingAverage();
15  bool valid() {return (samples_.size() == numSamples_);};
16  void addSample(T sample);
17  operator T() {
18  if(samples_.size()) {
19  return total_ / samples_.size();
20  } else {
21  return 0;
22  }
23  };
24  void reset();
25  void setNumSamples(unsigned int numSamples);
26  private:
27  MovingAverage(const MovingAverage<T>& rhs); // don't allow copy
28  void operator=(const MovingAverage<T>& rhs); // don't allow assignment
29  std::deque<T> samples_;
30  T total_;
31  unsigned int numSamples_;
32  }; // End class MovingAverage
33 
34  template<typename T>
35  MovingAverage<T>::MovingAverage(unsigned int numSamples) : numSamples_(numSamples), total_(0) {};
36 
37  template<typename T>
38  MovingAverage<T>::MovingAverage() : numSamples_(1), total_(0) {};
39 
40  template<typename T>
41  void MovingAverage<T>::addSample(T sample) {
42  total_ += sample;
43  samples_.push_back(sample);
44  while(samples_.size() > numSamples_)
45  {
46  total_ -= samples_.front();
47  samples_.pop_front();
48  }
49  }
50 
51  template<typename T>
52  void MovingAverage<T>::reset() {
53  samples_.clear();
54  total_ = 0;
55  }
56 
57  template<typename T>
58  void MovingAverage<T>::setNumSamples(unsigned int numSamples) {
59  numSamples_ = numSamples;
60  }
61 
62  } // End namespace util
63 } // End namespace gcp
64 
65 #endif // End #ifndef GCP_UTIL_MOVING_AVERAGE_H
Definition: MovingAverage.h:11