package Ġorg . cc ci . g to . android . common . util Ċ Ċ import Ġandroid . util . L ru Cache Ċ Ċ open Ġclass ĠMulti Key L ru Cache < K , ĠV Ġ: ĠAny >( maxSize : ĠInt ) Ġ: ĠL ru Cache < K , ĠV >( maxSize ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġcopies Ġ= Ġmutable Map Of < V , ĠInt >() ĊĠĠĠ Ġprivate Ġvar Ġsize Gap Ġ= Ġ 0 ĊĊĠĠĠ Ġfun Ġput Multi ( key : ĠK , Ġvalue : ĠV ): ĠV ? Ġ{ ĊĠĠĠĠĠĠĠ Ġinc Count ( key , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġreturn Ġput ( key , Ġvalue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġcreate ( key : ĠK ): ĠV ? Ġ= Ġcreate Multi ( key )?. also Ġ{ Ġinc Count ( key , Ġit ) Ġ} ĊĠĠĠ Ġprotected Ġopen Ġfun Ġcreate Multi ( key : ĠK ): ĠV ? Ġ= Ġnull ĊĊĠĠĠ Ġoverride Ġfun Ġentry Removed ( ev ict ed : ĠBoolean , Ġkey : ĠK , ĠoldValue : ĠV ?, ĠnewValue : ĠV ?) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( oldValue Ġ!= Ġnull ) Ġdec Count ( key , ĠoldValue ) ĊĠĠĠĠĠĠĠ Ġsuper . entry Removed ( ev ict ed , Ġkey , ĠoldValue , ĠnewValue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfinal Ġoverride Ġfun Ġtrim To Size ( maxSize : ĠInt ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġloop Ġuntil Ġthe Ġsize Ġgap Ġstabil izes ĊĠĠĠĠĠĠĠ Ġvar Ġgap : ĠInt ĊĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġgap Ġ= Ġsize Gap ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . trim To Size ( maxSize Ġ+ Ġsize Gap ) ĊĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( gap Ġ!= Ġsize Gap ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġinc Count ( key : ĠK , Ġvalue : ĠV ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( copies ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġ( copies [ value ] Ġ?: Ġ 0 ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( count Ġ> Ġ 1 ) Ġsize Gap Ġ+= Ġsize Of ( key , Ġvalue ). coerce At Least ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcopies [ value ] Ġ= Ġcount ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġdec Count ( key : ĠK , Ġvalue : ĠV ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsynchronized ( copies ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġ( copies [ value ] Ġ?: Ġ 0 ) Ġ- Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcount Ġ> Ġ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsize Gap Ġ= Ġ( size Gap Ġ- Ġsize Of ( key , Ġvalue ). coerce At Least ( 0 )). coerce At Least ( 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcopies [ value ] Ġ= Ġcount ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġcopies . remove ( value ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ