-- file Table.Mesa
-- last modified by Satterthwaite, July 30, 1980  10:32 AM
-- Copyright  Xerox Corporation 1979, 1980
DIRECTORY
  Bases: TYPE USING [
    Base, BaseDescriptor, Finger, Index, IPointer, Limit, OrderedIndex,
    SizeDescriptor];
Table: DEFINITIONS =
  BEGIN
  Selector: TYPE = CARDINAL;
  Base: TYPE = Bases.Base;
  Finger: TYPE = Bases.Finger;
  Limit: CARDINAL = Bases.Limit;
  Index: TYPE = Bases.Index;
  OrderedIndex: TYPE = Bases.OrderedIndex;
  IPointer: TYPE = Bases.IPointer;
  BaseDescriptor: TYPE = Bases.BaseDescriptor;
  SizeDescriptor: TYPE = Bases.SizeDescriptor;
  -- allocation from the tables as stacks
  Allocate: PROC [table: Table.Selector, size: CARDINAL]
    RETURNS [Table.OrderedIndex];
  Bounds: PROC [table: Table.Selector] RETURNS [base: Table.Base, size: CARDINAL];
  Top: PROC [table: Table.Selector] RETURNS [Table.OrderedIndex] = INLINE {
    RETURN[FIRST[Table.OrderedIndex] + Bounds[table].size]};
  Trim: PROC [table: Table.Selector, size: CARDINAL];
  -- allocation from free list (first table only)
  chunkType: Table.Selector = FIRST[Table.Selector];
  GetChunk: PROC [size: CARDINAL] RETURNS [Table.Index];
  FreeChunk: PROC [index: Table.Index, size: CARDINAL];
  -- inquiries
  WordsUsed: PROC RETURNS [CARDINAL];
  WordsFree: PROC RETURNS [CARDINAL];
  -- notification of repacking
  Notifier: TYPE = PROC [base: Table.BaseDescriptor];
  AddNotify: PROC [proc: Table.Notifier];
  DropNotify: PROC [proc: Table.Notifier];
  -- initialization and termination
  Region: TYPE = RECORD [origin: Table.Base, size: CARDINAL];
  Create: PROC [region: Table.Region, weights: DESCRIPTOR FOR ARRAY OF CARDINAL];
  Destroy: PROC;
  Overflow: SIGNAL RETURNS [Region];
  Failure: ERROR [table: Table.Selector];
  END.