-- file SMTreeOps.mesa
-- last modified by Satterthwaite, June 27, 1983 9:47 am
-- edit by Schmidt, May 4, 1982 4:10 pm
DIRECTORY
SMTree: TYPE Tree USING [
AttrId, Ext, Leaf, Link, Handle, Id, Info, Name, NodeName, SonId, Text, null];
SMTreeOps: CEDAR DEFINITIONS~{
OPEN Tree~~SMTree, TreeOps~~SMTreeOps;
-- tree manager (with state)
TreeManager: TYPE;
TM: TYPE~REF TreeManager;
Create: PROC[zone: ZONE] RETURNS[TM];
Initialize: PROC[tm: TM];
Reset, Finalize: PROC[tm: TM];
-- tree construction interface (requires state from tree manager)
Zone: PROC[tm: TM] RETURNS[ZONE];
PushTree: PROC[tm: TM, v: Tree.Link];
PopTree: PROC[tm: TM] RETURNS[Tree.Link];
InsertTree: PROC[TM, Tree.Link, NAT];
ExtractTree: PROC[TM, NAT] RETURNS[Tree.Link];
MakeNode: PROC[tm: TM, name: Tree.NodeName, count: INTEGER] RETURNS[Tree.Link];
PushNode: PROC[tm: TM, name: Tree.NodeName, count: INTEGER];
PushName: PROC[tm: TM, name: Tree.Name]~INLINE { -- Name
tm.PushTree[name]};
PushId: PROC[tm: TM, id: Tree.Id]~INLINE { -- Id
tm.PushTree[id]};
PushLit: PROC[tm: TM, lti: Tree.Leaf]~INLINE { -- LTIndex
tm.PushTree[lti]};
PushText: PROC[tm: TM, text: Tree.Text]~INLINE { -- Text
tm.PushTree[text]};
SetInfo: PROC[tm: TM, info: Tree.Info];
SetAttr: PROC[tm: TM, attr: Tree.AttrId, value: BOOL];
SetExt: PROC[tm: TM, ext: Tree.Ext];
FreeTree: PROC[tm: TM, t: Tree.Link] RETURNS[Tree.Link]~INLINE {RETURN [Tree.null]};
-- tree attributes (no state required)
GetName: PROC[t: Tree.Link] RETURNS[Tree.Name];
GetNode: PROC[t: Tree.Link] RETURNS[Tree.Handle];
GetId: PROC[t: Tree.Link] RETURNS[Tree.Id];
NSons: PROC[t: Tree.Link] RETURNS[NAT];
NthSon: PROC[t: Tree.Link, n: Tree.SonId] RETURNS[Tree.Link];
PutNthSon: PROC[t: Tree.Link, n: Tree.SonId, v: Tree.Link];
OpName: PROC[t: Tree.Link] RETURNS[Tree.NodeName];
GetAttr: PROC[t: Tree.Link, attr: Tree.AttrId] RETURNS[BOOL];
PutAttr: PROC[t: Tree.Link, attr: Tree.AttrId, value: BOOL];
GetInfo: PROC[t: Tree.Link] RETURNS[Tree.Info];
PutInfo: PROC[t: Tree.Link, value: Tree.Info];
GetExt: PROC[t: Tree.Link] RETURNS[Tree.Ext];
PutExt: PROC[t: Tree.Link, ext: Tree.Ext];
-- tree scanning
Scan: TYPE~PROC[t: Tree.Link];
Test: TYPE~PROC[t: Tree.Link] RETURNS[BOOL];
ScanSons: PROC[root: Tree.Link, action: TreeOps.Scan];
SearchSons: PROC[root: Tree.Link, test: TreeOps.Test];
-- tree mapping (requires tree manager)
Map: TYPE~PROC[tm: TM, t: Tree.Link] RETURNS[v: Tree.Link];
UpdateSons: PROC[tm: TM, root: Tree.Link, map: TreeOps.Map];
UpdateLeaves: PROC[tm: TM, root: Tree.Link, map: TreeOps.Map] RETURNS[v: Tree.Link];
-- synchronizing external tree walks
StartVisit: PROC[tm: TM] RETURNS[mark: BOOL];
EndVisit: PROC[tm: TM];
-- tree copying
CopyTree: PROC[tm: TM, root: Tree.Link, map: TreeOps.Map] RETURNS[v: Tree.Link];
IdentityMap: TreeOps.Map;
}.