|
|
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 - metrics - download
Length: 8192 (0x2000)
Types: Ada Source
Notes: 03_class, FILE, R1k_Segment, e3_tag, package body Set_Of_Links, seg_044dec, seg_0464cd
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦5a81ac88f⟧ »Space Info Vol 1«
└─⟦this⟧
└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
└─⟦cfc2e13cd⟧ »Space Info Vol 2«
└─⟦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=7
nid=0
hdr6=e
[0x00] rec0=22 rec1=00 rec2=01 rec3=02e
[0x01] rec0=1f rec1=00 rec2=02 rec3=00e
[0x02] rec0=20 rec1=00 rec2=03 rec3=022
[0x03] rec0=16 rec1=00 rec2=04 rec3=07c
[0x04] rec0=1b rec1=00 rec2=05 rec3=046
[0x05] rec0=19 rec1=00 rec2=06 rec3=00e
[0x06] rec0=0f rec1=00 rec2=07 rec3=001
tail 0x217440b6086356d44f60b 0x42a00088462060003