#ifndef MOVINGAVERAGETS_H #define MOVINGAVERAGETS_H #include #include "../data/Timestamp.h" #include template class MovingAverageTS { private: /** timestamp -> value combination */ struct Entry { Timestamp ts; T value; Entry(const Timestamp ts, const T& value) : ts(ts), value(value) {;} }; /** the regional window to use */ Timestamp window; /** the value history for the window-size */ std::vector history; /** current sum */ T sum; public: /** ctor with the window-size to use */ MovingAverageTS(const Timestamp window, const T zeroElement) : window(window), sum(zeroElement) { } /** add a new entry */ void add(const Timestamp ts, const T& data) { // append to history history.push_back(Entry(ts, data)); // adjust sum sum += data; // remove too-old history entries const Timestamp oldest = ts - window; while(history.front().ts < oldest) { // adjust sum sum -= history.front().value; // remove from history history.erase(history.begin()); } } /** get the current average */ T get() const { return sum / history.size(); } }; #endif // MOVINGAVERAGETS_H