Mercurial > hg > beaglert
view include/stats.hpp @ 137:aac018615930 ClockSync
MovingAverage now returns a meaningful value also when the buffer is not full
author | Giulio Moro <giuliomoro@yahoo.it> |
---|---|
date | Sun, 13 Sep 2015 21:31:37 +0100 |
parents | e77e2e712fbc |
children | 5edc6d0713ef |
line wrap: on
line source
#ifndef STATS_HPP_INCLUDED #define STATS_HPP_INCLUDED #include <stdlib.h> #include <stdio.h> #include <string.h> template<class TYPE> class MovingAverage{ private: TYPE* array; int length; bool bufferFull; int pointer; TYPE sum; double scale; double average; void dealloc(){ free(array); // delete array; } void init(int aLength){ length=aLength; scale=1.0/length; // array= new TYPE(length); // for some reason this causes memory corruption, so I am using malloc() instead... array=(TYPE*)malloc(sizeof(TYPE)*length); sum=0; if(array==NULL) printf("Error while allocating array\n"); memset(array, 0, sizeof(TYPE)*length); pointer=0; bufferFull=false; } public: MovingAverage(){ init(0); } MovingAverage(int aLength){ init(aLength); } ~MovingAverage(){ dealloc(); } int getLength(){ return length; } void setLength(int aLength){ dealloc(); init(aLength); } double add(TYPE newElement){ sum-=array[pointer]; array[pointer]=newElement; sum+=newElement; if(bufferFull==true){ average=sum*scale; } else{ average=sum/(double)(1+pointer); } pointer++; if(pointer==length){ pointer=0; bufferFull=true; } return average; } double getAverage(){ return average; } }; #endif /* STATS_HPP_INCLUDED */