All Classes Namespaces Files Functions Variables Enumerations Enumerator
libs/common/MovingAverage.h
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 /* !QRK_MOVING_AVERAGE_H */