Go to the documentation of this file.00001 #ifndef QRK_MOVING_AVERAGE_H
00002 #define QRK_MOVING_AVERAGE_H
00003
00013 #include <deque>
00014
00015
00016 namespace qrk
00017 {
00018
00024 template <class T>
00025 class MovingAverage
00026 {
00027 public:
00033 MovingAverage(size_t size, T initial_value = 0)
00034 : buffer_size_(size), total_(0)
00035 {
00036 if (buffer_size_ == 0) {
00037 buffer_size_ = 1;
00038 }
00039 buffer_set(buffer_size_, initial_value);
00040 }
00041
00042
00048 void setAverageValue(T value)
00049 {
00050 buffer_set(buffer_size_, value);
00051 }
00052
00053
00059 T average(void)
00060 {
00061 return average_;
00062 }
00063
00064
00072 T push_back(T value)
00073 {
00074 total_ -= buffer_.front();
00075 buffer_.pop_front();
00076 total_ += value;
00077 buffer_.push_back(value);
00078
00079 average_ = total_ / buffer_size_;
00080
00081 return average_;
00082 }
00083
00084 private:
00085 MovingAverage(const MovingAverage& rhs);
00086 MovingAverage& operator = (const MovingAverage& rhs);
00087
00088 std::deque<T> buffer_;
00089 long buffer_size_;
00090 T average_;
00091 T total_;
00092
00093
00094 void buffer_set(size_t size, T value)
00095 {
00096 buffer_.assign(size, value);
00097 average_ = value;
00098 total_ = average_ * size;
00099 }
00100 };
00101 }
00102
00103 #endif