(root)/
gcc-13.2.0/
gcc/
testsuite/
gnat.dg/
iter5_pkg.ads
with Ada.Calendar;
with Ada.Directories;

with Ada.Iterator_Interfaces;

package Iter5_Pkg is

  subtype Size is Ada.Directories.File_Size;

  type Folder is new String;

  function Folder_Separator return Character;

  function "+" (Directory : String) return Folder;

  function "+" (Left, Right : String) return Folder;

  function "+" (Left  : Folder;
                Right : String) return Folder;

  function Composure (Directory : Folder;
                      Filename  : String;
                      Extension : String) return String;

  function Composure (Directory : String;
                      Filename  : String;
                      Extension : String) return String;
  -- no exception

  function Base_Name_Of (Name : String) return String
    renames Ada.Directories.Base_Name;

  function Extension_Of (Name : String) return String
    renames Ada.Directories.Extension;

  function Containing_Directory_Of (Name : String) return String
    renames Ada.Directories.Containing_Directory;

  function Exists (Name : String) return Boolean;
  -- no exception

  function Size_Of (Name : String) return Size renames Ada.Directories.Size;

  function Directory_Exists (Name : String) return Boolean;
  -- no exception

  function Modification_Time_Of (Name : String) return Ada.Calendar.Time
    renames Ada.Directories.Modification_Time;

  function Is_Newer (The_Name  : String;
                     Than_Name : String) return Boolean;

  procedure Delete (Name : String);
  -- no exception if no existance

  procedure Create_Directory (Path : String);
  -- creates the whole directory path

  procedure Delete_Directory (Name : String); -- including contents
  -- no exception if no existance

  procedure Rename (Old_Name : String;
                    New_Name : String) renames Ada.Directories.Rename;

  procedure Copy (Source_Name   : String;
                  Target_Name   : String;
                  Form          : String := "")
    renames Ada.Directories.Copy_File;

  function Is_Leaf_Directory (Directory : String) return Boolean;

  procedure Iterate_Over_Leaf_Directories (From_Directory : String;
                                           Iterator : access procedure
                                             (Leaf_Directory : String));

  function Found_Directory (Simple_Name  : String;
                            In_Directory : String) return String;

  Not_Found : exception;

  Name_Error : exception renames Ada.Directories.Name_Error;
  Use_Error  : exception renames Ada.Directories.Use_Error;

  ------------------------
  -- File Iterator Loop --
  ------------------------
  -- Example:
  --          for The_Filename of Iter5_Pkg.Iterator_For ("C:\Program_Files") loop
  --            Log.Write (The_Filename);
  --          end loop;

  type Item (Name_Length : Natural) is limited private;

  function Iterator_For (Name : String) return Item;

private
  type Cursor;

  function Has_More (Data : Cursor) return Boolean;

  package List_Iterator_Interfaces is
    new Ada.Iterator_Interfaces (Cursor, Has_More);

  function Iterate (The_Item : Item)
    return List_Iterator_Interfaces.Forward_Iterator'class;

  type Cursor_Data is record
    Has_More : Boolean := False;
    Position : Ada.Directories.Search_Type;
  end record;

  type Cursor is access all Cursor_Data;

  function Constant_Reference (The_Item     : aliased Item;
                               Unused_Index : Cursor) return String;

  type Item (Name_Length : Natural) is tagged limited record
    Name   : String(1..Name_Length);
    Actual : Ada.Directories.Directory_Entry_Type;
    Data   : aliased Cursor_Data;
  end record
  with
    Constant_Indexing => Constant_Reference,
    Default_Iterator  => Iterate,
    Iterator_Element  => String;

end Iter5_Pkg;