00001 #ifndef ROLLINGBUFFER_HPP
00002 #define ROLLINGBUFFER_HPP
00003
00004 #include "base.hpp"
00005 #include "stats.hpp"
00006 #include "xmltraversal.h"
00007
00008 class UTILITYSHARED_EXPORT RollingBuffer
00009 {
00010 int Width;
00011
00012 QList<double> buffer;
00013
00014 bool changed;
00015 StatisticsThresholdSet stats;
00016
00017 public:
00018 RollingBuffer( int w = 8) : Width(w){}
00019 RollingBuffer(const RollingBuffer &r) :
00020 Width(r.Width),buffer(r.buffer),
00021 changed(r.changed),stats(r.stats){}
00022
00023 void clearBuffer()
00024 {
00025 stats.clear();
00026 buffer.clear();
00027 };
00028
00029 int getWidth() const { return Width;}
00030
00031 void setWidth(int w)
00032 {
00033 if(w > 0)
00034 {
00035 Width = w;
00036 if(buffer.count() > w)
00037 {
00038 while(buffer.count() > w) buffer.pop_front();
00039 changed = true;
00040 }
00041 }
00042 }
00043
00044 StatisticsThresholdSet & readStatistics() { return stats;}
00045 StatisticsThresholdSet & getStatistics()
00046 {
00047 if(changed)
00048 {
00049
00050 stats.clear();
00051 for(int i = 0; i < buffer.count(); i++)
00052 {
00053 stats.setValue(buffer.value(i));
00054 };
00055 };
00056 changed = false;
00057 return stats;
00058 };
00059
00060 XMLTraversal & toXML(XMLTraversal &x)
00061 {
00062 getStatistics();
00063 return stats.toXML(x);
00064 };
00065
00066 XMLTraversal & fromXML(XMLTraversal &x)
00067 {
00068 return stats.fromXML(x);
00069 };
00070
00071 void addValue(double v)
00072 {
00073 changed = true;
00074 buffer.push_back(v);
00075 if(buffer.count() > Width)
00076 {
00077 while(buffer.count() > Width) buffer.pop_front();
00078 };
00079 };
00080 friend QDataStream & operator >> (QDataStream &is, RollingBuffer &r);
00081 friend QDataStream & operator << (QDataStream &os, const RollingBuffer &r);
00082 };
00083 inline QDataStream & operator >> (QDataStream &is, RollingBuffer &r)
00084 {
00085 int w;
00086 is >> w;
00087 r.setWidth(w);
00088 r.buffer.clear();
00089 is >> r.buffer;
00090 r.changed = true;
00091 return is;
00092 };
00093 inline QDataStream & operator << (QDataStream &os, const RollingBuffer &r)
00094 {
00095 os << r.getWidth();
00096 os << r.buffer;
00097 return os;
00098 };
00099 #endif