/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 ĠMark . Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġres aver . pex Ċ Ċ import ĠPlatform ByteBuffer Ċ import ĠUtility Functions Ċ import Ġres aver . I String Ċ import Ġres aver . List Exception Ċ import Ġjava . io . IOException ĊĊ Ċ /** Ċ Ġ* ĠAn Ġabstraction Ġdescribing Ġa Ġstring Ġtable . Ċ Ġ* Ċ Ġ* Ġ@ author ĠMark ĠF air child Ċ Ġ*/ Ċ class ĠString Table ( input : ĠPlatform ByteBuffer ) Ġ: ĠArrayList < T String ?> () Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġ` T String ` Ġby Ġreading Ġfrom Ġa ĊĠĠĠĠ Ġ* Ġ` Data Input `. ĠNo Ġerror Ġhandling Ġis Ġperformed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput ĠThe Ġinput Ġstream . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġnew Ġ` T String `. ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġread ( input : ĠPlatform ByteBuffer ): ĠTString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= ĠUtility Functions . to Unsigned Int ( input . get Short ()) ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ< Ġ 0 Ġ|| Ġindex Ġ>= Ġthis . size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException ( String . format (" Invalid ĠTString Ġindex : Ġ% d Ġ( size Ġ% d )", Ġindex , Ġthis . size )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġthis [ index ] !! ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ return ĠReturns Ġa Ġre usable Ġinstance Ġof Ġa Ġblank Ġ` T String `. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġblank (): ĠTString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġadd String ( I String . BLANK ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see Ġres aver . ess . Element . write ĊĠĠĠĠ Ġ* Ġ@ param Ġoutput ĠThe Ġoutput Ġstream . ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġwrite ( output : ĠPlatform ByteBuffer ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoutput . put Short ( this . size . to Short ()) ĊĠĠĠĠĠĠĠ Ġfor Ġ( t str Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġt str ?. write Full ( output ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIOException (" Error Ġwriting Ġstring Ġ# ${ t str ?. INDEX Ġ?: Ġ 0 }", Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe builds Ġthe Ġstring Ġtable . ĠThis Ġis Ġnecessary Ġif ĠANY Ġstrings Ġin ĠANY Ġof Ġthe ĊĠĠĠĠ Ġ* ĠP ex 's Ġmembers Ġhas Ġchanged Ġat Ġall . ĠOtherwise , Ġwriting Ġthe ĠP ex Ġwill Ġproduce ĊĠĠĠĠ Ġ* Ġan Ġinvalid Ġfile . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġin Use ĠThe Ġ` Set ` Ġof Ġstrings Ġthat Ġare Ġstill Ġin Ġuse . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġrebuild String Table ( in Use : ĠSet < T String ?> ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġthis . retain All ( this ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ@ see Ġres aver . ess . Element . calculate Size ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġsize Ġof Ġthe Ġ` Element ` Ġin Ġbytes . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġcalculate Size (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġsum Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġsum Ġ+= Ġif Ġ( this . size Ġ> Ġ 0 xFF F 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 6 ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 2 ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġfor Ġ( t String Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcalculate Size Ġ= Ġt String ?. calculate Size () ?: Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ+= Ġcalculate Size ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġsum Ġ+= Ġresult ĊĠĠĠĠĠĠĠ Ġreturn Ġsum ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġa Ġnew Ġstring Ġto Ġthe Ġ` String Table ` Ġand Ġreturns Ġthe ĊĠĠĠĠ Ġ* Ġcorresponding Ġ` T String `. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġval ĠThe Ġvalue Ġof Ġthe Ġnew Ġstring . ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġnew Ġ` T String `, Ġor Ġthe Ġexisting Ġone Ġif Ġthe ĊĠĠĠĠ Ġ* Ġ` String Table ` Ġalready Ġcontained Ġa Ġmatch . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġadd String (` val `: ĠI String ?): ĠTString Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmatch : ĠTString ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( v Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( v ?. equals (` val `) Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Ġ= Ġv ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( match Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmatch ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġt str Ġ= ĠTString (` val `, Ġthis . size ) ĊĠĠĠĠĠĠĠ Ġthis . add ( t str ) ĊĠĠĠĠĠĠĠ Ġreturn Ġt str ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġnew Ġ` Data Input ` Ġby Ġreading Ġfrom Ġa ĊĠĠĠĠ Ġ* Ġ` LittleEndian ByteBuffer `. ĠNo Ġerror Ġhandling Ġis Ġperformed . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinput ĠThe Ġinput Ġstream . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġstr Count Ġ= ĠUtility Functions . to Unsigned Int ( input . get Short ()) ĊĠĠĠĠĠĠĠ Ġensure Capacity ( str Count ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġstr Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠSTR Ġ= Ġmf . Buffer Util . get UTF ( input ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠT STR Ġ= ĠTString ( STR , Ġi ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis . add ( T STR ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ex : ĠRuntimeException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠList Exception (" Error Ġreading Ġstring ", Ġi , Ġstr Count , Ġex ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }