/* Ċ Ġ* ĠCopyright Ġ 2 0 1 9 ĠPoly ĠForest , ĠLLC Ċ Ġ* Ċ Ġ* Ġ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 Ġcom . ac orn ui . collection Ċ Ċ import Ġcom . ac orn ui . recycle . Object Pool Ċ Ċ fun Ġ< K , ĠV > ĠMap < K , ĠV >. contains All Keys ( keys : ĠArray < K >): ĠBoolean Ġ{ Ċ ĉ for Ġ( i Ġin Ġ 0 .. keys . last Index ) Ġ{ Ċĉ ĉ if Ġ(! containsKey ( keys [ i ])) Ġ{ Ċĉĉ ĉ return Ġfalse Ċĉ ĉ } Ċ ĉ } Ċ ĉ return Ġtrue Ċ } Ċ Ċ fun Ġ< K , ĠV > ĠMap < K , ĠV >. copy (): ĠMutable Map < K , ĠV > Ġ{ Ċ ĉ val Ġm Ġ= ĠHashMap < K , ĠV >() Ċ ĉ m . put All ( this ) Ċ ĉ return Ġm Ċ } Ċ Ċ val Ġmap Pool Ġ= Ġobject Ġ: ĠObject Pool < Mutable Map < *, Ġ* >> ({ ĠHashMap < Any ?, ĠAny ?> () Ġ}) Ġ{ Ċ ĉ override Ġfun Ġfree ( obj : ĠMutable Map < *, Ġ* >) Ġ{ Ċĉ ĉ obj . clear () Ċĉ ĉ super . free ( obj ) Ċ ĉ } Ċ } Ċ Ċ /** Ċ Ġ* ĠUses Ġa Ġtransform Ġmethod Ġto Ġcreate Ġentries Ġto Ġput Ġinside Ġthe Ġ[ other ] Ġmap . Ċ Ġ* Ċ Ġ* Ġ@ param Ġother ĠThe Ġmap Ġto Ġput Ġthe Ġtransformed Ġkeys Ġand Ġvalues Ġinto . Ċ Ġ* Ġ@ param Ġtransform ĠA Ġtransform Ġmethod Ġto Ġconvert Ġkeys Ġand Ġvalues Ġfrom Ġthe Ġreceiver Ġto Ġnew Ġkeys Ġand Ġvalues . Ċ Ġ* Ġ@ return ĠReturns Ġthe Ġ[ other ] Ġmap . Ċ Ġ*/ Ċ inline Ġfun Ġ< K , ĠV , ĠK 2 , ĠV 2 > ĠMap < K , ĠV >. map To ( other : ĠMutable Map < K 2 , ĠV 2 > Ġ= ĠHashMap (), Ġtransform : Ġ( key : ĠK , Ġvalue : ĠV ) Ġ-> ĠPair < K 2 , ĠV 2 >): ĠMutable Map < K 2 , ĠV 2 > Ġ{ Ċ ĉ for Ġ(( key , Ġvalue ) Ġin Ġthis ) Ġ{ Ċĉ ĉ val Ġ( new Key , ĠnewValue ) Ġ= Ġtransform ( key , Ġvalue ) Ċĉ ĉ other [ new Key ] Ġ= ĠnewValue Ċ ĉ } Ċ ĉ return Ġother Ċ } Ċ Ċ fun Ġ< K , ĠV > ĠMap < K , ĠV ?> . to NotNull (): ĠMutable Map < K , ĠV > Ġ{ Ċ ĉ val Ġnew Map Ġ= ĠHashMap < K , ĠV >() Ċ ĉ for Ġ(( k , Ġv ) Ġin Ġentries ) Ġ{ Ċĉ ĉ if Ġ( v Ġ!= Ġnull ) Ċĉĉ ĉ new Map [ k ] Ġ= Ġv Ċ ĉ } Ċ ĉ return Ġnew Map Ċ } Ċ Ċ class ĠHashMap WithDefault < K , ĠV >( private Ġval Ġwrapped : ĠMutable Map < K , ĠV > Ġ= ĠHashMap (), Ġprivate Ġval Ġdefault Provider : Ġ( K ) Ġ-> ĠV ) Ġ: ĠMutable Map < K , ĠV > Ġby Ġwrapped , ĠMutable Map WithDefault < K , ĠV > Ġ{ ĊĊ ĉ override Ġfun Ġget ( key : ĠK ): ĠV Ġ{ Ċĉ ĉ if Ġ(! wrapped . containsKey ( key )) Ġ{ Ċĉĉ ĉ put ( key , Ġdefault Provider ( key )) Ċĉ ĉ } Ċĉ ĉ return Ġwrapped [ key ] !! Ċ ĉ } Ċ } Ċ Ċ interface ĠMap WithDefault < K , Ġout ĠV > Ġ: ĠMap < K , ĠV > Ġ{ Ċ ĉ override Ġfun Ġget ( key : ĠK ): ĠV Ċ } Ċ Ċ interface ĠMutable Map WithDefault < K , ĠV > Ġ: ĠMutable Map < K , ĠV >, ĠMap WithDefault < K , ĠV > Ċ Ċ /** Ċ Ġ* ĠSimilar Ġto Ġget Or Put Ġexcept Ġif Ġthe Ġmap Ġcontains Ġa Ġnull Ġvalue Ġfor Ġthe Ġgiven Ġkey , Ġnull Ġwill Ġbe Ġreturned . Ċ Ġ* Ċ Ġ* ĠReturns Ġthe Ġvalue Ġfor Ġthe Ġgiven Ġkey . ĠIf Ġthe Ġkey Ġis Ġnot Ġfound Ġin Ġthe Ġmap , Ġcalls Ġthe Ġ[ defaultValue ] Ġfunction , Ċ Ġ* Ġputs Ġits Ġresult Ġinto Ġthe Ġmap Ġunder Ġthe Ġgiven Ġkey Ġand Ġreturns Ġit . Ċ Ġ* Ċ Ġ* ĠNote Ġthat Ġthe Ġoperation Ġis Ġnot Ġguaranteed Ġto Ġbe Ġatomic Ġif Ġthe Ġmap Ġis Ġbeing Ġmodified Ġconcurrent ly . Ċ Ġ*/ Ċ inline Ġfun Ġ< K , ĠV > ĠMutable Map < K , ĠV >. get Or Put Nullable ( key : ĠK , ĠdefaultValue : Ġ() Ġ-> ĠV ): ĠV Ġ{ Ċ ĉ @ Suppress (" UN CHECK ED _ CAST ") Ċ ĉ return Ġif Ġ( containsKey ( key )) Ġget ( key ) Ġas ĠV Ċ ĉ else Ġ{ Ċĉ ĉ val Ġanswer Ġ= ĠdefaultValue () Ċĉ ĉ put ( key , Ġanswer ) Ċĉ ĉ answer Ċ ĉ } Ċ }