<> <> <> <> <> <<>> DIRECTORY Environment USING [Comparison], ParticularTable USING [Node, NodeRecord, Key, GetKey, CompareKeyToNode]; OrderedSymbolTable: CEDAR DEFINITIONS IMPORTS ParticularTable = BEGIN Node: TYPE = ParticularTable.Node; NodeRecord: TYPE = ParticularTable.NodeRecord; Key: TYPE = ParticularTable.Key; GetKey: PRIVATE PROC [n: Node] RETURNS [Key] = INLINE { RETURN [ParticularTable.GetKey[n]] }; Compare: PRIVATE PROC [k: Key, n: Node] RETURNS [Environment.Comparison] = INLINE { RETURN [ParticularTable.CompareKeyToNode[k, n]] }; Table: TYPE = RECORD [Node]; <> Error: ERROR [ec: ErrorType]; ErrorType: TYPE = { notInitialized, badTable }; <> <> Initialize: PROC [sentinel1, sentinel2: Node]; <> CreateTable: PROC [header: Node] RETURNS [Table]; <> <> DestroyTable: PROC [self: Table]; <> Insert: PROC [self: Table, nodeToInsert: Node, insertKey: Key]; <> <> DuplicateKey: ERROR; Delete: PROC [self: Table, deleteKey: Key] RETURNS [deletedNode: Node]; <> LookupProc: TYPE = PROC [self: Table, lookupKey: Key] RETURNS [Node]; <> Lookup: PROC [self: Table, lookupKey: Key] RETURNS [equalNode: Node]; <> LookupSmallest: PROC [self: Table] RETURNS [smallestNode: Node]; <> LookupNextLarger: PROC [self: Table, lookupKey: Key] RETURNS [largerNode: Node]; <> LookupLargest: PROC [self: Table] RETURNS [largestNode: Node]; <> LookupNextSmaller: PROC [self: Table, lookupKey: Key] RETURNS [smallerNode: Node]; <> Lookup3: PROC [self: Table, lookupKey: Key] RETURNS [leftNode, equalNode, rightNode: Node]; <> EnumerateIncreasing: PROC [self: Table, procToApply: PROC [Node] RETURNS [--stop--BOOL]]; <> <> CheckTable: PROC [self: Table]; <> RootNode: PRIVATE PROC [self: Table] RETURNS [rootNode: Node]; <> END. <> <> <> <<(1) create a ParticularTable definitions module, which must define Node, NodeRecord, Key, GetKey, and CompareKeyToNode as follows:>> <> <<(2) Compile the ParticularTable module created in step 1.>> <<(3) Compile OrderedSymbolTable (this module).>> <<(4) Compile RedBlackTreeImpl (the implementation of this module).>> <<(5) Clients of the package use the OrderedSymbolTable.bcd created in step 3, and the application binds in the RedBlackTreeImpl.bcd created in step 4.>> < file name correspondence is not one-to-one, compiler command-line parameterization controls the different versions, as in:>> <<(3') xxxOrderedSymbolTable _ OrderedSymbolTable[ParticularTable: xxxParticularTable]>> <<(4') xxxRedBlackTreeImpl _ RedBlackTreeImpl[OrderedSymbolTable: xxxOrderedSymbolTable]>> <> <> <> <> <> <> <> <> <> <> <> <> <> <>