1. package body Generic_Sliding_Statistics is 
  2.  
  3.    Buffer     : array (1 .. Buffer_Size) of Element; 
  4.    Buffer_Ix  : Positive range Buffer'Range     := Buffer'First; 
  5.    Fill_Level : Natural  range 0 .. Buffer'Last := 0; 
  6.  
  7.    package body Averages is 
  8.  
  9.       function Average (New_Reading : Element) return Element is 
  10.  
  11.       begin 
  12.          Add_Reading (New_Reading); 
  13.          return Average; 
  14.       end Average; 
  15.  
  16.       -- 
  17.  
  18.       function Average return Element is 
  19.  
  20.       begin 
  21.          if Fill_Level > 0 then 
  22.             declare 
  23.                Buffer_Sum : Element := Buffer (Buffer'First); 
  24.             begin 
  25.                for i in Buffer'First + 1 .. Fill_Level loop 
  26.                   Buffer_Sum := Buffer_Sum + Buffer (i); 
  27.                end loop; 
  28.  
  29.                return Buffer_Sum / Real (Fill_Level); 
  30.             end; 
  31.          else 
  32.             raise No_Elements_in_Stats_Buffer; 
  33.          end if; 
  34.       end Average; 
  35.  
  36.    end Averages; 
  37.  
  38.    -- 
  39.  
  40.    package body MinMax is 
  41.  
  42.       function Min (New_Reading : Element) return Element is 
  43.  
  44.       begin 
  45.          Add_Reading (New_Reading); 
  46.          return Min; 
  47.       end Min; 
  48.  
  49.       -- 
  50.  
  51.       function Max (New_Reading : Element) return Element is 
  52.  
  53.       begin 
  54.          Add_Reading (New_Reading); 
  55.          return Max; 
  56.       end Max; 
  57.  
  58.       -- 
  59.  
  60.       function Min return Element is 
  61.  
  62.       begin 
  63.          if Fill_Level > 0 then 
  64.             declare 
  65.                Min_Element : Element := Buffer (Buffer'First); 
  66.             begin 
  67.                for i in Buffer'First + 1 .. Fill_Level loop 
  68.                   if Buffer (i) < Min_Element then 
  69.                      Min_Element := Buffer (i); 
  70.                   end if; 
  71.                end loop; 
  72.  
  73.                return Min_Element; 
  74.             end; 
  75.          else 
  76.             raise No_Elements_in_Stats_Buffer; 
  77.          end if; 
  78.       end Min; 
  79.  
  80.       -- 
  81.  
  82.       function Max return Element is 
  83.  
  84.       begin 
  85.          if Fill_Level > 0 then 
  86.             declare 
  87.                Max_Element : Element := Buffer (Buffer'First); 
  88.             begin 
  89.                for i in Buffer'First + 1 .. Fill_Level loop 
  90.                   if Max_Element < Buffer (i) then 
  91.                      Max_Element := Buffer (i); 
  92.                   end if; 
  93.                end loop; 
  94.  
  95.                return Max_Element; 
  96.             end; 
  97.          else 
  98.             raise No_Elements_in_Stats_Buffer; 
  99.          end if; 
  100.       end Max; 
  101.  
  102.    end MinMax; 
  103.  
  104.    ----------------- 
  105.    -- Add_Reading -- 
  106.    ----------------- 
  107.  
  108.    procedure Add_Reading (New_Reading : Element) is 
  109.  
  110.    begin 
  111.       Buffer (Buffer_Ix) := New_Reading; 
  112.  
  113.       if Buffer_Ix = Buffer'Last then 
  114.          Buffer_Ix := Buffer'First; 
  115.       else 
  116.          Buffer_Ix := Buffer_Ix + 1; 
  117.       end if; 
  118.  
  119.       Fill_Level := Natural'Min (Fill_Level + 1, Buffer'Last); 
  120.    end Add_Reading; 
  121.  
  122. end Generic_Sliding_Statistics;