Newer
Older
TakayunAverage / TakayunAverage.h
@takayun takayun on 21 May 2016 1 KB Initial commit
#pragma once

#define TAKAYUN_AVERAGE_DEBUG__DISABLE

#include <iostream>
using namespace std;

template <typename T>
class TakayunAverage {
private:
  T sum, *buff, average;
  int buff_size, index;

  void initialize(int buff_size) {
    this->buff_size = buff_size;
    buff = new T[buff_size];
    for (int i = 0; i < buff_size; i++) buff[i] = 0;
    index = sum = average = 0;
  }

  T update_average(T data) {
#ifdef TAKAYUN_AVERAGE_DEBUG__ENABLE
    cout << "[TakayunAverage::update_average]: ";
    for (int i = 0; i < buff_size; i++) cout << buff[i] << " ";
    cout << endl;
#endif
    static T first;
    index++;
    if (!(index < buff_size)) index = 0;
    first = buff[index];
    buff[index] = data;
    sum = sum - first + data;
    average = sum / buff_size;
    return average;
  }

public:
  TakayunAverage(int buff_size) {
    initialize(buff_size);
  }
  TakayunAverage(int buff_size, T initial_value) {
    initialize(buff_size);
    for (int i = 0; i < buff_size; i++) update_average(initial_value);
  }
  ~TakayunAverage() {
    delete[] buff;
  }
  
  T get_average() {
    return average;
  }
  T get_average(T data) {
    return update_average(data);
  }
};