aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/a-crbtgo.adb
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/ada/a-crbtgo.adb')
-rw-r--r--gcc/ada/a-crbtgo.adb308
1 files changed, 204 insertions, 104 deletions
diff --git a/gcc/ada/a-crbtgo.adb b/gcc/ada/a-crbtgo.adb
index 8dd62a5ce44..4720f8cbb48 100644
--- a/gcc/ada/a-crbtgo.adb
+++ b/gcc/ada/a-crbtgo.adb
@@ -7,7 +7,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 2004-2005 Free Software Foundation, Inc. --
+-- Copyright (C) 2004-2005, Free Software Foundation, Inc. --
-- --
-- This specification is derived from the Ada Reference Manual for use with --
-- GNAT. The copyright notice above, and the license provisions that follow --
@@ -49,91 +49,91 @@ package body Ada.Containers.Red_Black_Trees.Generic_Operations is
procedure Left_Rotate (Tree : in out Tree_Type; X : Node_Access);
procedure Right_Rotate (Tree : in out Tree_Type; Y : Node_Access);
- ---------------------
- -- Check_Invariant --
- ---------------------
-
- procedure Check_Invariant (Tree : Tree_Type) is
- Root : constant Node_Access := Tree.Root;
-
- function Check (Node : Node_Access) return Natural;
-
- -----------
- -- Check --
- -----------
-
- function Check (Node : Node_Access) return Natural is
- begin
- if Node = null then
- return 0;
- end if;
-
- if Color (Node) = Red then
- declare
- L : constant Node_Access := Left (Node);
- begin
- pragma Assert (L = null or else Color (L) = Black);
- null;
- end;
-
- declare
- R : constant Node_Access := Right (Node);
- begin
- pragma Assert (R = null or else Color (R) = Black);
- null;
- end;
-
- declare
- NL : constant Natural := Check (Left (Node));
- NR : constant Natural := Check (Right (Node));
- begin
- pragma Assert (NL = NR);
- return NL;
- end;
- end if;
-
- declare
- NL : constant Natural := Check (Left (Node));
- NR : constant Natural := Check (Right (Node));
- begin
- pragma Assert (NL = NR);
- return NL + 1;
- end;
- end Check;
-
- -- Start of processing for Check_Invariant
-
- begin
- if Root = null then
- pragma Assert (Tree.First = null);
- pragma Assert (Tree.Last = null);
- pragma Assert (Tree.Length = 0);
- null;
-
- else
- pragma Assert (Color (Root) = Black);
- pragma Assert (Tree.Length > 0);
- pragma Assert (Tree.Root /= null);
- pragma Assert (Tree.First /= null);
- pragma Assert (Tree.Last /= null);
- pragma Assert (Parent (Tree.Root) = null);
- pragma Assert ((Tree.Length > 1)
- or else (Tree.First = Tree.Last
- and Tree.First = Tree.Root));
- pragma Assert (Left (Tree.First) = null);
- pragma Assert (Right (Tree.Last) = null);
-
- declare
- L : constant Node_Access := Left (Root);
- R : constant Node_Access := Right (Root);
- NL : constant Natural := Check (L);
- NR : constant Natural := Check (R);
- begin
- pragma Assert (NL = NR);
- null;
- end;
- end if;
- end Check_Invariant;
+-- ---------------------
+-- -- Check_Invariant --
+-- ---------------------
+
+-- procedure Check_Invariant (Tree : Tree_Type) is
+-- Root : constant Node_Access := Tree.Root;
+--
+-- function Check (Node : Node_Access) return Natural;
+--
+-- -----------
+-- -- Check --
+-- -----------
+--
+-- function Check (Node : Node_Access) return Natural is
+-- begin
+-- if Node = null then
+-- return 0;
+-- end if;
+--
+-- if Color (Node) = Red then
+-- declare
+-- L : constant Node_Access := Left (Node);
+-- begin
+-- pragma Assert (L = null or else Color (L) = Black);
+-- null;
+-- end;
+--
+-- declare
+-- R : constant Node_Access := Right (Node);
+-- begin
+-- pragma Assert (R = null or else Color (R) = Black);
+-- null;
+-- end;
+--
+-- declare
+-- NL : constant Natural := Check (Left (Node));
+-- NR : constant Natural := Check (Right (Node));
+-- begin
+-- pragma Assert (NL = NR);
+-- return NL;
+-- end;
+-- end if;
+--
+-- declare
+-- NL : constant Natural := Check (Left (Node));
+-- NR : constant Natural := Check (Right (Node));
+-- begin
+-- pragma Assert (NL = NR);
+-- return NL + 1;
+-- end;
+-- end Check;
+--
+-- -- Start of processing for Check_Invariant
+--
+-- begin
+-- if Root = null then
+-- pragma Assert (Tree.First = null);
+-- pragma Assert (Tree.Last = null);
+-- pragma Assert (Tree.Length = 0);
+-- null;
+--
+-- else
+-- pragma Assert (Color (Root) = Black);
+-- pragma Assert (Tree.Length > 0);
+-- pragma Assert (Tree.Root /= null);
+-- pragma Assert (Tree.First /= null);
+-- pragma Assert (Tree.Last /= null);
+-- pragma Assert (Parent (Tree.Root) = null);
+-- pragma Assert ((Tree.Length > 1)
+-- or else (Tree.First = Tree.Last
+-- and Tree.First = Tree.Root));
+-- pragma Assert (Left (Tree.First) = null);
+-- pragma Assert (Right (Tree.Last) = null);
+--
+-- declare
+-- L : constant Node_Access := Left (Root);
+-- R : constant Node_Access := Right (Root);
+-- NL : constant Natural := Check (L);
+-- NR : constant Natural := Check (R);
+-- begin
+-- pragma Assert (NL = NR);
+-- null;
+-- end;
+-- end if;
+-- end Check_Invariant;
------------------
-- Delete_Fixup --
@@ -249,22 +249,22 @@ package body Ada.Containers.Red_Black_Trees.Generic_Operations is
raise Program_Error;
end if;
- pragma Assert (Tree.Length > 0);
- pragma Assert (Tree.Root /= null);
- pragma Assert (Tree.First /= null);
- pragma Assert (Tree.Last /= null);
- pragma Assert (Parent (Tree.Root) = null);
- pragma Assert ((Tree.Length > 1)
- or else (Tree.First = Tree.Last
- and then Tree.First = Tree.Root));
- pragma Assert ((Left (Node) = null)
- or else (Parent (Left (Node)) = Node));
- pragma Assert ((Right (Node) = null)
- or else (Parent (Right (Node)) = Node));
- pragma Assert (((Parent (Node) = null) and then (Tree.Root = Node))
- or else ((Parent (Node) /= null) and then
- ((Left (Parent (Node)) = Node)
- or else (Right (Parent (Node)) = Node))));
+-- pragma Assert (Tree.Length > 0);
+-- pragma Assert (Tree.Root /= null);
+-- pragma Assert (Tree.First /= null);
+-- pragma Assert (Tree.Last /= null);
+-- pragma Assert (Parent (Tree.Root) = null);
+-- pragma Assert ((Tree.Length > 1)
+-- or else (Tree.First = Tree.Last
+-- and then Tree.First = Tree.Root));
+-- pragma Assert ((Left (Node) = null)
+-- or else (Parent (Left (Node)) = Node));
+-- pragma Assert ((Right (Node) = null)
+-- or else (Parent (Right (Node)) = Node));
+-- pragma Assert (((Parent (Node) = null) and then (Tree.Root = Node))
+-- or else ((Parent (Node) /= null) and then
+-- ((Left (Parent (Node)) = Node)
+-- or else (Right (Parent (Node)) = Node))));
if Left (Z) = null then
if Right (Z) = null then
@@ -545,7 +545,6 @@ package body Ada.Containers.Red_Black_Trees.Generic_Operations is
P, X : Node_Access;
begin
-
if Right (Source_Root) /= null then
Set_Right
(Node => Target_Root,
@@ -586,7 +585,6 @@ package body Ada.Containers.Red_Black_Trees.Generic_Operations is
when others =>
Delete_Tree (Target_Root);
raise;
-
end Generic_Copy_Tree;
-------------------------
@@ -1049,4 +1047,106 @@ package body Ada.Containers.Red_Black_Trees.Generic_Operations is
Set_Parent (Y, X);
end Right_Rotate;
+ ---------
+ -- Vet --
+ ---------
+
+ function Vet (Tree : Tree_Type; Node : Node_Access) return Boolean is
+ begin
+ if Node = null then
+ return True;
+ end if;
+
+ if Parent (Node) = Node
+ or else Left (Node) = Node
+ or else Right (Node) = Node
+ then
+ return False;
+ end if;
+
+ if Tree.Length = 0
+ or else Tree.Root = null
+ or else Tree.First = null
+ or else Tree.Last = null
+ then
+ return False;
+ end if;
+
+ if Parent (Tree.Root) /= null then
+ return False;
+ end if;
+
+ if Left (Tree.First) /= null then
+ return False;
+ end if;
+
+ if Right (Tree.Last) /= null then
+ return False;
+ end if;
+
+ if Tree.Length = 1 then
+ if Tree.First /= Tree.Last
+ or else Tree.First /= Tree.Root
+ then
+ return False;
+ end if;
+
+ if Node /= Tree.First then
+ return False;
+ end if;
+
+ if Parent (Node) /= null
+ or else Left (Node) /= null
+ or else Right (Node) /= null
+ then
+ return False;
+ end if;
+
+ return True;
+ end if;
+
+ if Tree.First = Tree.Last then
+ return False;
+ end if;
+
+ if Tree.Length = 2 then
+ if Tree.First /= Tree.Root
+ and then Tree.Last /= Tree.Root
+ then
+ return False;
+ end if;
+
+ if Tree.First /= Node
+ and then Tree.Last /= Node
+ then
+ return False;
+ end if;
+ end if;
+
+ if Left (Node) /= null
+ and then Parent (Left (Node)) /= Node
+ then
+ return False;
+ end if;
+
+ if Right (Node) /= null
+ and then Parent (Right (Node)) /= Node
+ then
+ return False;
+ end if;
+
+ if Parent (Node) = null then
+ if Tree.Root /= Node then
+ return False;
+ end if;
+
+ elsif Left (Parent (Node)) /= Node
+ and then Right (Parent (Node)) /= Node
+ then
+ return False;
+ end if;
+
+ return True;
+ end Vet;
+
end Ada.Containers.Red_Black_Trees.Generic_Operations;