|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 12732 (0x31bc)
Types: TextFile
Names: »B«
└─⟦149519bd4⟧ Bits:30000546 8mm tape, Rational 1000, !projects 93-07-13
└─⟦124ff5788⟧ »DATA«
└─⟦this⟧
└─⟦f64eaa120⟧ Bits:30000752 8mm tape, Rational 1000, !projects 93 02 16
└─⟦6f12a12be⟧ »DATA«
└─⟦this⟧
with Class;
with Collection;
with Date;
with Instance;
with Unbounded_Array;
with Text_Io;
package body Class_Behavior is
package Unbounded_Collection is
new Unbounded_Array (Element => Instance.Reference,
Content => Collection.Object);
package Uc renames Unbounded_Collection;
type Cell_Element is
record
Cell : Element;
Free : Boolean := True;
Masked : Boolean := False;
With_Date : Date.Reference := 0;
end record;
type Element_Array is array (Positive range <>) of Cell_Element;
package Unbounded_Class_Behavior is
new Unbounded_Array (Element => Cell_Element, Content => Element_Array);
package Ucb renames Unbounded_Class_Behavior;
Elements : Unbounded_Class_Behavior.Object;
Local_Class : Class.Reference;
The_Visible_Collection : Uc.Object;
The_Complete_Collection : Uc.Object;
------------------------------------------------------------------------------
function Allocate (The_Element : Element) return Instance.Reference is
A_Reference : Instance.Reference (Kind => Local_Class);
An_Element : Cell_Element;
Found : Boolean := False;
A_Date : Date.Reference := 0;
An_Instance_Id : Natural;
begin
if With_Dates then
A_Date := Date.New_Date (With_Mode => With_Date_Mode);
end if;
for I in 1 .. Ucb.Length (Elements) loop
An_Element := Ucb.Get (In_Object => Elements, The_Item => I);
if An_Element.Free then
Found := True;
An_Instance_Id := I;
Ucb.Set (In_Object => Elements,
The_Item => I,
With_Element =>
Cell_Element'(The_Element, False, False, A_Date));
exit;
end if;
end loop;
if not Found then
Elements := Ucb."&"
(The_Object => Elements,
With_Element => Cell_Element'(The_Element, False,
False, A_Date));
An_Instance_Id := Ucb.Length (Elements);
end if;
Instance.Set (A_Reference, With_Value => An_Instance_Id);
The_Visible_Collection := Uc."&" (The_Visible_Collection, A_Reference);
The_Complete_Collection := Uc."&"
(The_Complete_Collection, A_Reference);
if With_Dates then
if Found then
Class.Change (In_Class => Local_Class,
The_Instance => An_Instance_Id,
With_Date => A_Date);
else
Class.Add (In_Class => Local_Class,
The_Instance => An_Instance_Id,
With_Date => A_Date);
end if;
end if;
return A_Reference;
end Allocate;
procedure Allocate (The_Element : Element) is
A_Reference : Instance.Reference;
begin
A_Reference := Allocate (The_Element);
end Allocate;
------------------------------------------------------------------------------
procedure Dispose (The_Reference : Instance.Reference) is
An_Element, Empty_Element : Cell_Element;
begin
if Instance.Isa (The_Reference) /= Local_Class then
raise Bad_Class;
elsif Instance.Value (The_Reference) < 1 or
Instance.Value (The_Reference) > Ucb.Length (Elements) then
raise Bad_Reference;
else
An_Element := Ucb.Get (In_Object => Elements,
The_Item => Instance.Value (The_Reference));
Ucb.Set (In_Object => Elements,
The_Item => Instance.Value (The_Reference),
With_Element => Empty_Element);
if not An_Element.Masked then
Uc.Remove (In_Object => The_Visible_Collection,
The_Element => The_Reference);
end if;
Uc.Remove (In_Object => The_Complete_Collection,
The_Element => The_Reference);
end if;
end Dispose;
------------------------------------------------------------------------------
procedure Clear is
An_Element : Cell_Element;
begin
Ucb.Free (The_Object => Elements);
Class.Init_Dates (The_Class => Local_Class);
Uc.Free (The_Visible_Collection);
Uc.Free (The_Complete_Collection);
end Clear;
------------------------------------------------------------------------------
procedure Mask (The_Reference : Instance.Reference) is
An_Element : Cell_Element;
begin
if Instance.Isa (The_Reference) /= Local_Class then
raise Bad_Class;
elsif Instance.Value (The_Reference) < 1 or
Instance.Value (The_Reference) > Ucb.Length (Elements) then
raise Bad_Reference;
else
An_Element := Ucb.Get (Elements, Instance.Value (The_Reference));
if not An_Element.Masked then
An_Element.Masked := True;
if With_Dates then
An_Element.With_Date := Date.New_Date
(With_Mode => With_Date_Mode);
Class.Change (In_Class => Local_Class,
The_Instance => Instance.Value
(The_Reference),
With_Date => An_Element.With_Date);
end if;
Ucb.Set (In_Object => Elements,
The_Item => Instance.Value (The_Reference),
With_Element => An_Element);
Uc.Remove (In_Object => The_Visible_Collection,
The_Element => The_Reference);
end if;
end if;
end Mask;
------------------------------------------------------------------------------
procedure Mask_All is
An_Element : Cell_Element;
begin
for I in 1 .. Ucb.Length (Elements) loop
An_Element := Ucb.Get (In_Object => Elements, The_Item => I);
if not An_Element.Masked then
An_Element.Masked := True;
if With_Dates then
An_Element.With_Date := Date.New_Date
(With_Mode => With_Date_Mode);
Class.Change (In_Class => Local_Class,
The_Instance => I,
With_Date => An_Element.With_Date);
end if;
Ucb.Set (In_Object => Elements,
The_Item => I,
With_Element => An_Element);
end if;
end loop;
Uc.Free (The_Visible_Collection);
end Mask_All;
------------------------------------------------------------------------------
procedure Unmask (The_Reference : Instance.Reference) is
An_Element : Cell_Element;
begin
if Instance.Isa (The_Reference) /= Local_Class then
raise Bad_Class;
elsif Instance.Value (The_Reference) < 1 or
Instance.Value (The_Reference) > Ucb.Length (Elements) then
raise Bad_Reference;
else
An_Element := Ucb.Get (In_Object => Elements,
The_Item => Instance.Value (The_Reference));
if An_Element.Masked then
An_Element.Masked := False;
if With_Dates then
An_Element.With_Date := Date.New_Date
(With_Mode => With_Date_Mode);
Class.Change (In_Class => Local_Class,
The_Instance => Instance.Value
(The_Reference),
With_Date => An_Element.With_Date);
end if;
Ucb.Set (In_Object => Elements,
The_Item => Instance.Value (The_Reference),
With_Element => An_Element);
The_Visible_Collection :=
Uc."&" (The_Object => The_Visible_Collection,
With_Element => The_Reference);
end if;
end if;
end Unmask;
------------------------------------------------------------------------------
procedure Unmask_All is
An_Element : Cell_Element;
begin
for I in 1 .. Ucb.Length (Elements) loop
An_Element := Ucb.Get (In_Object => Elements, The_Item => I);
if An_Element.Masked then
An_Element.Masked := False;
if With_Dates then
An_Element.With_Date := Date.New_Date
(With_Mode => With_Date_Mode);
Class.Change (In_Class => Local_Class,
The_Instance => I,
With_Date => An_Element.With_Date);
end if;
Ucb.Set (In_Object => Elements,
The_Item => I,
With_Element => An_Element);
end if;
end loop;
Uc.Free (The_Visible_Collection);
The_Visible_Collection := Uc.Dupplicate (The_Complete_Collection);
end Unmask_All;
------------------------------------------------------------------------------
function Instances return Collection.Object is
begin
return Uc.Get (The_Visible_Collection);
end Instances;
------------------------------------------------------------------------------
function All_Instances return Collection.Object is
begin
return Uc.Get (The_Complete_Collection);
end All_Instances;
------------------------------------------------------------------------------
function Cardinality return Natural is
begin
return Ucb.Length (Elements);
end Cardinality;
------------------------------------------------------------------------------
function Get (The_Reference : Instance.Reference) return Element is
An_Element : Cell_Element;
begin
if Instance.Isa (The_Reference) /= Local_Class then
raise Bad_Class;
elsif Instance.Value (The_Reference) < 1 or
Instance.Value (The_Reference) > Ucb.Length (Elements) then
raise Bad_Reference;
else
An_Element := Ucb.Get (In_Object => Elements,
The_Item => Instance.Value (The_Reference));
return An_Element.Cell;
end if;
end Get;
------------------------------------------------------------------------------
procedure Set (The_Reference : Instance.Reference; With_Value : Element) is
An_Element : Cell_Element;
begin
if Instance.Isa (The_Reference) /= Local_Class then
raise Bad_Class;
elsif Instance.Value (The_Reference) < 1 or
Instance.Value (The_Reference) > Ucb.Length (Elements) then
raise Bad_Reference;
else
An_Element := Ucb.Get (In_Object => Elements,
The_Item => Instance.Value (The_Reference));
An_Element.Cell := With_Value;
if With_Dates then
An_Element.With_Date := Date.New_Date
(With_Mode => With_Date_Mode);
Class.Change (In_Class => Local_Class,
The_Instance => Instance.Value (The_Reference),
With_Date => An_Element.With_Date);
end if;
Ucb.Set (In_Object => Elements,
The_Item => Instance.Value (The_Reference),
With_Element => An_Element);
end if;
end Set;
------------------------------------------------------------------------------
function Name return String is
begin
return With_Name;
end Name;
function Name (The_Reference : Instance.Reference) return String is
begin
return Reference_Name (The_Reference);
end Name;
------------------------------------------------------------------------------
begin
Local_Class := Class.Value (With_Name);
end Class_Behavior;