DataMuseum.dk

Presents historical artifacts from the history of:

Rational R1000/400

This is an automatic "excavation" of a thematic subset of
artifacts from Datamuseum.dk's BitArchive.

See our Wiki for more about Rational R1000/400

Excavated with: AutoArchaeologist - Free & Open Source Software.


top - download

⟦6d6000e0d⟧ Ada Source

    Length: 39936 (0x9c00)
    Types: Ada Source
    Notes: 03_class, FILE, R1k_Segment, e3_tag, generic, package body Object_Sets, seg_0045b3

Derivation

└─⟦8527c1e9b⟧ Bits:30000544 8mm tape, Rational 1000, Arrival backup of disks in PAM's R1000
    └─ ⟦cfc2e13cd⟧ »Space Info Vol 2« 
        └─⟦this⟧ 

E3 Source Code



with Object_Info;
package body Object_Sets is

    function "+" (This_Set : in Set; That_Set : in Set) return Set
        renames Union;

    function Empty_Set return Set is
    begin
        return Directory_Tools.Object.Create;
    end Empty_Set;

    function Is_Empty (This_Set : in Set) return Boolean is
    begin
        return Object_Info.Any.Is_Empty (This_Set);
    end Is_Empty;

    function Number_In (This_Set : in Set) return Natural is
    begin  
        return Object_Info.Any.Number_In (This_Set);
    end Number_In;

    function Are_Equal (This_Set : in Set; That_Set : in Set) return Boolean is

        Working_Set : Set := This_Set;

    begin
        Directory_Tools.Object.Reset (Working_Set);
        while not Directory_Tools.Object.Done (Working_Set) loop
            if not Is_Member (That_Set,
                              Directory_Tools.Object.Value (Working_Set)) then
                -- Found element in one set which isn't in other set.
                Directory_Tools.Object.Reset (Working_Set);
                return True;
            end if;
            Directory_Tools.Object.Next (Working_Set);
        end loop;
        Directory_Tools.Object.Reset (Working_Set);
        return False;

    exception
        when others =>
            Directory_Tools.Object.Reset (Working_Set);
            return False;

    end Are_Equal;

    function Copy_Of (This_Set : in Set) return Set is

        Working_Set : Set := This_Set;
        Copy_Set    : Set := Empty_Set;

    begin
        Directory_Tools.Object.Reset (Working_Set);  
        while not Directory_Tools.Object.Done (Working_Set) loop
            Add (Directory_Tools.Object.Value (Working_Set), Copy_Set);
            Directory_Tools.Object.Next (Working_Set);
        end loop;
        Directory_Tools.Object.Reset (Working_Set);  
        return Copy_Set;
    end Copy_Of;

    function Is_Member
                (This_Set : in Set; This_Element : in Element) return Boolean is
    begin
        return Directory_Tools.Object.Has (This_Set, This_Element);
    end Is_Member;

    procedure Add (This_Element : in Element; This_Set : in out Set) is

        Dummy : Boolean;

    begin
        if Object_Info.Any.Is_Good (This_Element) and then
           not Is_Member (This_Set, This_Element) then
            if Directory_Tools.Object.Is_Nil (This_Set) then
                This_Set := Directory_Tools.Object.Create;
            end if;
            Directory_Tools.Object.Add (This_Set, This_Element, Dummy);
        end if;
    end Add;

    procedure Remove (This_Element : in Element; This_Set : in out Set) is

        Dummy : Boolean;

    begin
        Directory_Tools.Object.Remove (This_Set, This_Element, Dummy);
    end Remove;

    procedure Sort (This_Set : in out Set) is

        type Sorted_Array is array (1 .. Number_In (This_Set)) of Boolean;

        Already_Sorted     : Sorted_Array := (others => False);
        Remaining          : Natural      := Number_In (This_Set);
        Sorted_Set         : Set          := Empty_Set;
        Smallest_This_Pass : Element;  
        Index_Of_Smallest  : Natural;
        Current_Index      : Natural;

    begin  
        while Remaining > 0 loop  
            Current_Index := 1;
            Directory_Tools.Object.Reset (This_Set);
            Smallest_This_Pass := Directory_Tools.Object.Value (This_Set);
            while not Directory_Tools.Object.Done (This_Set) loop
                if not Already_Sorted (Current_Index) then
                    -- Current element hasn't already been put in
                    -- the sorted array, so test it.
                    if Directory_Tools.Object.Value (This_Set) <
                       Smallest_This_Pass then
                        -- Current element is smaller than the smallest
                        -- element found so far on this pass, so make
                        -- it the new smallest.
                        Smallest_This_Pass :=
                           Directory_Tools.Object.Value (This_Set);
                        Index_Of_Smallest  := Current_Index;
                    end if;
                end if;
                Directory_Tools.Object.Next (This_Set);  
                Current_Index := Current_Index + 1;
            end loop;
            Add (Smallest_This_Pass, Sorted_Set);
            Already_Sorted (Index_Of_Smallest) := True;
            Remaining := Remaining - 1;
        end loop;
        This_Set := Sorted_Set;
    end Sort;

    procedure Filter (This_Set : in out Set) is

        New_Set : Set := Empty_Set;

    begin
        Directory_Tools.Object.Reset (This_Set);
        while not Directory_Tools.Object.Done (This_Set) loop
            if not Dont_Want (Directory_Tools.Object.Value (This_Set)) then
                -- Want current element, so add it.
                Add Directory_Tools.Object.Value (This_Set), New_Set);
            end if;
            Directory_Tools.Object.Next (This_Set);
        end loop;
        This_Set := New_Set;
    end Filter;

    procedure Process_Elements (This_Set : in out Set) is
    begin
        Directory_Tools.Object.Reset (This_Set);
        while not Directory_Tools.Object.Done (This_Set) loop
            declare
                Current_Element : Element :=
                   Directory_Tools.Object.Value (This_Set);
            begin
                Process (Current_Element);
            end;
            Directory_Tools.Object.Next (This_Set);
        end loop;
    end Process_Elements;

    procedure Process_Elements_With_State
                 (This_Set : in out Set; This_State : in out Process_State) is
    begin
        Initialize (This_State);
        Directory_Tools.Object.Reset (This_Set);
        while not Directory_Tools.Object.Done (This_Set) loop
            declare
                Current_Element : Element :=
                   Directory_Tools.Object.Value (This_Set);
            begin
                Process (Current_Element, This_State);
            end;
            Directory_Tools.Object.Next (This_Set);
        end loop;
        Finalize (This_State);
    end Process_Elements_With_State;

    function Union (This_Set : in Set; That_Set : in Set) return Set is

        Union_Set : Set := Empty_Set;

        procedure Union_Copy (This_Set : in Set; New_Set : in out Set) is

            Working_Set : Set := This_Set;

        begin
            Directory_Tools.Object.Reset (Working_Set);
            while not Directory_Tools.Object.Done (Working_Set) loop
                Add (Directory_Tools.Object.Value (Working_Set), New_Set);
                Directory_Tools.Object.Next (Working_Set);
            end loop;
        end Union_Copy;

    begin  
        Union_Copy (This_Set, Union_Set);
        Union_Copy (That_Set, Union_Set);
        return Union_Set;
    end Union;

    function Intersection (This_Set : in Set; That_Set : in Set) return Set is

        Working_Set      : Set := This_Set;
        Intersection_Set : Set := Empty_Set;

    begin
        Directory_Tools.Object.Reset (Working_Set);
        while not Directory_Tools.Object.Done (Working_Set) loop
            if Is_Member (That_Set,
                          Directory_Tools.Object.Value (Working_Set)) then
                -- Found an element in the one set which is also in the
                -- other set, so add it to the intersection set.
                Add (Directory_Tools.Object.Value (Working_Set),
                     Intersection_Set);
            end if;
            Directory_Tools.Object.Next (Working_Set);
        end loop;
        return Intersection_Set;
    end Intersection;

    function Exclusive_Or (This_Set : in Set; That_Set : in Set) return Set is

        Xor_Set : Set := Empty_Set;

        procedure Xor_Copy (This_Set   : in     Set;
                            Except_For : in     Set;
                            Into       : in out Set) is

            Working_Set : Set := This_Set;

        begin
            Directory_Tools.Object.Reset (Working_Set);
            while not Directory_Tools.Object.Done (Working_Set) loop
                if not Is_Member (Except_For, Directory_Tools.Object.Value
                                                 (Working_Set)) then
                    -- Found an element in the one set which is not also
                    -- in the other set, so add it to the new set.
                    Add (Directory_Tools.Object.Value (Working_Set), Into);
                end if;
                Directory_Tools.Object.Next (Working_Set);
            end loop;
        end Xor_Copy;

    begin
        Xor_Copy (This_Set, That_Set, Xor_Set);
        Xor_Copy (That_Set, This_Set, Xor_Set);
        return Xor_Set;
    end Exclusive_Or;

    function Subtraction (This_Set : in Set; Except_For : in Set) return Set is

        Working_Set     : Set := This_Set;
        Subtraction_Set : Set := Empty_Set;

    begin
        Directory_Tools.Object.Reset (Working_Set);
        while not Directory_Tools.Object.Done (Working_Set) loop
            if not Is_Member (Except_For,
                              Directory_Tools.Object.Value (Working_Set)) then
                -- Found an element in the one set which is not also
                -- in the other set, so add it to the subtraction set.
                Add (Directory_Tools.Object.Value (Working_Set),
                     Subtraction_Set);
            end if;
            Directory_Tools.Object.Next (Working_Set);
        end loop;
        return Subtraction_Set;
    end Subtraction;

    function Subset (This_Set : in Set; Contains : in Set) return Boolean is

        Working_Set : Set     := Contains;
        Result      : Boolean := True;

    begin  
        Directory_Tools.Object.Reset (Working_Set);
        while not Directory_Tools.Object.Done (Working_Set) loop
            if not Is_Member (This_Set,
                              Directory_Tools.Object.Value (Working_Set)) then
                -- Found an element in "Contains" which is not in the
                -- other set, so is not a subset of the other set.
                Result := False;
                exit;
            end if;
            Directory_Tools.Object.Next (Working_Set);
        end loop;
        return Result;
    end Subset;

    function Proper_Subset
                (This_Set : in Set; Contains : in Set) return Boolean is
    begin
        return Subset (This_Set, Contains) and then
                  (Number_In (This_Set) > Number_In (Contains));
    end Proper_Subset;

    procedure Screen (These_Units : in out Set;
                      Exclude : in Set;
                      Specs_Only : in Boolean;
                      Include_Universe_Mirrors : in Boolean) is

        Screened : Set := Empty_Set;

        Current : Element;

    begin
        Directory_Tools.Object.Reset (These_Units);
        while not Directory_Tools.Object.Done (These_Units) loop
            Current := Directory_Tools.Object.Value (These_Units);
            if Object_Info.Any.Is_Bad (Current) then
                -- Current unit is bad, so don't add it.
                null;  
            elsif Is_Member (Exclude, Current) then
                -- Already have the current unit, so don't add it.
                null;
            elsif Specs_Only and then not Object_Info.Ada.Is_Spec (Current) then
                -- Client wants specs only, and current unit is not a spec,
                -- so don't add it.
                null;
            elsif not Include_Universe_Mirrors and then
                  Object_Info.Ada.Is_Universe_Mirror (Current) then
                -- Client doesn't want universe mirrors, and current unit is
                -- a universe mirror, so don't add it.
                null;
            else
                -- Current unit met all criteria, so add it.
                Add (Current, Screened);
            end if;
            Directory_Tools.Object.Next (These_Units);
        end loop;  
        These_Units := Screened;
    end Screen;

    generic

        with function Immediate_Dependencies
                         (This_Element : in Element;
                          Code_Share_Generics : in Boolean;
                          This_Activity : in Activity.Activity_Name) return Set;

    function Single_Unit_Dependency_Closure
                (Unit : in Element;
                 Specs_Only : in Boolean := False;
                 Transitive : in Boolean := True;
                 Include_Universe_Mirrors : in Boolean := False;
                 Code_Share_Generics : in Boolean := True;
                 This_Activity : in Activity.Activity_Name :=
                    Activity.The_Current_Activity) return Set;

    function Single_Unit_Dependency_Closure
                (Unit : in Element;
                 Specs_Only : in Boolean := False;
                 Transitive : in Boolean := True;
                 Include_Universe_Mirrors : in Boolean := False;
                 Code_Share_Generics : in Boolean := True;
                 This_Activity : in Activity.Activity_Name :=
                    Activity.The_Current_Activity) return Set is

        Closure   : Set := Empty_Set;
        New_Units : Set := Empty_Set;

        procedure Get_Next_Units (These_Units : in out Set) is

            New_Units : Set := Empty_Set;

        begin
            Directory_Tools.Object.Reset (These_Units);
            while not Directory_Tools.Object.Done (These_Units) loop
                New_Units := New_Units +
                                Immediate_Dependencies
                                   (Directory_Tools.Object.Value (These_Units),
                                    Code_Share_Generics, This_Activity);  
                Directory_Tools.Object.Next (These_Units);
            end loop;  
            These_Units := New_Units;
        end Get_Next_Units;

    begin  
        New_Units := Immediate_Dependencies
                        (Unit, Code_Share_Generics, This_Activity);
        loop
            Screen (New_Units, Closure, Specs_Only, Include_Universe_Mirrors);
            Closure := Closure + New_Units;
            if not Transitive then
                -- Only needed to calculate first level.
                exit;
            elsif Is_Empty (New_Units) then
                -- There were no new units, so closure is complete.
                exit;
            else
                -- There are more units requiring processing.
                Get_Next_Units (New_Units);  
            end if;
        end loop;
        return Closure;
    end Single_Unit_Dependency_Closure;

    generic

        with function Single_Unit_Dependency_Closure_Instantiation
                         (Unit : in Element;
                          Specs_Only : in Boolean := False;
                          Transitive : in Boolean := True;
                          Include_Universe_Mirrors : in Boolean := False;
                          Code_Share_Generics : in Boolean := True;
                          This_Activity : in Activity.Activity_Name :=
                             Activity.The_Current_Activity) return Set;

    function Multiple_Unit_Dependency_Closure
                (Units : in Set;
                 Specs_Only : in Boolean := False;
                 Transitive : in Boolean := True;
                 Include_Universe_Mirrors : in Boolean := False;
                 Code_Share_Generics : in Boolean := True;
                 This_Activity : in Activity.Activity_Name :=
                    Activity.The_Current_Activity) return Set;

    function Multiple_Unit_Dependency_Closure
                (Units : in Set;
                 Specs_Only : in Boolean := False;
                 Transitive : in Boolean := True;
                 Include_Universe_Mirrors : in Boolean := False;
                 Code_Share_Generics : in Boolean := True;
                 This_Activity : in Activity.Activity_Name :=
                    Activity.The_Current_Activity) return Set is

        Working_Set : Set := Units;
        Closure     : Set := Empty_Set;

    begin
        Directory_Tools.Object.Reset (Working_Set);
        while not Directory_Tools.Object.Done (Working_Set) loop
            Closure := Closure + Single_Unit_Dependency_Closure_Instantiation
                                    (Directory_Tools.Object.Value (Working_Set),
                                     Specs_Only, Transitive,
                                     Include_Universe_Mirrors,
                                     Code_Share_Generics, This_Activity);
            Directory_Tools.Object.Next (Working_Set);
        end loop;  
        return Closure;
    end Multiple_Unit_Dependency_Closure;

    function Spec_Is_Generic_For (This_Element : in Element) return Boolean is

        -- Returns True if the spec associated with the specified element
        -- is a generic spec.

    begin
        return Object_Info.Ada.Is_Generic_Spec
                  (Object_Info.Ada.Spec_For (This_Element));
    end Spec_Is_Generic_For;

    function Immediate_Dependencies_On
                (This_Element        : in Element;
                 Code_Share_Generics : in Boolean;
                 This_Activity       : in Activity.Activity_Name) return Set is

        Dependencies : Set := Object_Info.Ada.Dependents_Of (This_Element);

    begin
        if Object_Info.Any.Is_Ada_Unit (This_Element) then
            -- Deal with question of code sharing.
            if not Code_Share_Generics and then
               Object_Info.Ada.Is_Body_Or_Subunit (This_Element) and then
               Spec_Is_Generic_For (This_Element) then
                -- Current element is body or subunit associated with
                -- a generic spec, and generic bodies are not code-shared.
                -- Therefore, the current element will be macro-
                -- inline expanded, and dependencies on the current
                -- element include dependencies on its spec.
                Dependencies := Dependencies +
                                   Object_Info.Ada.Dependents_Of
                                      (Object_Info.Ada.Spec_For (This_Element));
            end if;
            -- Perform spec look-through.
            if Object_Info.Ada.Is_Spec_In_Load_View (This_Element) then
                -- The element is a spec in a load view, so it has an associated spec
                -- in a spec view. Anything that depends on the spec in the spec view
                -- in actuality depends on the current element, so add the spec view
                -- spec to the dependencies (so that the next pass will get the
                -- dependencies on it).
                Add (Object_Info.Ada.Spec_In_Other_View
                        (This_Element, This_Activity), Dependencies);
            end if;  
        end if;
        return Dependencies;
    end Immediate_Dependencies_On;

    function Dependencies_On_Single_Unit is
       new Single_Unit_Dependency_Closure (Immediate_Dependencies_On);

    function Dependencies_On  
                (Unit : in Element;
                 Specs_Only : in Boolean := False;
                 Transitive : in Boolean := True;
                 Include_Universe_Mirrors : in Boolean := False;
                 Code_Share_Generics : in Boolean := True;
                 This_Activity : in Activity.Activity_Name :=
                    Activity.The_Current_Activity) return Set is
    begin
        return Dependencies_On_Single_Unit
                  (Unit, Specs_Only, Transitive, Include_Universe_Mirrors,
                   Code_Share_Generics, This_Activity);
    end Dependencies_On;

    function Dependencies_On_Multiple_Units is
       new Multiple_Unit_Dependency_Closure (Dependencies_On);

    function Dependencies_On  
                (Units : in Set;
                 Specs_Only : in Boolean := False;
                 Transitive : in Boolean := True;
                 Include_Universe_Mirrors : in Boolean := False;
                 Code_Share_Generics : in Boolean := True;
                 This_Activity : in Activity.Activity_Name :=
                    Activity.The_Current_Activity) return Set is
    begin
        return Dependencies_On_Multiple_Units
                  (Units, Specs_Only, Transitive, Include_Universe_Mirrors,
                   Code_Share_Generics, This_Activity);
    end Dependencies_On;

    function Immediate_Dependencies_By
                (This_Element        : in Element;
                 Code_Share_Generics : in Boolean;
                 This_Activity       : in Activity.Activity_Name) return Set is

        Dependencies : Set := Object_Info.Ada.Specs_Withed_By (This_Element);

        Families_Of_Generic_Specs : Set := Empty_Set;

        Specs_In_Load_Views : Set := Empty_Set;

    begin
        if Object_Info.Any.Is_Ada_Unit (This_Element) then
            -- Deal with bodies and subunits.
            if Object_Info.Ada.Is_Subunit (This_Element) then
                Add (Object_Info.Ada.Parent_Of (This_Element), Dependencies);
            elsif Object_Info.Ada.Is_Body (This_Element) then
                Add (Object_Info.Ada.Spec_For (This_Element), Dependencies);
            end if;
            -- Deal with question of code sharing.
            if not Code_Share_Generics then
                Directory_Tools.Object.Reset (Dependencies);               while not Directory_Tools.Object.Done (Dependencies) loop
                    if Object_Info.Ada.Is_Generic_Spec
                          (Directory_Tools.Object.Value (Dependencies)) then
                        -- The element depends on a generic spec. Since the body and
                        -- subunits of the generic spec are not code-shared, they
                        -- will be macro-inline expanded. Therefore, the element
                        -- depends on the entire family of the generic spec.
                        Families_Of_Generic_Specs :=
                           Families_Of_Generic_Specs +
                              Family (Directory_Tools.Object.Value
                                         (Dependencies));
                    end if;
                    Directory_Tools.Object.Next (Dependencies);
                end loop;
            end if;
            Dependencies := Dependencies + Families_Of_Generic_Specs;
            -- Perform spec look-through.
            Directory_Tools.Object.Reset (Dependencies);
            while not Directory_Tools.Object.Done (Dependencies) loop
                if Object_Info.Ada.Is_Spec_In_Spec_View
                      (Directory_Tools.Object.Value (Dependencies)) then
                    -- The element depends on a spec in a spec view. So add
                    -- the associated spec in the load view to the dependencies.
                    Add (Object_Info.Ada.Spec_In_Other_View
                            (Directory_Tools.Object.Value (Dependencies),
                             This_Activity), Specs_In_Load_Views);
                end if;
                Directory_Tools.Object.Next (Dependencies);
            end loop;  
            Dependencies := Dependencies + Specs_In_Load_Views;
        end if;
        return Dependencies;
    end Immediate_Dependencies_By;

    function Dependencies_By_Single_Unit is
       new Single_Unit_Dependency_Closure (Immediate_Dependencies_By);

    function Dependencies_By (Unit : in Element;
                              Specs_Only : in Boolean := False;
                              Transitive : in Boolean := True;
                              Include_Universe_Mirrors : in Boolean := False;
                              Code_Share_Generics : in Boolean := True;
                              This_Activity : in Activity.Activity_Name :=
                                 Activity.The_Current_Activity) return Set is
    begin
        return Dependencies_By_Single_Unit
                  (Unit, Specs_Only, Transitive, Include_Universe_Mirrors,
                   Code_Share_Generics, This_Activity);
    end Dependencies_By;

    function Dependencies_By_Multiple_Units is
       new Multiple_Unit_Dependency_Closure (Dependencies_By);

    function Dependencies_By (Units : in Set;
                              Specs_Only : in Boolean := False;
                              Transitive : in Boolean := True;
                              Include_Universe_Mirrors : in Boolean := False;
                              Code_Share_Generics : in Boolean := True;
                              This_Activity : in Activity.Activity_Name :=
                                 Activity.The_Current_Activity) return Set is
    begin
        return Dependencies_By_Multiple_Units
                  (Units, Specs_Only, Transitive, Include_Universe_Mirrors,
                   Code_Share_Generics, This_Activity);
    end Dependencies_By;

    function Immediate_Family_Dependencies_On
                (This_Element        : in Element;
                 Code_Share_Generics : in Boolean;
                 This_Activity       : in Activity.Activity_Name) return Set is

        Dependencies : Set := Object_Info.Ada.Subunits_Of (This_Element);

    begin  
        if Object_Info.Ada.Is_Spec (This_Element) then
            -- Add body.
            Add (Object_Info.Ada.Body_For (This_Element), Dependencies);
            -- Add subunits.
            Dependencies := Dependencies +
                               Object_Info.Ada.Subunits_Of
                                  (Object_Info.Ada.Body_For (This_Element));
            -- Perform spec look-through.
            if Object_Info.Ada.Is_Spec_In_Spec_View (This_Element) then
                Add (Object_Info.Ada.Spec_In_Other_View
                        (This_Element, This_Activity), Dependencies);
            end if;
        elsif Object_Info.Ada.Is_Body_Or_Subunit (This_Element) then
            -- Add subunits.
            Dependencies := Dependencies +
                               Object_Info.Ada.Subunits_Of (This_Element);
        end if;
        return Dependencies;
    end Immediate_Family_Dependencies_On;

    function Family_Dependencies_On is
       new Single_Unit_Dependency_Closure (Immediate_Family_Dependencies_On);

    function Family (Unit          : in Element;
                     This_Activity : in Activity.Activity_Name :=
                        Activity.The_Current_Activity) return Set is

        Family_Dependencies : Set :=
           Family_Dependencies_On (Unit,
                                   Specs_Only               => False,
                                   Transitive               => True,
                                   Include_Universe_Mirrors => True,
                                   Code_Share_Generics      => True,
                                   This_Activity            => This_Activity);
    begin
        if Object_Info.Any.Is_Ada_Unit (Unit) then
            Add (Unit, Family_Dependencies);
        end if;
        return Family_Dependencies;
    end Family;

    function Immediate_Execution_Closure_For
                (This_Element        : in Element;
                 Code_Share_Generics : in Boolean;
                 This_Activity       : in Activity.Activity_Name) return Set is

        Dependencies : Set := Object_Info.Ada.Specs_Withed_By (This_Element);

        Families_Of_Elements : Set := Empty_Set;

        Specs_In_Load_Views : Set := Empty_Set;

    begin
        if Object_Info.Any.Is_Ada_Unit (This_Element) then
            -- Add the element itself to the closure.
            Add (This_Element, Dependencies);
            -- Deal with bodies and subunits.
            if Object_Info.Ada.Is_Subunit (This_Element) then
                Add (Object_Info.Ada.Parent_Of (This_Element), Dependencies);
            elsif Object_Info.Ada.Is_Body (This_Element) then
                Add (Object_Info.Ada.Spec_For (This_Element), Dependencies);
            end if;
            -- Add families of all elements to dependencies.
            Directory_Tools.Object.Reset (Dependencies);
            while not Directory_Tools.Object.Done (Dependencies) loop
                Families_Of_Elements :=
                   Families_Of_Elements +
                      Family (Directory_Tools.Object.Value (Dependencies));
                Directory_Tools.Object.Next (Dependencies);
            end loop;
            Dependencies := Dependencies + Families_Of_Elements;
            -- Perform spec look-through.
            Directory_Tools.Object.Reset (Dependencies);
            while not Directory_Tools.Object.Done (Dependencies) loop
                if Object_Info.Ada.Is_Spec_In_Spec_View
                      (Directory_Tools.Object.Value (Dependencies)) then
                    -- The element depends on a spec in a spec view. So add
                    -- the associated spec in the load view to the dependencies.
                    Add (Object_Info.Ada.Spec_In_Other_View
                            (Directory_Tools.Object.Value (Dependencies),
                             This_Activity), Specs_In_Load_Views);
                end if;
                Directory_Tools.Object.Next (Dependencies);
            end loop;  
            Dependencies := Dependencies + Specs_In_Load_Views;
        end if;
        return Dependencies;
    end Immediate_Execution_Closure_For;

    function Execution_Closure_For_Single_Unit is
       new Single_Unit_Dependency_Closure (Immediate_Execution_Closure_For);

    function Execution_Closure_For
                (Unit : in Element;
                 Include_Universe_Mirrors : in Boolean := False;
                 This_Activity : in Activity.Activity_Name :=
                    Activity.The_Current_Activity) return Set is
    begin
        return Execution_Closure_For_Single_Unit
                  (Unit,
                   Specs_Only               => False,
                   Transitive               => True,
                   Include_Universe_Mirrors => Include_Universe_Mirrors,
                   Code_Share_Generics      => True,
                   This_Activity            => This_Activity);
    end Execution_Closure_For;

end Object_Sets;

E3 Meta Data

    nblk1=26
    nid=0
    hdr6=4c
        [0x00] rec0=20 rec1=00 rec2=01 rec3=062
        [0x01] rec0=20 rec1=00 rec2=02 rec3=00a
        [0x02] rec0=00 rec1=00 rec2=26 rec3=006
        [0x03] rec0=1d rec1=00 rec2=03 rec3=094
        [0x04] rec0=15 rec1=00 rec2=04 rec3=04a
        [0x05] rec0=01 rec1=00 rec2=25 rec3=00c
        [0x06] rec0=19 rec1=00 rec2=05 rec3=028
        [0x07] rec0=00 rec1=00 rec2=24 rec3=002
        [0x08] rec0=1b rec1=00 rec2=06 rec3=026
        [0x09] rec0=1d rec1=00 rec2=07 rec3=02c
        [0x0a] rec0=1a rec1=00 rec2=08 rec3=030
        [0x0b] rec0=00 rec1=00 rec2=23 rec3=00a
        [0x0c] rec0=18 rec1=00 rec2=09 rec3=02a
        [0x0d] rec0=1a rec1=00 rec2=0a rec3=014
        [0x0e] rec0=00 rec1=00 rec2=22 rec3=01a
        [0x0f] rec0=1a rec1=00 rec2=0b rec3=048
        [0x10] rec0=17 rec1=00 rec2=0c rec3=02a
        [0x11] rec0=19 rec1=00 rec2=0d rec3=018
        [0x12] rec0=18 rec1=00 rec2=0e rec3=006
        [0x13] rec0=00 rec1=00 rec2=21 rec3=004
        [0x14] rec0=17 rec1=00 rec2=0f rec3=022
        [0x15] rec0=16 rec1=00 rec2=10 rec3=01c
        [0x16] rec0=15 rec1=00 rec2=11 rec3=00c
        [0x17] rec0=00 rec1=00 rec2=20 rec3=008
        [0x18] rec0=1a rec1=00 rec2=12 rec3=00e
        [0x19] rec0=0f rec1=00 rec2=13 rec3=082
        [0x1a] rec0=15 rec1=00 rec2=14 rec3=064
        [0x1b] rec0=18 rec1=00 rec2=15 rec3=006
        [0x1c] rec0=16 rec1=00 rec2=16 rec3=002
        [0x1d] rec0=10 rec1=00 rec2=17 rec3=01c
        [0x1e] rec0=13 rec1=00 rec2=18 rec3=050
        [0x1f] rec0=14 rec1=00 rec2=19 rec3=046
        [0x20] rec0=15 rec1=00 rec2=1a rec3=044
        [0x21] rec0=15 rec1=00 rec2=1b rec3=05c
        [0x22] rec0=15 rec1=00 rec2=1c rec3=09e
        [0x23] rec0=17 rec1=00 rec2=1d rec3=014
        [0x24] rec0=11 rec1=00 rec2=1e rec3=00c
        [0x25] rec0=18 rec1=00 rec2=1f rec3=001
    tail 0x217002150815c65541a1c 0x42a00088462061e03