package body Generator_Of_Stat_Keys_And_Stat_Values is


    procedure Generate (Vector : in out Vector_Type) is
        Temp_Key : Key_Type;
        Temp_Val : Value_Type;
    begin
        for I in Vector'Range loop
            Vector (I).Key := Key_Type (I);
            Vector (I).Val := Value_Type (I);
        end loop;
        for I in reverse Vector'Range loop
            if I mod 3 /= 0 then
                Assign (Temp_Key, Vector (Vector'First).Key);
                Assign (Vector (Vector'First).Key, Vector (I).Key);
                Assign (Vector (I).Key, Temp_Key);
                Assign (Temp_Val, Vector (Vector'First).Val);
                Assign (Vector (Vector'First).Val, Vector (I).Val);
                Assign (Vector (I).Val, Temp_Val);
            end if;
        end loop;
    end Generate;

    procedure Generate2 (Vector : in out Vector_Type) is
        Temp_Key : Key_Type;
        Temp_Val : Value_Type;
    begin
        for I in Vector'Range loop
            Vector (I).Key := Key_Type (I + Vector'Last);
            Vector (I).Val := Value_Type (I + Vector'Last);
        end loop;
        for I in reverse Vector'Range loop
            if I mod 3 /= 0 then
                Assign (Temp_Key, Vector (Vector'First).Key);
                Assign (Vector (Vector'First).Key, Vector (I).Key);
                Assign (Vector (I).Key, Temp_Key);
                Assign (Temp_Val, Vector (Vector'First).Val);
                Assign (Vector (Vector'First).Val, Vector (I).Val);
                Assign (Vector (I).Val, Temp_Val);
            end if;
        end loop;
    end Generate2;

    procedure Generate_Ascending (Vector : in out Vector_Type) is
    begin
        for I in Vector'Range loop
            Vector (I).Key := Key_Type (I);
            Vector (I).Val := Value_Type (I);
        end loop;
    end Generate_Ascending;

    procedure Generate_Descending (Vector : in out Vector_Type) is
    begin
        for I in Vector'Range loop
            Vector (I).Key := Key_Type (Vector'Last - I + Vector'First);
            Vector (I).Val := Value_Type (Vector'Last - I + Vector'First);
        end loop;
    end Generate_Descending;

    procedure Assign (Dest : in out Key_Type; Source : in Key_Type) is
    begin
        Dest := Source;
    end Assign;

    procedure Assign (Dest : in out Value_Type; Source : in Value_Type) is
    begin
        Dest := Source;
    end Assign;


    function Less (Left, Right : Key_Type) return Boolean is
    begin
        return Integer (Left) < Integer (Right);
    end Less;

end Generator_Of_Stat_Keys_And_Stat_Values;