diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ada-containers-directed_graphs.ads | 204 |
1 files changed, 202 insertions, 2 deletions
diff --git a/src/ada-containers-directed_graphs.ads b/src/ada-containers-directed_graphs.ads index e383c0c..cc1c39c 100644 --- a/src/ada-containers-directed_graphs.ads +++ b/src/ada-containers-directed_graphs.ads @@ -8,8 +8,9 @@ private with Ada.Containers.Helpers, Ada.Finalization, - Ada.Streams; - -- maps? sets? + Ada.Streams, + Ada.Containers.Hashed_Maps, + Ada.Containers.Vectors; generic @@ -20,6 +21,14 @@ generic type Node_Label_Type is private; type Edge_Label_Type is private; + with function "=" + (Left, Right : in Node_Label_Type) + return Boolean is <>; + + with function "=" + (Left, Right : in Edge_Label_Type) + return Boolean is <>; + package Ada.Containers.Directed_Graphs is @@ -532,10 +541,201 @@ package Ada.Containers.Directed_Graphs is Position : in Cursor) return Graph_Iterator_Interfaces.Forward_Iterator'Class; + function First + (Container : in Graph) + return Cursor; + + function Last + (Container : in Graph) + return Cursor; + + function Next + (Position : in Cursor) + return Cursor; + + procedure Next + (Position : in out Cursor); + + function Previous + (Position : in Cursor) + return Cursor; + + procedure Previous + (Position : in out Cursor); + private + -- Put Inline Pragmas here + + + + + package Impl is new Helpers.Generic_Implementation; + + package Node_Vectors is new Vectors + (Index_Type => Positive, + Element_Type => Node_Type); + + function To_Hash + (Node : in Node_Type) + return Hash_Type; + + function To_Hash + (Edge : in Edge_Type) + return Hash_Type; + + package Node_Maps is new Hashed_Maps + (Key_Type => Node_Type, + Element_Type => Node_Vectors.Vector, + Hash => To_Hash, + Equivalent_Keys => "=", + "=" => Node_Vectors."="); + + package Node_Label_Maps is new Hashed_Maps + (Key_Type => Node_Type, + Element_Type => Node_Label_Type, + Hash => To_Hash, + Equivalent_Keys => "=", + "=" => "="); + + package Edge_Label_Maps is new Hashed_Maps + (Key_Type => Edge_Type, + Element_Type => Edge_Label_Type, + Hash => To_Hash, + Equivalent_Keys => "=", + "=" => "="); + + + + + type Graph is new Ada.Finalization.Controlled with record + Connections : Node_Maps.Map; + Node_Labels : Node_Label_Maps.Map; + Edge_Labels : Edge_Label_Maps.Map; + Tamper_Info : aliased Helpers.Tamper_Counts; + end record; + + overriding procedure Adjust + (Container : in out Graph); + + overriding procedure Finalize + (Container : in out Graph); + + procedure Write + (Stream : not null access Streams.Root_Stream_Type'Class; + Container : in Graph); + for Graph'Write use Write; + + procedure Read + (Stream : not null access Streams.Root_Stream_Type'Class; + Container : out Graph); + for Graph'Read use Read; + + type Graph_Access is access all Graph; + + Empty_Graph : constant Graph := (Ada.Finalization.Controlled with others => <>); + + + + + type Cursor is record + Container : Graph_Access; + Node : Node_Type := Node_Type'First; + end record; + + procedure Write + (Stream : not null access Streams.Root_Stream_Type'Class; + Position : in Cursor); + for Cursor'Write use Write; + + procedure Read + (Stream : not null access Streams.Root_Stream_Type'Class; + Position : out Cursor); + for Cursor'Read use Read; + + No_Element : constant Cursor := Cursor'(null, Node_Type'First); + + + + + subtype Reference_Control_Type is Impl.Reference_Control_Type; + + type Node_Label_Constant_Reference + (Element : not null access constant Node_Label_Type) is + record + Control : Reference_Control_Type := + raise Program_Error with "uninitialized reference"; + end record; + + procedure Write + (Stream : not null access Streams.Root_Stream_Type'Class; + Item : in Node_Label_Constant_Reference); + for Node_Label_Constant_Reference'Write use Write; + + procedure Read + (Stream : not null access Streams.Root_Stream_Type'Class; + Item : out Node_Label_Constant_Reference); + for Node_Label_Constant_Reference'Read use Read; + + type Node_Label_Reference + (Element : not null access Node_Label_Type) is + record + Control : Reference_Control_Type := + raise Program_Error with "uninitialized reference"; + end record; + + procedure Write + (Stream : not null access Streams.Root_Stream_Type'Class; + Item : in Node_Label_Reference); + for Node_Label_Reference'Write use Write; + + procedure Read + (Stream : not null access Streams.Root_Stream_Type'Class; + Item : out Node_Label_Reference); + for Node_Label_Reference'Read use Read; + + type Edge_Label_Constant_Reference + (Element : not null access constant Edge_Label_Type) is + record + Control : Reference_Control_Type := + raise Program_Error with "uninitialized reference"; + end record; + + procedure Write + (Stream : not null access Streams.Root_Stream_Type'Class; + Item : in Edge_Label_Constant_Reference); + for Edge_Label_Constant_Reference'Write use Write; + + procedure Read + (Stream : not null access Streams.Root_Stream_Type'Class; + Item : out Edge_Label_Constant_Reference); + for Edge_Label_Constant_Reference'Read use Read; + + type Edge_Label_Reference + (Element : not null access Edge_Label_Type) is + record + Control : Reference_Control_Type := + raise Program_Error with "uninitialized reference"; + end record; + + procedure Write + (Stream : not null access Streams.Root_Stream_Type'Class; + Item : in Edge_Label_Reference); + for Edge_Label_Reference'Write use Write; + + procedure Read + (Stream : not null access Streams.Root_Stream_Type'Class; + Item : out Edge_Label_Reference); + for Edge_Label_Reference'Read use Read; + + + + + -- Define Iterators for general iteration and subgraph iteration here + + end Ada.Containers.Directed_Graphs; |