-- 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;

  }.