|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - download
Length: 9216 (0x2400) Types: Ada Source Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Set_Of_Links, seg_041652
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000 └─ ⟦5a81ac88f⟧ »Space Info Vol 1« └─⟦this⟧
with Binary_Trees_Pkg, Bounded_String, Text_Io; use Bounded_String; package body Set_Of_Links is Lower : constant Integer := -1; Equal : constant Integer := 0; Upper : constant Integer := 1; -- ---------------------------------------------------- -- Definition des fonctions pour le paquetage generique -- ---------------------------------------------------- function Compare (A, B : Link) return Integer is begin if Image (A.First) = Image (B.First) and Image (A.Second) = Image (B.Second) then return Equal; else if Image (A.First) < Image (B.First) then return Lower; else return Upper; end if; end if; end Compare; procedure Write (A : Link) is begin Text_Io.Put_Line ("First ->" & Image (A.First) & " / Second ->" & Image (A.Second) & " / State ->" & Lock'Image (A.State)); end Write; procedure Show is new Links_Tree.Visit (Write); -- --------------------------------------- -- Definition des fontions de Set_of_Links -- --------------------------------------- function Make_Link (First_Item, Second_Item : String; Link_State : Lock) return Link is Tmp_Link : Link; begin Bounded_String.Free (Tmp_Link.First); Bounded_String.Free (Tmp_Link.Second); if First_Item > Second_Item then Bounded_String.Copy (Tmp_Link.First, First_Item); Bounded_String.Copy (Tmp_Link.Second, Second_Item); else Bounded_String.Copy (Tmp_Link.First, Second_Item); Bounded_String.Copy (Tmp_Link.Second, First_Item); end if; Tmp_Link.State := Link_State; return Tmp_Link; end Make_Link; procedure Create (Set : in out Object) is begin Set.Root := Links_Tree.Create; end Create; procedure Destroy (Set : in out Object) is begin Links_Tree.Destroy (Set.Root); end Destroy; procedure Add_New (First_Item, Second_Item : String; Link_State : Lock; Set : in out Object) is Tmp_Link : Link; begin Tmp_Link := Make_Link (First_Item, Second_Item, Link_State); Links_Tree.Insert (Tmp_Link, Set.Root); exception when Links_Tree.Duplicate_Value => raise Duplicate_Value; end Add_New; procedure Modify_State (First_Item, Second_Item : String; Link_State : Lock; Set : in out Object) is Tmp_Link, Result_Link : Link; Result : Boolean; begin Tmp_Link := Make_Link (First_Item, Second_Item, Link_State); if Links_Tree.Is_Found (Tmp_Link, Set.Root) then Links_Tree.Replace_If_Found (Tmp_Link, Set.Root, Result, Result_Link); end if; end Modify_State; procedure Exchange (First_Item, Second_Item, Third_Item : String; Set : in out Object) is New_Link, Old_Link, Result_Link : Link; Result : Boolean; Set_Iter : Links_Tree.Iterator; begin Old_Link := Make_Link (First_Item, Second_Item, No_State); New_Link := Make_Link (First_Item, Third_Item, No_State); if Links_Tree.Is_Found (Old_Link, Set.Root) and Links_Tree.Is_Found (New_Link, Set.Root) then Set_Iter := Links_Tree.Make_Iter (Set.Root); while Links_Tree.More (Set_Iter) loop Links_Tree.Next (Set_Iter, Result_Link); exit when Compare (Result_Link, Old_Link) = Equal; end loop; if Result_Link.State = Unlinked then Old_Link := Make_Link (First_Item, Second_Item, Linked); New_Link := Make_Link (First_Item, Third_Item, Unlinked); else Old_Link := Make_Link (First_Item, Second_Item, Unlinked); New_Link := Make_Link (First_Item, Third_Item, Linked); end if; Links_Tree.Replace_If_Found (Old_Link, Set.Root, Result, Result_Link); Links_Tree.Replace_If_Found (New_Link, Set.Root, Result, Result_Link); end if; end Exchange; function Exist (First_Item, Second_Item : String; Set : Object) return Boolean is Tmp_Link : Link; begin Tmp_Link := Make_Link (First_Item, Second_Item, No_State); return Links_Tree.Is_Found (Tmp_Link, Set.Root); end Exist; procedure List (Item : String; Link_State : Lock; Set : Object) is Tmp_Link : Link; Set_Iter : Links_Tree.Iterator; begin Set_Iter := Links_Tree.Make_Iter (Set.Root); while Links_Tree.More (Set_Iter) loop Links_Tree.Next (Set_Iter, Tmp_Link); if (Image (Tmp_Link.First) = Item or Image (Tmp_Link.Second) = Item) and Tmp_Link.State = Link_State then if Image (Tmp_Link.First) = Item then Text_Io.Put_Line (Image (Tmp_Link.Second)); else Text_Io.Put_Line (Image (Tmp_Link.First)); end if; end if; end loop; end List; function What_State (First_Item, Second_Item : String; Set : Object) return Lock is Search_Link, Found_Link : Link; Set_Iter : Links_Tree.Iterator; begin Set_Iter := Links_Tree.Make_Iter (Set.Root); Search_Link := Make_Link (First_Item, Second_Item, No_State); while Links_Tree.More (Set_Iter) loop Links_Tree.Next (Set_Iter, Found_Link); if Compare (Found_Link, Search_Link) = Equal then return Found_Link.State; end if; end loop; return No_State; end What_State; procedure Dump (Set : Object) is begin Show (Set.Root, Links_Tree.Inorder); end Dump; end Set_Of_Links;
nblk1=8 nid=0 hdr6=10 [0x00] rec0=22 rec1=00 rec2=01 rec3=02e [0x01] rec0=1f rec1=00 rec2=02 rec3=00e [0x02] rec0=04 rec1=00 rec2=08 rec3=05c [0x03] rec0=1f rec1=00 rec2=03 rec3=008 [0x04] rec0=15 rec1=00 rec2=04 rec3=020 [0x05] rec0=1b rec1=00 rec2=05 rec3=050 [0x06] rec0=19 rec1=00 rec2=06 rec3=010 [0x07] rec0=0d rec1=00 rec2=07 rec3=000 tail 0x2153c33d0862257be158c 0x42a00088462060003