changeset 156:89f28a867a09

Imported stats.hpp from other branch. This includes moving average template class
author Giulio Moro <giuliomoro@yahoo.it>
date Wed, 07 Oct 2015 23:38:52 +0100
parents 13d25cbcde03
children f36313cbb55d
files include/stats.hpp
diffstat 1 files changed, 76 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/include/stats.hpp	Wed Oct 07 23:38:52 2015 +0100
@@ -0,0 +1,76 @@
+#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);
+    reset();
+  }
+public:
+  MovingAverage(){
+    init(0);
+  }
+  MovingAverage(int aLength){
+    init(aLength);
+  }
+  ~MovingAverage(){
+    dealloc();
+  }
+  int getLength(){
+    return bufferFull ? length : pointer;
+  }
+  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;
+  }
+  void reset(){
+	  pointer=0;
+	  bufferFull=false;
+  }
+};
+
+#endif /* STATS_HPP_INCLUDED */