From 7f56d08907ffdd192f4b4898bfb22c1dce8f1cd0 Mon Sep 17 00:00:00 2001 From: Jed Barber Date: Sat, 23 May 2020 15:31:27 +1000 Subject: Added Iterate_By function for custom iteration --- src/directed_graphs.adb | 66 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) (limited to 'src/directed_graphs.adb') diff --git a/src/directed_graphs.adb b/src/directed_graphs.adb index 12916d1..bacb040 100644 --- a/src/directed_graphs.adb +++ b/src/directed_graphs.adb @@ -1019,6 +1019,12 @@ package body Directed_Graphs is Impl.Unbusy (Object.Container.Tamper_Info); end Finalize; + procedure Finalize + (Object : in out By_Iterator) is + begin + Impl.Unbusy (Object.Container.Tamper_Info); + end Finalize; + @@ -1163,6 +1169,17 @@ package body Directed_Graphs is end if; end First; + function First + (Object : in By_Iterator) + return Cursor is + begin + if Object.Filter = null or else Object.Filter (Object.Start) then + return Object.Start; + else + return Next (Object, Object.Start); + end if; + end First; + @@ -1628,6 +1645,40 @@ package body Directed_Graphs is + ---------------- + -- Iterate_By -- + ---------------- + + function Iterate_By + (Container : in Graph; + Start : in Cursor; + Chooser : in Choice_Function; + Filter : in Filter_Function := null) + return Graph_Iterator_Interfaces.Forward_Iterator'Class is + begin + if Impl.Checks then + if Start.Container /= Container'Unrestricted_Access then + raise Constraint_Error with "Cursor points to different graph"; + end if; + if not Has_Element (Start) then + raise Constraint_Error with "Start Cursor points to nothing"; + end if; + if Chooser = null then + raise Constraint_Error with "No choice function supplied"; + end if; + end if; + return It : By_Iterator do + It.Container := Container'Unrestricted_Access; + It.Start := Start; + It.Chooser := Chooser; + It.Filter := Filter; + Impl.Busy (Container.Tamper_Info'Unrestricted_Access.all); + end return; + end Iterate_By; + + + + ---------------------- -- Iterate_Subgraph -- ---------------------- @@ -2010,6 +2061,21 @@ package body Directed_Graphs is end if; end Next; + function Next + (Object : in By_Iterator; + Position : in Cursor) + return Cursor + is + Result : Cursor := Position; + begin + loop + Result := Object.Chooser (Result); + if Object.Filter = null or else Object.Filter (Result) then + return Result; + end if; + end loop; + end Next; + -- cgit