#include <stdint.h>
#include <iostream>
#define BUF_SIZE 16 //размер буфера - должен быть стпенью двойки
#define BUF_MASK (BUF_SIZE-1)
using namespace std;
 
const uint8_t sum_of_numbers[] = {0,1,3,6,10,15,21,28,36,45,55}; 
const uint16_t sum_of_squares[] = {0,1,5,14,30,55,91,140,204,285,385}; 

class Data_Buffer{
  public:
  uint8_t count=0;
 
  
  void reset() {
     count =0;
     idxIN = 0;
     idxOUT = 0;
  }
  
  void put(const int val) {
     buffer[idxIN++] = val;
     idxIN &= BUF_MASK;
     if (count < BUF_MASK) count++;
  }
  
  int get() {
     if ( ! count) return -9999;
     idxOUT = idxIN - 1;
     idxOUT &= BUF_MASK;
     return  buffer[idxOUT];
  }
  
  int average(uint8_t norm) {
     long sum =0;
	 if (norm >= count) norm = count;
	 if ( ! norm) return -9999;
	 
	 idxOUT = idxIN - 1;
	 idxOUT &= BUF_MASK;
	 for (int i =0; i<norm; i++)  {
	      sum += buffer[idxOUT--];
		  idxOUT &= BUF_MASK;
		  }
	 return sum/norm;
	  
	} 
  
   int trend(uint8_t norm) {
     long sum =0;
	 if (norm > count) norm = count;
	 if (norm > 10) norm = 10;
	 if ( norm <4 ) return -9999;
	 
	 idxOUT = idxIN - 1;
	 idxOUT &= BUF_MASK;
         for (int i = norm-1; i>0; i--) {
	   sum += buffer[idxOUT--] * i;
           idxOUT &= BUF_MASK;
	  }
     return ((sum - sum_of_numbers[norm-1] * buffer[idxOUT])) / sum_of_squares[norm-1];
	 }
 
  Data_Buffer() {
   reset();
   }
  
  private:
  uint16_t buffer [BUF_SIZE];
  uint8_t idxIN, idxOUT;
  };
 
 int main() {
	auto buf = Data_Buffer();	
	buf.put(5);
	buf.put(6);
	buf.put(7);
	buf.put(0);
	std::cout << buf.trend(4) << std::endl;
 }
 
  