------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                          B I N D O . U N I T S                           --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--             Copyright (C) 2019-2023, Free Software Foundation, Inc.      --
--                                                                          --
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
-- for  more details.  You should have  received  a copy of the GNU General --
-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
-- http://www.gnu.org/licenses for a complete copy of the license.          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

--  For full architecture, see unit Bindo.

--  The following unit contains facilities to collect all elaborable units in
--  the bind and inspect their properties.

with GNAT;      use GNAT;
with GNAT.Sets; use GNAT.Sets;

package Bindo.Units is

   ---------------
   -- Unit sets --
   ---------------

   function Hash_Unit (U_Id : Unit_Id) return Bucket_Range_Type;
   pragma Inline (Hash_Unit);
   --  Obtain the hash value of key U_Id

   package Unit_Sets is new Membership_Sets
     (Element_Type => Unit_Id,
      "="          => "=",
      Hash         => Hash_Unit);

   procedure Collect_Elaborable_Units;
   pragma Inline (Collect_Elaborable_Units);
   --  Gather all units in the bind that require elaboration. The units are
   --  accessible via iterator Elaborable_Units_Iterator.

   function Corresponding_Body (U_Id : Unit_Id) return Unit_Id;
   pragma Inline (Corresponding_Body);
   --  Return the body of a spec unit U_Id

   function Corresponding_Spec (U_Id : Unit_Id) return Unit_Id;
   pragma Inline (Corresponding_Spec);
   --  Return the spec of a body unit U_Id

   function Corresponding_Unit (FNam : File_Name_Type) return Unit_Id;
   pragma Inline (Corresponding_Unit);
   --  Obtain the unit which corresponds to name FNam

   function Corresponding_Unit (UNam : Unit_Name_Type) return Unit_Id;
   pragma Inline (Corresponding_Unit);
   --  Obtain the unit which corresponds to name FNam

   function File_Name (U_Id : Unit_Id) return File_Name_Type;
   pragma Inline (File_Name);
   --  Obtain the file name of unit U_Id

   type Unit_Processor_Ptr is access procedure (U_Id : Unit_Id);

   procedure For_Each_Elaborable_Unit (Processor : Unit_Processor_Ptr);
   pragma Inline (For_Each_Elaborable_Unit);
   --  Invoke Processor on each elaborable unit in the bind

   procedure For_Each_Unit (Processor : Unit_Processor_Ptr);
   pragma Inline (For_Each_Unit);
   --  Invoke Processor on each unit in the bind

   function Has_No_Elaboration_Code (U_Id : Unit_Id) return Boolean;
   pragma Inline (Has_No_Elaboration_Code);
   --  Determine whether unit U_Id lacks elaboration code

   function Hash_Invocation_Signature
     (IS_Id : Invocation_Signature_Id) return Bucket_Range_Type;
   pragma Inline (Hash_Invocation_Signature);
   --  Obtain the hash value of key IS_Id

   function Invocation_Graph_Encoding
     (U_Id : Unit_Id) return Invocation_Graph_Encoding_Kind;
   pragma Inline (Invocation_Graph_Encoding);
   --  Obtain the encoding format used to capture invocation constructs and
   --  relations in the ALI file of unit U_Id.

   function Is_Dynamically_Elaborated (U_Id : Unit_Id) return Boolean;
   pragma Inline (Is_Dynamically_Elaborated);
   --  Determine whether unit U_Id was compiled using the dynamic elaboration
   --  model.

   function Is_Internal_Unit (U_Id : Unit_Id) return Boolean;
   pragma Inline (Is_Internal_Unit);
   --  Determine whether unit U_Id is internal

   function Is_Predefined_Unit (U_Id : Unit_Id) return Boolean;
   pragma Inline (Is_Predefined_Unit);
   --  Determine whether unit U_Id is predefined

   function Name (U_Id : Unit_Id) return Unit_Name_Type;
   pragma Inline (Name);
   --  Obtain the name of unit U_Id

   function Needs_Elaboration (IS_Id : Invocation_Signature_Id) return Boolean;
   pragma Inline (Needs_Elaboration);
   --  Determine whether invocation signature IS_Id belongs to a construct that
   --  appears in a unit which needs to be elaborated.

   function Needs_Elaboration (U_Id : Unit_Id) return Boolean;
   pragma Inline (Needs_Elaboration);
   --  Determine whether unit U_Id needs to be elaborated

   function Number_Of_Elaborable_Units return Natural;
   pragma Inline (Number_Of_Elaborable_Units);
   --  Obtain the number of units in the bind that need to be elaborated

   function Number_Of_Units return Natural;
   pragma Inline (Number_Of_Units);
   --  Obtain the number of units in the bind

   ---------------
   -- Iterators --
   ---------------

   --  The following type represents an iterator over all units that need to be
   --  elaborated.

   type Elaborable_Units_Iterator is private;

   function Has_Next (Iter : Elaborable_Units_Iterator) return Boolean;
   pragma Inline (Has_Next);
   --  Determine whether iterator Iter has more units to examine

   function Iterate_Elaborable_Units return Elaborable_Units_Iterator;
   pragma Inline (Iterate_Elaborable_Units);
   --  Obtain an iterator over all units that need to be elaborated

   procedure Next
     (Iter : in out Elaborable_Units_Iterator;
      U_Id : out Unit_Id);
   pragma Inline (Next);
   --  Return the current unit referenced by iterator Iter and advance to the
   --  next available unit.

   -----------------
   -- Maintenance --
   -----------------

   procedure Finalize_Units;
   pragma Inline (Finalize_Units);
   --  Destroy the internal structures of this unit

   procedure Initialize_Units;
   pragma Inline (Initialize_Units);
   --  Initialize the internal structures of this unit

private
   type Elaborable_Units_Iterator is new Unit_Sets.Iterator;

end Bindo.Units;
