/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 0 ĠThe ĠGu ava ĠAuthors Ċ Ġ* Ċ Ġ* Ġ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 Ġok replay Ċ Ċ import Ġjava . util . Bit Set Ċ Ċ import Ġok replay . Util . check Argument Ċ import Ġok replay . Util . checkNotNull Ċ import Ġok replay . Util . check Position Index Ċ Ċ // ĠConstructors Ċ Ċ /** Ċ Ġ* ĠConstructor Ġfor Ġuse Ġby Ġsubclasses . ĠWhen Ġsubclass ing , Ġyou Ġmay Ġwant Ġto Ġoverride Ċ Ġ* Ġ` toString ()` Ġto Ġprovide Ġa Ġuseful Ġdescription . Ċ Ġ*/ Ċ internal Ġabstract Ġclass ĠChar Matcher Ġ: ĠPredicate < Char > Ġ{ ĊĊĠ Ġ// ĠAbstract Ġmethods ĊĊĠ Ġ/** ĠDetermines Ġa Ġtrue Ġor Ġfalse Ġvalue Ġfor Ġthe Ġgiven Ġcharacter . Ġ Ġ*/ ĊĠ Ġabstract Ġfun Ġmatches ( c : ĠChar ): ĠBoolean ĊĊĠ Ġ// ĠNon - static Ġfactories ĊĊĠ Ġ/** ĠReturns Ġa Ġmatcher Ġthat Ġmatches Ġany Ġcharacter Ġmatched Ġby Ġboth Ġthis Ġmatcher Ġand Ġ` other `. Ġ*/ ĊĠ Ġopen Ġfun Ġand ( other : ĠChar Matcher ): ĠChar Matcher Ġ{ ĊĠĠĠ Ġreturn ĠAnd ( this , Ġother ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠReturns Ġa Ġmatcher Ġthat Ġmatches Ġany Ġcharacter Ġmatched Ġby Ġeither Ġthis Ġmatcher Ġor Ġ` other `. Ġ*/ ĊĠ Ġopen Ġfun Ġor ( other : ĠChar Matcher ): ĠChar Matcher Ġ{ ĊĠĠĠ Ġreturn ĠOr ( this , Ġother ) ĊĠ Ġ} ĊĊĠ Ġ/** ĠSets Ġbits Ġin Ġ` table ` Ġmatched Ġby Ġthis Ġmatcher . Ġ*/ ĊĠ Ġinternal Ġopen Ġfun Ġset Bits ( table : ĠBit Set ) Ġ{ ĊĠĠĠ Ġvar Ġc Ġ= ĠCharacter . MAX _ VALUE . toInt () ĊĠĠĠ Ġwhile Ġ( c Ġ>= ĠCharacter . MIN _ VALUE . toInt ()) Ġ{ ĊĠĠĠĠĠ Ġif Ġ( matches ( c . to Char ())) Ġ{ ĊĠĠĠĠĠĠĠ Ġtable . set ( c ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġc -- ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠText Ġprocessing Ġroutines ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠReturns Ġthe Ġindex Ġof Ġthe Ġfirst Ġmatching Ġcharacter Ġin Ġa Ġcharacter Ġsequence , Ġstarting Ġfrom Ġa ĊĠĠ Ġ* Ġgiven Ġposition , Ġor Ġ`- 1 ` Ġif Ġno Ġcharacter Ġmatches Ġafter Ġthat Ġposition . ĊĊĠĠ Ġ* ĊĠĠ Ġ* ĠThe Ġdefault Ġimplementation Ġiter ates Ġover Ġthe Ġsequence Ġin Ġforward Ġorder , Ġbeginning Ġat Ġ` start `, ĊĠĠ Ġ* Ġcalling Ġ[. matches ] Ġfor Ġeach Ġcharacter . ĊĊĠĠ Ġ* Ġ@ param Ġsequence Ġthe Ġcharacter Ġsequence Ġto Ġexamine ĊĠĠ Ġ* Ġ* ĊĠĠ Ġ* Ġ@ param Ġstart Ġthe Ġfirst Ġindex Ġto Ġexamine ; Ġmust Ġbe Ġnon negative Ġand Ġno Ġgreater Ġthan Ġ` sequence . length ()` ĊĠĠ Ġ* Ġ* ĊĠĠ Ġ* Ġ@ return Ġthe Ġindex Ġof Ġthe Ġfirst Ġmatching Ġcharacter , Ġguaranteed Ġto Ġbe Ġno Ġless Ġthan Ġ` start `, ĊĠĠ Ġ* Ġ* ĠĠĠĠ Ġor Ġ`- 1 ` Ġif Ġno Ġcharacter Ġmatches ĊĠĠ Ġ* Ġ* ĊĠĠ Ġ* Ġ@ throws ĠIndex OutOfBoundsException Ġif Ġstart Ġis Ġnegative Ġor Ġgreater Ġthan Ġ` sequence . length ()` ĊĠĠ Ġ*/ ĊĠ Ġopen Ġfun Ġindex In ( sequence : ĠCharSequence , Ġstart : ĠInt ): ĠInt Ġ{ ĊĠĠĠ Ġval Ġlength Ġ= Ġsequence . length ĊĠĠĠ Ġcheck Position Index ( start , Ġlength ) ĊĠĠĠ Ġreturn Ġ( start .. length Ġ- Ġ 1 ). first OrNull Ġ{ Ġmatches ( sequence [ it ]) Ġ} Ġ?: Ġ- 1 ĊĠ Ġ} ĊĊĠ Ġ@ Deprecated (" Provided Ġonly Ġto Ġsatisfy Ġthe ĠPredicate Ġinterface ; Ġuse Ġmatches Ġinstead .") ĊĠ Ġoverride Ġfun Ġapply ( character : ĠChar ?): ĠBoolean Ġ{ ĊĠĠĠ Ġreturn Ġmatches ( character !! ) ĊĠ Ġ} ĊĊĠ Ġ// ĠFast Ġmatch ers ĊĊĠ Ġ/** ĠA Ġmatcher Ġfor Ġwhich Ġpre computation Ġwill Ġnot Ġyield Ġany Ġsignificant Ġbenefit . Ġ Ġ*/ ĊĠ Ġinternal Ġabstract Ġclass ĠFast Matcher Ġ: ĠChar Matcher () ĊĊĠ Ġ/** Ġ[ Fast Matcher ] Ġwhich Ġoverrides Ġ` toString ()` Ġwith Ġa Ġcustom Ġname . Ġ Ġ*/ ĊĠ Ġinternal Ġabstract Ġclass ĠNamed Fast Matcher ( description : ĠString ) Ġ: ĠFast Matcher () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġdescription : ĠString Ġ= ĠcheckNotNull ( description ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġdescription ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠStatic Ġconstant Ġimplementation Ġclasses ĊĊĠ Ġ/** ĠImplementation Ġof Ġ[. none ]. Ġ Ġ*/ ĊĠ Ġprivate Ġclass ĠNone Ġprivate Ġconstructor () Ġ: ĠNamed Fast Matcher (" Char Matcher . none () ") Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġmatches ( c : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġindex In ( sequence : ĠCharSequence , Ġstart : ĠInt ): ĠInt Ġ{ ĊĠĠĠĠĠ Ġval Ġlength Ġ= Ġsequence . length ĊĠĠĠĠĠ Ġcheck Position Index ( start , Ġlength ) ĊĠĠĠĠĠ Ġreturn Ġ- 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġand ( other : ĠChar Matcher ): ĠChar Matcher Ġ{ ĊĠĠĠĠĠ ĠcheckNotNull ( other ) ĊĠĠĠĠĠ Ġreturn Ġthis ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġor ( other : ĠChar Matcher ): ĠChar Matcher Ġ{ ĊĠĠĠĠĠ Ġreturn ĠcheckNotNull ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠĠĠ Ġinternal Ġval ĠINSTANCE Ġ= ĠNone () ĊĠĠĠ Ġ} ĊĊĠ Ġ} ĊĊĠ Ġ// ĠNon - static Ġfactory Ġimplementation Ġclasses ĊĊĠ Ġ/** ĠImplementation Ġof Ġ[. and ]. Ġ Ġ*/ ĊĠ Ġprivate Ġclass ĠAnd Ġinternal Ġconstructor ( ĊĠĠĠĠĠ Ġa : ĠChar Matcher , Ġb : ĠChar Matcher , ĊĠĠĠĠĠ Ġinternal Ġval Ġfirst : ĠChar Matcher Ġ= ĠcheckNotNull ( a )) Ġ: ĠChar Matcher () Ġ{ ĊĊĠĠĠ Ġinternal Ġval Ġsecond : ĠChar Matcher Ġ= ĠcheckNotNull ( b ) ĊĊĠĠĠ Ġoverride Ġfun Ġmatches ( c : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfirst . matches ( c ) Ġ&& Ġsecond . matches ( c ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Bits ( table : ĠBit Set ) Ġ{ ĊĠĠĠĠĠ Ġval Ġtmp 1 Ġ= ĠBit Set () ĊĠĠĠĠĠ Ġfirst . set Bits ( tmp 1 ) ĊĠĠĠĠĠ Ġval Ġtmp 2 Ġ= ĠBit Set () ĊĠĠĠĠĠ Ġsecond . set Bits ( tmp 2 ) ĊĠĠĠĠĠ Ġtmp 1 . and ( tmp 2 ) ĊĠĠĠĠĠ Ġtable . or ( tmp 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġ" Char Matcher . and ($ first , Ġ$ second )" ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĠImplementation Ġof Ġ[. or ]. Ġ Ġ*/ ĊĠ Ġprivate Ġclass ĠOr Ġinternal Ġconstructor ( a : ĠChar Matcher , Ġb : ĠChar Matcher ) Ġ: ĠChar Matcher () Ġ{ ĊĠĠĠ Ġinternal Ġval Ġfirst : ĠChar Matcher Ġ= ĠcheckNotNull ( a ) ĊĠĠĠ Ġinternal Ġval Ġsecond : ĠChar Matcher Ġ= ĠcheckNotNull ( b ) ĊĊĠĠĠ Ġoverride Ġfun Ġset Bits ( table : ĠBit Set ) Ġ{ ĊĠĠĠĠĠ Ġfirst . set Bits ( table ) ĊĠĠĠĠĠ Ġsecond . set Bits ( table ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmatches ( c : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġfirst . matches ( c ) Ġ|| Ġsecond . matches ( c ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġ" Char Matcher . or ($ first , Ġ$ second )" ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ// ĠStatic Ġfactory Ġimplementations ĊĊĠ Ġ/** ĠImplementation Ġof Ġ[. is ]. Ġ Ġ*/ ĊĠ Ġprivate Ġclass ĠIs Ġinternal Ġconstructor ( private Ġval Ġmatch : ĠChar ) Ġ: ĠFast Matcher () Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġmatches ( c : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġc Ġ== Ġmatch ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġand ( other : ĠChar Matcher ): ĠChar Matcher Ġ{ ĊĠĠĠĠĠ Ġreturn Ġif Ġ( other . matches ( match )) Ġthis Ġelse Ġnone () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġor ( other : ĠChar Matcher ): ĠChar Matcher Ġ{ ĊĠĠĠĠĠ Ġreturn Ġif Ġ( other . matches ( match )) Ġother Ġelse Ġsuper . or ( other ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Bits ( table : ĠBit Set ) Ġ{ ĊĠĠĠĠĠ Ġtable . set ( match . toInt ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġ" Char Matcher . is ('" Ġ+ Ġshow Character ( match ) Ġ+ Ġ" ')" ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġ/** ĠImplementation Ġof Ġ[. in Range ]. Ġ Ġ*/ ĊĠ Ġprivate Ġclass ĠIn Range Ġinternal Ġconstructor ( ĊĠĠĠĠĠ Ġprivate Ġval Ġstart Inclusive : ĠChar , ĊĠĠĠĠĠ Ġprivate Ġval Ġend Inclusive : ĠChar ) Ġ: ĠFast Matcher () Ġ{ ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠ Ġcheck Argument ( end Inclusive Ġ>= Ġstart Inclusive ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmatches ( c : ĠChar ): ĠBoolean Ġ{ ĊĠĠĠĠĠ Ġreturn Ġc Ġin Ġstart Inclusive .. end Inclusive ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġset Bits ( table : ĠBit Set ) Ġ{ ĊĠĠĠĠĠ Ġtable . set ( start Inclusive . toInt (), Ġend Inclusive . toInt () Ġ+ Ġ 1 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠ Ġreturn Ġ" Char Matcher . in Range (' ${ show Character ( start Inclusive )} ', Ġ'${ show Character ( end Inclusive )} ')" ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġ// ĠConstant Ġmatcher Ġfactory Ġmethods ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠMat ches Ġno Ġcharacters . ĊĊĠĠĠĠ Ġ* Ġ@ since Ġ 1 9 . 0 Ġ( since Ġ 1 . 0 Ġas Ġconstant Ġ` NONE `) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġnone (): ĠChar Matcher Ġ{ ĊĠĠĠĠĠ Ġreturn ĠNone . INSTANCE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠStatic Ġfactories ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġ` char ` Ġmatcher Ġthat Ġmatches Ġonly Ġone Ġspecified Ġcharacter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġ` is `( match : ĠChar ): ĠChar Matcher Ġ{ ĊĠĠĠĠĠ Ġreturn ĠIs ( match ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġ` char ` Ġmatcher Ġthat Ġmatches Ġany Ġcharacter Ġin Ġa Ġgiven Ġrange Ġ( both Ġendpoints Ġare ĊĠĠĠĠ Ġ* Ġinclusive ). ĠFor Ġexample , Ġto Ġmatch Ġany Ġlowercase Ġletter Ġof Ġthe ĠEnglish Ġalphabet , Ġuse ĊĠĠĠĠ Ġ* Ġ` Char Matcher . in Range (' a ', Ġ' z ') `. ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalArgumentException Ġif Ġ` end Inclusive Ġ< Ġstart Inclusive ` ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġin Range ( start Inclusive : ĠChar , Ġend Inclusive : ĠChar ): ĠChar Matcher Ġ{ ĊĠĠĠĠĠ Ġreturn ĠIn Range ( start Inclusive , Ġend Inclusive ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe ĠJava ĠUnicode Ġescape Ġsequence Ġfor Ġthe Ġgiven Ġcharacter , Ġin Ġthe Ġform Ġ"\ u 1 2 AB " Ġwhere ĊĠĠĠĠ Ġ* Ġ" 1 2 AB " Ġis Ġthe Ġfour Ġhexadecimal Ġdigits Ġrepresenting Ġthe Ġ 1 6 Ġbits Ġof Ġthe ĠUTF - 1 6 Ġcharacter . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġshow Character ( c : ĠChar ): ĠString Ġ{ ĊĠĠĠĠĠ Ġvar Ġc Ġ= Ġc ĊĠĠĠĠĠ Ġval Ġhex Ġ= Ġ" 0 1 2 3 4 5 6 7 8 9 ABCDEF " ĊĠĠĠĠĠ Ġval Ġtmp Ġ= Ġchar ArrayOf ('\\ ', Ġ' u ', Ġ'\ u 0 0 0 0 ', Ġ'\ u 0 0 0 0 ', Ġ'\ u 0 0 0 0 ', Ġ'\ u 0 0 0 0 ') ĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 .. 3 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtmp [ 5 Ġ- Ġi ] Ġ= Ġhex [ c . toInt () Ġand Ġ 0 xF ] ĊĠĠĠĠĠĠĠ Ġc Ġ= Ġ( c . toInt () Ġshr Ġ 4 ). to Char () ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġreturn ĠString ( tmp ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ