summaryrefslogtreecommitdiff
path: root/src/packrat-graphs.ads
diff options
context:
space:
mode:
Diffstat (limited to 'src/packrat-graphs.ads')
-rw-r--r--src/packrat-graphs.ads657
1 files changed, 0 insertions, 657 deletions
diff --git a/src/packrat-graphs.ads b/src/packrat-graphs.ads
deleted file mode 100644
index 6bceaaf..0000000
--- a/src/packrat-graphs.ads
+++ /dev/null
@@ -1,657 +0,0 @@
-
-
-with
-
- Ada.Iterator_Interfaces;
-
-private with
-
- Ada.Containers.Ordered_Maps,
- Ada.Containers.Vectors;
-
-
-generic
- type Label_Enum is (<>);
- type Element is private;
- type Element_Array is array (Positive range <>) of Element;
-package Packrat.Graphs is
-
-
- type Node is private;
-
- type Node_Reference (Data : not null access Node) is limited null record
- with Implicit_Dereference => Data;
-
- type Cursor is private;
-
- type Graph is tagged private
- with Default_Iterator => Iterate,
- Iterator_Element => Node_Reference,
- Variable_Indexing => Node_At;
-
-
-
-
- No_Position : constant Cursor;
-
- Empty_Graph : constant Graph;
-
-
-
-
- function Leaf
- (New_Item : in Element_Array;
- Start : in Positive;
- Finish : in Natural)
- return Node
- with Pre =>
- Finish + 1 >= Start,
- Post =>
- Is_Leaf (Leaf'Result);
-
- function Branch
- (Label : in Label_Enum;
- Start : in Positive;
- Finish : in Natural)
- return Node
- with Pre =>
- Finish + 1 >= Start,
- Post =>
- Is_Branch (Branch'Result);
-
-
-
-
- function Is_Leaf
- (This : in Node)
- return Boolean;
-
- function Is_Branch
- (This : in Node)
- return Boolean;
-
-
-
-
- function Label
- (This : in Node)
- return Label_Enum
- with Pre =>
- Is_Branch (This);
-
- function Elements
- (This : in Node)
- return Element_Array
- with Pre =>
- Is_Leaf (This);
-
- function Start
- (This : in Node)
- return Positive;
-
- function Finish
- (This : in Node)
- return Natural;
-
-
-
-
- function Is_Nothing
- (Position : in Cursor)
- return Boolean;
-
-
-
-
- function Depth
- (Position : in Cursor)
- return Natural;
-
- function Is_Node
- (Position : in Cursor)
- return Boolean
- with Post =>
- (if Is_Node'Result then not Is_Nothing (Position));
-
- function Is_Root
- (Position : in Cursor)
- return Boolean
- with Post =>
- (if Is_Root'Result then
- not Is_Nothing (Position) and
- Is_Nothing (Parent (Position)) and
- Depth (Position) = 0);
-
- function Is_Branch
- (Position : in Cursor)
- return Boolean
- with Post =>
- (if Is_Branch'Result then not Is_Nothing (Position));
-
- function Is_Leaf
- (Position : in Cursor)
- return Boolean
- with Post =>
- (if Is_Leaf'Result then not Is_Nothing (Position));
-
-
-
-
- function Label
- (Position : in Cursor)
- return Label_Enum
- with Pre =>
- Is_Branch (Position);
-
- function Elements
- (Position : in Cursor)
- return Element_Array
- with Pre =>
- Is_Leaf (Position);
-
- function Start
- (Position : in Cursor)
- return Positive
- with Pre =>
- not Is_Nothing (Position);
-
- function Finish
- (Position : in Cursor)
- return Natural
- with Pre =>
- not Is_Nothing (Position);
-
- function Choices
- (Position : in Cursor)
- return Natural;
-
-
-
-
- function Parent
- (Position : in Cursor)
- return Cursor;
-
- function Child_Count
- (Position : in Cursor;
- Choice : in Positive)
- return Natural
- with Pre =>
- Choice <= Choices (Position);
-
- function Child_Count
- (Position : in Cursor)
- return Natural;
-
- function All_Child_Count
- (Position : in Cursor)
- return Natural;
-
- function First_Child
- (Position : in Cursor;
- Choice : in Positive)
- return Cursor
- with Pre =>
- Choice <= Choices (Position),
- Post =>
- Parent (First_Child'Result) = Position;
-
- function Last_Child
- (Position : in Cursor;
- Choice : in Positive)
- return Cursor
- with Pre =>
- Choice <= Choices (Position),
- Post =>
- Parent (Last_Child'Result) = Position;
-
- function First_Child
- (Position : in Cursor)
- return Cursor
- with Post =>
- Parent (First_Child'Result) = Position;
-
- function Last_Child
- (Position : in Cursor)
- return Cursor
- with Post =>
- Parent (Last_Child'Result) = Position;
-
- function Next_Sibling
- (Position : in Cursor)
- return Cursor
- with Post =>
- Parent (Next_Sibling'Result) = Parent (Position);
-
- function Prev_Sibling
- (Position : in Cursor)
- return Cursor
- with Post =>
- Parent (Prev_Sibling'Result) = Parent (Position);
-
- procedure Delete_Children
- (Position : in out Cursor;
- Choice : in Positive)
- with Pre =>
- Choice <= Choices (Position),
- Post =>
- Child_Count (Position, Choice) = 0;
-
- procedure Delete_Children
- (Position : in out Cursor)
- with Post =>
- Child_Count (Position) = 0;
-
- procedure Delete_All_Children
- (Position : in out Cursor)
- with Post =>
- All_Child_Count (Position) = 0;
-
-
-
-
- function Equal_Subgraph
- (Left, Right : in Cursor)
- return Boolean
- with Pre =>
- Is_Node (Left) and Is_Node (Right);
-
- function Subgraph_Node_Count
- (Position : in Cursor)
- return Natural;
-
- function Find_In_Subgraph
- (Position : in Cursor;
- Item : in Element_Array)
- return Cursor
- with Post =>
- Is_Nothing (Find_In_Subgraph'Result) or
- Is_Leaf (Find_In_Subgraph'Result);
-
-
-
-
- function Contains
- (Container : in Graph;
- Position : in Cursor)
- return Boolean
- with Post =>
- (if Contains'Result then not Is_Nothing (Position));
-
-
-
-
- function Singleton
- (Input : in Node)
- return Graph
- with Post =>
- Singleton'Result.Node_Count = 1;
-
- function Node_At
- (Container : in Graph;
- Position : in Cursor)
- return Node_Reference
- with Pre =>
- Contains (Container, Position);
-
-
-
-
- function Is_Empty
- (Container : in Graph)
- return Boolean
- with Post =>
- (if Is_Empty'Result then Container.Node_Count = 0 else Container.Node_Count /= 0);
-
- function Is_Ambiguous
- (Container : in Graph)
- return Boolean;
-
- function Node_Count
- (Container : in Graph)
- return Natural;
-
-
-
-
- function Root_Count
- (Container : in Graph)
- return Natural
- with Post =>
- (if Container.Is_Empty then Root_Count'Result = 0 else Root_Count'Result > 0);
-
- function Root
- (Container : in Graph;
- Index : in Positive)
- return Cursor
- with Pre =>
- Index <= Container.Root_Count;
-
-
-
-
- procedure Append
- (Container : in out Graph;
- Addition : in Graph)
- with Pre =>
- Container.Is_Empty or else Addition.Is_Empty or else
- Finish (Container.Root (Container.Root_Count)) < Start (Addition.Root (1));
-
- procedure Prepend
- (Container : in out Graph;
- Addition : in Graph)
- with Pre =>
- Container.Is_Empty or else Addition.Is_Empty or else
- Start (Container.Root (1)) > Finish (Addition.Root (Addition.Root_Count));
-
- procedure Attach_Choice
- (Container : in out Graph;
- Position : in Cursor;
- Addition : in Graph)
- with Pre =>
- Container.Contains (Position) and Is_Branch (Position) and
- (Addition.Is_Empty or else
- (Start (Position) <= Start (Addition.Root (1)) and
- Finish (Position) >= Finish (Addition.Root (Addition.Root_Count))));
-
-
-
-
- procedure Clear
- (Container : in out Graph)
- with Post =>
- Container.Is_Empty;
-
- procedure Delete_Position
- (Container : in out Graph;
- Position : in out Cursor)
- with Pre'Class =>
- Container.Contains (Position),
- Post'Class =>
- not Container.Contains (Position);
-
-
-
-
- function Find
- (Container : in Graph;
- Item : in Element_Array)
- return Cursor
- with Post =>
- Is_Leaf (Find'Result) or
- Is_Nothing (Find'Result);
-
-
-
-
- package Graph_Iterators is
- new Ada.Iterator_Interfaces (Cursor, Is_Node);
-
- -- Note that if the given Cursor doesn't point to any position,
- -- then the function should assume that the choice is of what root to
- -- select and return that value.
- type Choosing_Function is access function
- (Container : in Graph;
- Position : in Cursor)
- return Natural;
-
- -- This function returns True if a Node pointed to by a Cursor should
- -- be returned, and False if it should be ignored. An example of a
- -- filter that will probably see a decent amount of use would be Is_Leaf.
- type Filter_Function is access function
- (Position : in Cursor)
- return Boolean;
-
-
-
-
- function Default_Choices
- (Container : in Graph;
- Position : in Cursor)
- return Natural;
-
- function Accept_All
- (Position : in Cursor)
- return Boolean;
-
-
-
-
- function Iterate
- (Container : in Graph;
- Start_At : in Cursor := No_Position;
- Choose : in Choosing_Function := Default_Choices'Access;
- Filter : in Filter_Function := Accept_All'Access)
- return Graph_Iterators.Reversible_Iterator'Class
- with Pre =>
- Container.Contains (Start_At) or Is_Nothing (Start_At);
-
- function Iterate_All
- (Container : in Graph;
- Start_At : in Cursor := No_Position;
- Filter : in Filter_Function := Accept_All'Access)
- return Graph_Iterators.Reversible_Iterator'Class
- with Pre =>
- Container.Contains (Start_At) or Is_Nothing (Start_At);
-
-
-
-
-private
-
-
- subtype Node_Index is Positive;
- subtype Extended_Node_Index is Natural;
-
-
-
-
- function Choices
- (My_Graph : in Graph;
- My_Index : in Node_Index)
- return Natural
- with Pre =>
- My_Index <= My_Graph.Node_List.Last_Index;
-
-
- procedure Delete_Loose_Subgraph
- (Container : in out Graph;
- Index : in Node_Index)
- with Pre =>
- Index <= Container.Node_List.Last_Index and then
- Container.Node_List.Element (Index).Kind /= Null_Node;
-
- procedure Delete_Up_Edge
- (Container : in out Graph;
- Current, Parent : in Node_Index)
- with Pre =>
- Container.Up_Edges.Contains (Current) and then
- Container.Up_Edges.Reference (Current).Contains (Parent);
-
- procedure Delete_Down_Edges
- (Container : in out Graph;
- From : in Node_Index;
- Choice : in Positive)
- with Pre =>
- Container.Choices.Contains (From) and then
- Container.Choices.Element (From) > 0 and then
- Container.Down_Edges.Contains ((From, Choice)),
- Post =>
- not Container.Down_Edges.Contains ((From, Choice));
-
-
- function Equal_Subgraph
- (Left_Graph, Right_Graph : in Graph;
- Left_Index, Right_Index : in Node_Index)
- return Boolean
- with Pre =>
- Left_Index <= Left_Graph.Node_List.Last_Index and
- Right_Index <= Right_Graph.Node_List.Last_Index;
-
-
-
-
- package Index_Vectors is new Ada.Containers.Vectors
- (Index_Type => Positive,
- Element_Type => Node_Index);
-
- package Index_Maps is new Ada.Containers.Ordered_Maps
- (Key_Type => Node_Index,
- Element_Type => Node_Index);
-
-
-
-
- function Node_Count
- (Container : in Graph;
- Root_List : in Index_Vectors.Vector)
- return Natural;
-
-
-
-
- type Choice_Down is record
- From : Extended_Node_Index;
- Choice : Natural;
- end record;
-
- function "<"
- (Left, Right : in Choice_Down)
- return Boolean;
-
- package Choice_Down_Vectors is new Ada.Containers.Vectors
- (Index_Type => Positive,
- Element_Type => Choice_Down);
-
-
-
-
- package Choice_Maps is new Ada.Containers.Ordered_Maps
- (Key_Type => Node_Index,
- Element_Type => Natural);
-
- package Edge_Down_Maps is new Ada.Containers.Ordered_Maps
- (Key_Type => Choice_Down,
- Element_Type => Index_Vectors.Vector,
- "=" => Index_Vectors."=");
-
- package Edge_Up_Maps is new Ada.Containers.Ordered_Maps
- (Key_Type => Node_Index,
- Element_Type => Index_Vectors.Vector,
- "=" => Index_Vectors."=");
-
-
-
-
- type Element_Array_Access is access Element_Array;
-
- type Elem_Wrapper is new Ada.Finalization.Controlled with record
- Data : Element_Array_Access;
- end record;
-
- overriding procedure Adjust
- (This : in out Elem_Wrapper);
-
- overriding procedure Finalize
- (This : in out Elem_Wrapper);
-
- function Wrap
- (Data : in Element_Array)
- return Elem_Wrapper;
-
- Empty_Wrapper : constant Elem_Wrapper :=
- (Ada.Finalization.Controlled with Data => null);
-
- type Node_Kind is (Null_Node, Branch_Node, Leaf_Node);
-
- type Node is record
- Kind : Node_Kind;
- Ident : Label_Enum;
- Content : Elem_Wrapper;
- Start : Positive;
- Finish : Natural;
- end record;
-
- package Node_Vectors is new Ada.Containers.Vectors
- (Index_Type => Node_Index,
- Element_Type => Node);
-
-
-
-
- type Cursor is record
- My_Graph : access Graph;
- Index : Extended_Node_Index;
- Track : Choice_Down_Vectors.Vector;
- end record;
-
-
-
-
- type Graph is tagged record
- Root_List : Index_Vectors.Vector;
- Node_List : Node_Vectors.Vector;
- Add_Place : Node_Index;
- Choices : Choice_Maps.Map;
- Down_Edges : Edge_Down_Maps.Map;
- Up_Edges : Edge_Up_Maps.Map;
- end record;
-
-
-
-
- No_Node : constant Node :=
- (Kind => Null_Node,
- Ident => Label_Enum'First,
- Content => Empty_Wrapper,
- Start => 1,
- Finish => 0);
-
- No_Position : constant Cursor :=
- (My_Graph => null,
- Index => 0,
- Track => Choice_Down_Vectors.Empty_Vector);
-
- Empty_Graph : constant Graph :=
- (Root_List => Index_Vectors.Empty_Vector,
- Node_List => Node_Vectors.Empty_Vector,
- Add_Place => 1,
- Choices => Choice_Maps.Empty_Map,
- Down_Edges => Edge_Down_Maps.Empty_Map,
- Up_Edges => Edge_Up_Maps.Empty_Map);
-
-
-
-
- type Iterate_Kind is (Specific_Branch, All_Nodes);
-
- type Reversible_Iterator is new Graph_Iterators.Reversible_Iterator with record
- My_Graph : access Graph;
- Start_Pos : Cursor;
- Rule : Iterate_Kind;
- Choose_Func : Choosing_Function;
- Filter_Func : Filter_Function;
- end record;
-
- overriding function First
- (Object : in Reversible_Iterator)
- return Cursor;
-
- overriding function Next
- (Object : in Reversible_Iterator;
- Place : in Cursor)
- return Cursor;
-
- overriding function Last
- (Object : in Reversible_Iterator)
- return Cursor;
-
- overriding function Previous
- (Object : in Reversible_Iterator;
- Place : in Cursor)
- return Cursor;
-
-
-end Packrat.Graphs;
-
-