87 lines
2.7 KiB
Ada
87 lines
2.7 KiB
Ada
with Ada.Text_IO;
|
|
with Ada.Containers.Vectors;
|
|
|
|
procedure Range_Consolidation is
|
|
|
|
type Set_Type is record
|
|
Left, Right : Float;
|
|
end record;
|
|
|
|
package Set_Vectors is
|
|
new Ada.Containers.Vectors (Positive, Set_Type);
|
|
|
|
procedure Normalize (Set : in out Set_Vectors.Vector) is
|
|
|
|
function Less_Than (Left, Right : Set_Type) return Boolean is
|
|
begin Return Left.Left < Right.Left; end;
|
|
|
|
package Set_Sorting is
|
|
new Set_Vectors.Generic_Sorting (Less_Than);
|
|
begin
|
|
for Elem of Set loop
|
|
Elem := (Left => Float'Min (Elem.Left, Elem.Right),
|
|
Right => Float'Max (Elem.Left, Elem.Right));
|
|
end loop;
|
|
Set_Sorting.Sort (Set);
|
|
end Normalize;
|
|
|
|
procedure Consolidate (Set : in out Set_Vectors.Vector) is
|
|
use Set_Vectors;
|
|
First : Cursor := Set.First;
|
|
Last : Cursor := Next (First);
|
|
begin
|
|
while Last /= No_Element loop
|
|
if Element (First).Right < Element (Last).Left then -- non-overlap
|
|
First := Last;
|
|
Last := Next (Last);
|
|
elsif Element (First).Right >= Element (Last).Left then -- overlap
|
|
Replace_Element (Set, First, (Left => Element (First).Left,
|
|
Right => Float'Max (Element (First).Right,
|
|
Element (Last) .Right)));
|
|
Delete (Set, Last);
|
|
Last := Next (First);
|
|
end if;
|
|
end loop;
|
|
end Consolidate;
|
|
|
|
procedure Put (Set : in Set_Vectors.Vector) is
|
|
package Float_IO is
|
|
new Ada.Text_IO.Float_IO (Float);
|
|
begin
|
|
Float_IO.Default_Exp := 0;
|
|
Float_IO.Default_Aft := 1;
|
|
Float_IO.Default_Fore := 3;
|
|
for Elem of Set loop
|
|
Ada.Text_IO.Put ("(");
|
|
Float_IO.Put (Elem.Left);
|
|
Float_IO.Put (Elem.Right);
|
|
Ada.Text_IO.Put (") ");
|
|
end loop;
|
|
end Put;
|
|
|
|
procedure Show (Set : in out Set_Vectors.Vector) is
|
|
use Ada.Text_IO;
|
|
begin
|
|
Put (Set);
|
|
Normalize (Set);
|
|
Consolidate (Set);
|
|
Set_Col (70);
|
|
Put (Set);
|
|
New_Line;
|
|
end Show;
|
|
|
|
use Set_Vectors;
|
|
Set_0 : Set_Vectors.Vector := Empty_Vector;
|
|
Set_1 : Set_Vectors.Vector := Empty_Vector & (1.1, 2.2);
|
|
Set_2 : Set_Vectors.Vector := (6.1, 7.2) & (7.2, 8.3);
|
|
Set_3 : Set_Vectors.Vector := (4.0, 3.0) & (2.0, 1.0);
|
|
Set_4 : Set_Vectors.Vector := (4.0, 3.0) & (2.0, 1.0) & (-1.0, -2.0) & (3.9, 10.0);
|
|
Set_5 : Set_Vectors.Vector := (1.0, 3.0) & (-6.0, -1.0) & (-4.0, -5.0) & (8.0, 2.0) & (-6.0, -6.0);
|
|
begin
|
|
Show (Set_0);
|
|
Show (Set_1);
|
|
Show (Set_2);
|
|
Show (Set_3);
|
|
Show (Set_4);
|
|
Show (Set_5);
|
|
end Range_Consolidation;
|