with Ada.Directories; package body Dir_Iterators.Ancestor is package ASU renames Ada.Strings.Unbounded; function Iterate (Tree : Ancestor_Dir_Walk) return Ancestor_Dir_Iterator_Interfaces.Forward_Iterator'Class is begin return It : Ancestor_Dir_Iterator do It.Start := Tree.Start; end return; end Iterate; function Walk (Dir : String) return Ancestor_Dir_Walk is begin return ADW : Ancestor_Dir_Walk do ADW.Start := ASU.To_Unbounded_String (Dir); end return; end Walk; function Has_Element (Position : Cursor) return Boolean is Parent : ASU.Unbounded_String; begin pragma Unreferenced (Parent); Parent := ASU.To_Unbounded_String (Ada.Directories.Containing_Directory (ASU.To_String (Position.Current))); return True; exception when others => return False; end Has_Element; overriding function First (Object : Ancestor_Dir_Iterator) return Cursor is begin return Cursor'(Current => Object.Start); end First; overriding function Next (It : Ancestor_Dir_Iterator; Position : Cursor) return Cursor is begin pragma Unreferenced (It); return Cursor' (Current => ASU.To_Unbounded_String (Ada.Directories.Containing_Directory (ASU.To_String(Position.Current)))); end Next; function Element_Value (Tree : Ancestor_Dir_Walk; Position : Cursor) return String is begin pragma Unreferenced (Tree); return ASU.To_String(Position.Current); end Element_Value; end Dir_Iterators.Ancestor;