summaryrefslogtreecommitdiff
path: root/src/packrat.ads
diff options
context:
space:
mode:
authorJed Barber <jjbarber@y7mail.com>2019-01-26 10:50:36 +1100
committerJed Barber <jjbarber@y7mail.com>2019-01-26 10:50:36 +1100
commitada2593ebd6037cb78ce1ba795f283105d5cff26 (patch)
treec4cba2630898a6dcc5bf0ddac14dfc793cc99f15 /src/packrat.ads
parentab48847797761e0fec0f2c49b8576a646ca3acaa (diff)
Interfaces for Cursors and Graphs added
Diffstat (limited to 'src/packrat.ads')
-rw-r--r--src/packrat.ads289
1 files changed, 289 insertions, 0 deletions
diff --git a/src/packrat.ads b/src/packrat.ads
index 0ee8463..05a8e6a 100644
--- a/src/packrat.ads
+++ b/src/packrat.ads
@@ -182,6 +182,295 @@ package Packrat is
end Tokens;
+
+
+ generic
+ type Label_Enum is (<>);
+ type Element is private;
+ type Element_Array is array (Positive range <>) of Element;
+ package Interfaces is
+
+
+ type Cursor is interface;
+
+
+ function Is_Nothing
+ (Position : in Cursor)
+ return Boolean is abstract;
+
+
+ function Depth
+ (Position : in Cursor)
+ return Natural is abstract
+ with Pre'Class =>
+ not Position.Is_Nothing;
+
+ function Is_Root
+ (Position : in Cursor)
+ return Boolean is abstract
+ with Post'Class =>
+ (if Is_Root'Result then
+ Position.Parent.Is_Nothing and Position.Depth = 0);
+
+ function Is_Branch
+ (Position : in Cursor)
+ return Boolean is abstract
+ with Post'Class =>
+ (if Is_Branch'Result then not Position.Is_Nothing);
+
+ function Is_Leaf
+ (Position : in Cursor)
+ return Boolean is abstract
+ with Post'Class =>
+ (if Is_Leaf'Result then not Position.Is_Nothing);
+
+ function Label
+ (Position : in Cursor)
+ return Label_Enum is abstract
+ with Pre'Class =>
+ Position.Is_Branch;
+
+ function Elements
+ (Position : in Cursor)
+ return Element_Array is abstract
+ with Pre'Class =>
+ Position.Is_Leaf;
+
+
+ function Start
+ (Position : in Cursor)
+ return Positive is abstract
+ with Pre'Class =>
+ not Position.Is_Nothing;
+
+ function Finish
+ (Position : in Cursor)
+ return Natural is abstract
+ with Pre'Class =>
+ not Position.Is_Nothing;
+
+ function Choices
+ (Position : in Cursor)
+ return Natural is abstract;
+
+
+ function Parent
+ (Position : in Cursor)
+ return Cursor is abstract;
+
+ function Child_Count
+ (Position : in Cursor;
+ Choice : in Positive)
+ return Natural is abstract
+ with Pre'Class =>
+ Choice <= Position.Choices;
+
+ function Child_Count
+ (Position : in Cursor)
+ return Natural is abstract;
+
+ function All_Child_Count
+ (Position : in Cursor)
+ return Natural is abstract;
+
+ function First_Child
+ (Position : in Cursor;
+ Choice : in Positive)
+ return Cursor is abstract
+ with Pre'Class =>
+ Choice <= Position.Choices,
+ Post'Class =>
+ First_Child'Result.Is_Nothing or
+ First_Child'Result.Parent = Position;
+
+ function Last_Child
+ (Position : in Cursor;
+ Choice : in Positive)
+ return Cursor is abstract
+ with Pre'Class =>
+ Choice <= Position.Choices,
+ Post'Class =>
+ Last_Child'Result.Is_Nothing or
+ Last_Child'Result.Parent = Position;
+
+ function First_Child
+ (Position : in Cursor)
+ return Cursor is abstract
+ with Post'Class =>
+ First_Child'Result.Is_Nothing or
+ First_Child'Result.Parent = Position;
+
+ function Last_Child
+ (Position : in Cursor)
+ return Cursor is abstract
+ with Post'Class =>
+ Last_Child'Result.Is_Nothing or
+ Last_Child'Result.Parent = Position;
+
+ function Next_Sibling
+ (Position : in Cursor)
+ return Cursor is abstract
+ with Post'Class =>
+ Next_Sibling'Result.Is_Nothing or
+ Next_Sibling'Result.Parent = Position.Parent;
+
+ function Prev_Sibling
+ (Position : in Cursor)
+ return Cursor is abstract
+ with Post'Class =>
+ Prev_Sibling'Result.Is_Nothing or
+ Prev_Sibling'Result.Parent = Position.Parent;
+
+ procedure Delete_Children
+ (Position : in out Cursor;
+ Choice : in Positive) is abstract
+ with Pre'Class =>
+ Choice <= Position.Choices,
+ Post'Class =>
+ Position.Child_Count (Choice) = 0;
+
+ procedure Delete_Children
+ (Position : in out Cursor) is abstract
+ with Post'Class =>
+ Position.Child_Count = 0;
+
+ procedure Delete_All_Children
+ (Position : in out Cursor) is abstract
+ with Post'Class =>
+ Position.All_Child_Count = 0;
+
+
+ function Equal_Subgraph
+ (Left, Right : in Cursor)
+ return Boolean is abstract;
+
+ function Subgraph_Node_Count
+ (Position : in Cursor)
+ return Natural is abstract;
+
+ function Find_In_Subgraph
+ (Position : in Cursor;
+ Item : in Element_Array)
+ return Cursor is abstract
+ with Post'Class =>
+ Find_In_Subgraph'Result.Is_Nothing or
+ Find_In_Subgraph'Result.Is_Leaf;
+
+
+
+
+ type Graph is interface;
+
+
+ function Contains
+ (Container : in Graph;
+ Position : in Cursor'Class)
+ return Boolean is abstract
+ with Post'Class =>
+ (if Contains'Result then not Position.Is_Nothing);
+
+
+ function Leaf
+ (New_Item : in Element_Array;
+ Start : in Positive;
+ Finish : in Natural)
+ return Graph is abstract
+ with Post'Class =>
+ Leaf'Result.Node_Count = 1;
+
+ function Branch
+ (Label : in Label_Enum;
+ Start : in Positive;
+ Finish : in Natural)
+ return Graph is abstract
+ with Post'Class =>
+ Branch'Result.Node_Count = 1;
+
+
+ function Is_Empty
+ (Container : in Graph)
+ return Boolean is abstract
+ with Post'Class =>
+ (if Is_Empty'Result then Container.Node_Count = 0 else Container.Node_Count /= 0);
+
+ function Is_Ambiguous
+ (Container : in Graph)
+ return Boolean is abstract;
+
+ function Node_Count
+ (Container : in Graph)
+ return Natural is abstract;
+
+
+ function Root_Count
+ (Container : in Graph)
+ return Natural is abstract
+ with Post'Class =>
+ (if Container.Is_Empty then Root_Count'Result = 0 else Root_Count'Result > 0);
+
+ function Root
+ (Container : in Graph;
+ Index : in Positive)
+ return Cursor'Class is abstract
+ with Pre'Class =>
+ Index <= Container.Root_Count;
+
+
+ procedure Append
+ (Container : in out Graph;
+ Addition : in Graph) is abstract
+ with Pre'Class =>
+ Container.Is_Empty or else Addition.Is_Empty or else
+ Container.Root (Container.Root_Count).Finish <
+ Addition.Root (1).Start;
+
+ procedure Prepend
+ (Container : in out Graph;
+ Addition : in Graph) is abstract
+ with Pre'Class =>
+ Container.Is_Empty or else Addition.Is_Empty or else
+ Container.Root (1).Start >
+ Addition.Root (Addition.Root_Count).Finish;
+
+ procedure Attach_Choice
+ (Container : in out Graph;
+ Position : in Cursor'Class;
+ Addition : in Graph) is abstract
+ with Pre'Class =>
+ Container.Contains (Position) and Position.Is_Branch and
+ (Addition.Is_Empty or else
+ (Position.Start <= Addition.Root (1).Start and
+ Position.Finish >= Addition.Root (Addition.Root_Count).Finish));
+
+
+ procedure Clear
+ (Container : in out Graph) is abstract
+ with Post'Class =>
+ Container.Is_Empty;
+
+ procedure Delete_Position
+ (Container : in out Graph;
+ Position : in out Cursor'Class) is abstract
+ with Pre'Class =>
+ Container.Contains (Position),
+ Post'Class =>
+ not Container.Contains (Position);
+
+
+ function Find
+ (Container : in Graph;
+ Item : in Element_Array)
+ return Cursor'Class is abstract
+ with Post'Class =>
+ Find'Result.Is_Leaf or
+ Find'Result.Is_Nothing;
+
+
+ end Interfaces;
+
+
+
+
private