OrderedSymbolTable.mesaOrderedSymbolTableisapackageformaintainingsymboltables(keytovaluemaps)withanorderingamongkeys.Theorderingallowsthetabletoperformsearchessuchas"findthesmallestiteminthetablethatislargerthanthisone,"aswellasexact-matchsearches.Thepackage'simplementationusesabinarytreerepresentationof2-3-4trees,calledred-blacktrees;thismeansthatanysearch,insertion,ordeletionfromatableofnitemstakesO(nlogn)time.AtablestoresitemsoftypeNodewithkeysoftypeKey,whereNodeandKeyaredefinedinadefinitionsmodulethatparameterizestheOrderedSymbolTableinterface.AuserofthepackagecreatesasuitabledefinitionsmoduletoparameterizeOrderedSymbolTable,thencompilesOrderedSymbolTableandRedBlackTreeImpl.Lasteditedby:MBrownonNovember10,19826:38pmDIRECTORYEnvironmentUSING[Comparison],ParticularTableUSING[Node,NodeRecord,Key,GetKey,CompareKeyToNode];OrderedSymbolTable:CEDARDEFINITIONSIMPORTSParticularTable=BEGINNode:TYPE=ParticularTable.Node;NodeRecord:TYPE=ParticularTable.NodeRecord;Key:TYPE=ParticularTable.Key;GetKey:PRIVATEPROC[n:Node]RETURNS[Key]=INLINE{RETURN[ParticularTable.GetKey[n]]};Compare:PRIVATEPROC[k:Key,n:Node]RETURNS[Environment.Comparison]=INLINE{RETURN[ParticularTable.CompareKeyToNode[k,n]]};Table:TYPE=RECORD[Node];TheRECORDtypeconstructorallowsmostproceduresbelowtobeinvokedusingobjectnotation.Error:ERROR[ec:ErrorType];ErrorType:TYPE={notInitialized,badTable};Allproceduresbelowwithaself:TableparameterraiseError[badTable]ifselfappearstobemalformed(itmightforinstancebeanormalNodethatwaspassedbymistake.)ProceduresInitialize:PROC[sentinel1,sentinel2:Node];Thisproceduremustbecalledbeforecallinganyproceduresbelow.Callersuppliesthepackageinstancewithtwonodesforitsinternaluse.(Thesenodesaregoneforever;weprovidenowaytoreclaimtheirspace.)CreateTable:PROC[header:Node]RETURNS[Table];!Error[notInitialized](ifInitializehasnotbeencalled.)Callersuppliesanodetorepresentatable.Theprocedurecreatesanemptytableandreturnsit.DestroyTable:PROC[self:Table];Makestableempty,asitwasjustafterCreateTable.Insert:PROC[self:Table,nodeToInsert:Node,insertKey:Key];!DuplicateKey(ifinsertKeyalreadypresentintable).CallerassertsthatCompare[insertKey,nodeToInsert]=equal.InsertsnodeToInsertintotable.ERRORsDuplicateKeyifCompare[insertKey,x]=equalforsomenodexalreadyinthetable.DuplicateKey:ERROR;1pî ìïa¶qî ìï]�îñî‰îêîXî!¬ î)Yî. î2î5Aî7î:Èî>íîBîD4î ìï[æîNî+îçî:îIî �î#Ùî%vî*|î/Ãî2Øî4‰î7÷î:;î?XîBYîC÷îF<î ìïZ?î µîîûîî£î1îáî¥î!V î(öî/î1Ëî7á îAVîD2îE^î ìïX—î ¦ îeîî§î=î"*î((î+àî.„î2·î5”î88î<Ì îB»îDî ìïVðî *î^î²îUî˜î%î°îî Èî"„î ìïTpî rîÊîšî+îÓî½îTî!Tî$hî&î(ùî,#î0 î3¡î6Iî9î;sî@"îAÌîC î ìïRÉîÃî· îOî½î)¸ î0aî2î5 î6Ðî9=î>¢îCAîD—î ìïQ! î)î‘îé î!�î/sî31î9_îFëî ìïOzî ýïMÎîîîïL"îµî¨î îIî!Žî$�rî ýïHÉsîïG rî_ïGîDïGsîŽïGîñïG îïEqrî«ïEqî�ïEqsîÚïEqî=ïEqî d î(Ûî,.î1¿î ýïBrîWïBî"ïBîÒ î&×sî,mïBî->ïB rî6 ïBî7�ïBsîï@lrîVï@lîï@lsî®ï@lî“ï@lîï>À rî¦ï>Àî_ï>Àsîýï>Àîâï>Àîï=rî‚ï=î<ï=sîÚï=î¿ï=tîï;gsîŠï;grîˆï;gî0ï;gîèsîuï;gîØï;gîœrî"Îï;gî#¢ï;gsî(¿ï;gî)"ï;gî ï9»rîï9»înï9»sî…ï9»rîºï9»îŽï9»sî ï9»îoï9»î.tîï8sî[ï8rîXï8îï8î¸sîEï8î¨ï8îaî"´î$xrî(ªï8î)~ï8sî.›ï8î.þï8î ï6crîï6cînï6csî…ï6crîºï6cîŽï6csî ï6cîoï6cð#î5·î7Èîï4¶rîhï4¶î"ï4¶sîÀï4¶rî¥ï4¶îyï4¶sîýï4¶î`ï4¶qî ï3 uîãï3 î®ï3 qî)ï3 î™ï3 î î"î&(î)g î0î3âî5†î7Vîî îî¨îkî“î!oî&vî)³î.î1Ñî4%î7cî`îCîEîGÇîáï–î¬îàtî ýïê sîFïêrîDïêîìïêsîÑïêî4ïêî4rî!fïêî":ïêsî'Wïêî'ºïêqîï>î-îŠîY î#î%�î'óî+îï’î&î2îfî¥îJî# î$?î(oî+2î1^î5Üî7Ïî;Êî?îAÁîFXtî ýïå sîïårîÿïåî¦ïåsî‹ïåîîïåîòqîï9î~îÑî$îÝî5îÕî"nî%¡ tî ýïásîoïárîlïáîïásîùïáî\ïáî`î™ î$�î(¶ î/qqîï5î- î˜îgîjî$'î(Éî*oîï ˆî&îwîIî%U î.î/ìî4hî8Þ îA!îCçîáï áîé îTîªî*·î,pî.Uî1õî4î7†î:Åî<î@ÍîBsîD¿tî ýï 5 sîï 5rîÿï 5î¸ï 5sîï 5vî)ÈïöÿêTVm$wDelete:PROC[self:Table,deleteKey:Key]RETURNS[deletedNode:Node];Removesthe(unique)nodexintablesuchthatCompare[deleteKey,x]=equal,andreturnsit,orreturnsNILifnosuchnodeexists.LookupProc:TYPE=PROC[self:Table,lookupKey:Key]RETURNS[Node];ProceduresLookup,LookupNextLarger,LookupNextSmallercanallbeassignedtoavariableofthistype.Lookup:PROC[self:Table,lookupKey:Key]RETURNS[equalNode:Node];Returnsthe(unique)nodexintablesuchthatCompare[lookupKey,x]=equal,orNILifnosuchnodeexists.LookupSmallest:PROC[self:Table]RETURNS[smallestNode:Node];Returnstheitemintablewithsmallestkey,orNILiftisempty.LookupNextLarger:PROC[self:Table,lookupKey:Key]RETURNS[largerNode:Node];ReturnsthenodeintablewiththesmallestkeystrictlylargerthanlookupKey,orNILifnosuchitemexists.LookupLargest:PROC[self:Table]RETURNS[largestNode:Node];Returnstheitemintablewithlargestkey,orNILiftisempty.LookupNextSmaller:PROC[self:Table,lookupKey:Key]RETURNS[smallerNode:Node];ReturnsthenodeintablewiththelargestkeystrictlysmallerthanlookupKey,orNILifnosuchnodeexists.Lookup3:PROC[self:Table,lookupKey:Key]RETURNS[leftNode,equalNode,rightNode:Node];ThisLookupprocedurereturnsthreenodesintable:[LookupNextSmaller[self,lookupKey],Lookup[self,lookupKey],LookupNextLarger[self,lookupKey]].Notethatinanonemptytable,oneoftheresultsisguaranteed#NIL.(ThisprocedurewasHowardSturgis'idea.)EnumerateIncreasing:PROC[self:Table,procToApply:PROC[Node]RETURNS[--stop--BOOL]];Foreachitemxinthetable,inincreasingorderbykeyvalue,executesprocToApply[x].ReturnswhenprocToApplyreturnsTRUEorwhenallitemshavebeenenumerated.procToApplyisrestricted:itcannotcallotherproceduresinthisinterface.Inparticularitcannotexamineormodifythetablebeingenumerated.SuchenumerationscanbeimplementedusingLookupNextLargerorLookupNextSmaller.CheckTable:PROC[self:Table];ERRORsError[badTable]ifthered-blacktreerepresentingthetableisnotwell-formed.Usedbypackagetestprograms;maybeusedforclientdebuggingofunsafeprograms.RootNode:PRIVATEPROC[self:Table]RETURNS[rootNode:Node];Returnsthetherootofthered-blacktreerepresentingthetable.Usedbypackagetestprogramsonly.END.HowtouseCompilingthepackageThispackageiscompile-timetailorabletoaparticularapplication.Thistailoringisdonewithouteditingthesourcecodeofthepackage'sinterfaceorimplementation.Thisiseasyifonlyoneversionofthepackageistobepartoftheapplication,andsomewhatmoreinvolvediftwoormoreversionsofthepackagearetobepartoftheapplication.Intheformercasetheprocedureis:(1)createaParticularTabledefinitionsmodule,whichmustdefineNode,NodeRecord,Key,GetKey,andCompareKeyToNodeasfollows:2tî ýïa†sîÞïa†rîÛïa†îƒïa†sîhïa†îËïa†îÏî î#rî&cïa†î'7ïa†sî,Tïa†î,·ïa† î5Pqîï_Ôî¬îøîUî“îßî!…î$Øî'õî*Çî6òî8¬î:‘î>‰îA,îEÄîGtîáï^-îyîžîõîèîî Ctî ýïZÉ sîOïZÉrîLïZÉîïZÉsî¤ïZÉrî‰ïZÉî0ïZÉsîïZÉîyïZÉî |î$µ î,Lrî/ªïZÉî0~ïZÉsî5›ïZÉî5ÿïZÉqîïY îõîYî&›î3î5£î7žî9mî>Èî@mîA¡îF·îáïWpîztî ýïU¾sî‚ïU¾rî€ïU¾î(ïU¾sî ïU¾îpïU¾îtî­ î$Drî'¢ïU¾î(uïU¾sî-“ïU¾î-öïU¾ î5zqîïT îîkîÉîîRî øî$Kî'hî*:î7 î8Ãî:¨î> î@YîCîDÕîáïReîþî=tî ýïP³ sî—ïP³rî•ïP³î<ïP³sî!ïP³î…ïP³îˆrî!ÌïP³î" ïP³sî'½ïP³î(!ïP³ î1qîïOîîkîtîîmî iî%�î(qî**î-Pî.¦î/šî1tî ýïMOsîfïMOrîcïMOî ïMOsîðïMOîSïMOîWî#� î+'rî.…ïMOî/YïMOsî4vïMOî4ÙïMO î<ˆqîïKžîîkîªîPî£î Ÿî"ëî(î*›î/î2úî6 î=8î>ñîBîCmîE`îáïIöîêtî ýïHD sîýïHDrîúïHDî¢ïHDsî‡ïHDîêïHDîîrî!2ïHDî"ïHDsî'#ïHDî'†ïHD î/¤qîïF“îîkîtîîmî iî$Äî'¨î)aî,‡î-Ýî.Òî0=tî ýïDásîïDárîþïDáî¥ïDásîŠïDáîîïDáîñî$* î+Árî/ïDáî/óïDásî5ïDáî5tïDá î=ÿqîïC/îîkîªîPî£î Ÿî"ëî'Gî)Òî.Fî2úî6 î=8î>ñîBîCmîE`îáïAˆî tî ýï?Ösî3ï?Örî0ï?ÖîØï?Ösî½ï?Öî ï?Öî$î] î$ôrî(Rï?Öî)&ï?Ösî.Cï?Öî.¦ï?Öî4¾ î$îî*îVî íî$Yî(î)Áî-Žî=- îáï<} î¥ î0î,Ñ î5Nî8¢î;sî=î>NîDwîáï:Õîoîî_î›î î!òî#×î'Ùî+bî1Žî4.î9Yî>[tî ýï7qsî„ï7qrî‚ï7qî)ï7qsîï7qîqï7qî uî$® rî-šï7qî.Aï7qsî1'ï7qî1Šï7qrî5¼ï7qî6�ï7qsî;­ï7qqî<ï7qrî@Jï7qîAï7qsîCvï7qîCÙï7qqîï5Àî¤îËîÓîîÅîî¼î!b î'Éî+Qî-+î/·î3™î9îC„îáï4îc îfuîþï4î·ï4qî"Šï4î#;ï4î$Cî'Åî)Àî-Mî0tî3� îï2f îî} îÌî$î#‘î&'î)§ î0Wî1ýî4– î:üî<Ú îCîD^îáï0¿îJîîvîÂî î#· î+Îî/C î7Šî:î;è îC¾îáï/îÊîƒtî ýï+´ sîï+´rî ï+´î´ï+´sî™ï+´îüï+´îuîï*qîï*îï*îÿîUî ¡î&”î)B î0Õî3!î6uî7àî:D îBkîEÒîáï([î$î¨î îúî!Éî$Úî'î*±î1 î2Äî7tî ýï$÷sîï$÷rî ï$÷îµï$÷îmsîúï$÷î]ï$÷îarî#¥ï$÷î$yï$÷sî)–ï$÷î)ùï$÷î0«qîï#Eîîkî·î‘î4î€î$sî'" î.µî1î51î8˜î:rî?µîB8îáï!žrî ýïìsî…ïìpî ìïèî�îÛwî ìï´îÆîŸqî ìïXî îUîÍ îÍ î!×î#‡î$Ç î*ÿ î2Üî5÷î;tî<ëî@5îEî ìï°î !î9î=îÉîýîî"xî$î.Eî1>î2’î5tî6³î9—î<î@‹îBîDLî ìï î Wî üîËî¤îGî“ îÔîwî%¥î)î.Iî/Ÿî2+î3ãî7Mî î@TîE–îGêî ìïbî ¼î•î9î… îJî(îtî"Ñî%Àî( î.7xî/ïbqî ìï Üî 'î4î|î9 î!Öî&÷î*íî.Lî2[î6Z î>qîAªîFëî ìï 5î¤î]vî)Èïö åTVm$%DIRECTORYEnvironmentUSING[Comparison],...;ParticularTable:DEFINITIONS=BEGINNode:TYPE=REFNodeRecord;NodeRecord:TYPE=...;Mustcontainfields"rbLLink","rbRLink",oftypeNode,and"rbColor",oftypeBOOL.ItislikelythattypeNodeRecordissimplyequatedtoarecordtypefromsomeotherdefsmodule.Key:TYPE=...;Anyoldtypethatallowsallowsthefollowingproceduretobedefined:GetKey:PROC[n:Node]RETURNS[k:Key];Extractsthekeyfromanode.ThisiscalledonlyfromtheprocedureCheckTablebelow,soitneednotbeimplementedifCheckTablewillnotbecalled.CompareKeyToNode:PROC[k:Key,n:Node]RETURNS[Environment.Comparison]...;Comparesabarekeytothekeyembeddedinanode.Result=lessmeanskfilenamecorrespondenceisnotone-to-one,compilercommand-lineparameterizationcontrolsthedifferentversions,asin:(3')xxxOrderedSymbolTable_OrderedSymbolTable[ParticularTable:xxxParticularTable](4')xxxRedBlackTreeImpl_RedBlackTreeImpl[OrderedSymbolTable:xxxOrderedSymbolTable]Aversionofthispackagethatdoesitsownstorageallocation,storesREFANYitems,andcanbeusedfordifferentapplicationswithoutrecompilingisavailableasOrderedSymbolTableRef.ConcurrencyTheimplementationofthispackageisamodulemonitor.Henceforeachinstanceofthispackage,atmostonetableoperationmaybeinprogressatatime.ObjectnotationClientsofthispackagemayuseobjectnotationtocallanyprocedurewhosefirstparameteris"self:Table".Forinstance,write"table.Insert[node,key]"insteadof"OrderedSymbolTable.Insert[table,node,key]".ChangeLogCreatedbyMBrownonMarch2,19824:14pmByeditingOrderedSymbolTableRef.ChangedbyMBrownonMarch8,198212:09pm3uî ìïb&qî2ïb&î%ïb& uî8ïb&îïb&qîRïb&îÀïb& î& î'—î ìï`yuîï`yîëï`y qî:ï`yuîï`yîâï`yqî õï^Ìuîï^Ìî»ï^Ìqîkï^ÌuîPï^Ìîï^Ìqîøï^Ìî ï^Ì î õï] uîï]îÓï]qîƒï]îhï]îõî ýï[rî‡îWîà î! î&lî(î*õî.àî1„ î8<î9ßuî<Äï[rî=‡ï[rqî@ï[rî ýïYÅî �îøî­îîd î î!|î%¶î*¯î,Sî-ˆî1¬î4‘î7Îî;8î ýïXîÀî õïVkuî;ïVkîôïVkqî¥ïVkîŠïVkîî ýïT¾îãî+îîâîùîî!\î'0î-[î/î0Ðî õïSuîDïSîýïSqîÙïSîGïSîuîïSîÐïSqîéïSî WïSî"î ýïQdîpî¼îGî…îºîÕî!åî#Pî'1î*-î-kî/·î5â î=dî ýïO·î ¶îî7îšîj î@î– î'î)­î,î-àî õïN uî&ïN îßïN qî»ïN î)ïN îîî!î"Ðuî&ÑïN î'œïN qî,¶ïN î-$ïN î<ðî>}î ýïL]îJî~îƒîî³îÿî‹î%·î']î(’î ýïJ°î.îîžîÇîîGîfî ‹î#’î&Àî(�î-;uî õïIî ·ïIqî pïIî ìïF}î îmî¹îcî"î&Ãî(iî+-î ìïC÷î îmîFî!Xî ìïApî îmî îÎ î)Lî*ïî-ˆî ìï>êî î¯îVî¥îêîNî�î-Ìî2yî4"î6éî8yî; î=o îD[îGéî ìï=Cî 8î'îÒî wî#;î ìï:¼î äîìîªîî2îðîVî$²î(êî*8î.+ î5†î7ìî=dîB—îDUî ìï9îßî!î#–î/#î2`î5yî:#î<”îA|îD1î ìï7nî¯îùîëîPî!6î$wî)Jî.ƒî2Uî4î6Çî9Ïî<5îAîDÂîG;î ìï5Æî Ò îkîî¿ î#î( î1¹î