#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); } };