/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 1 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . kon an . black box test . support . util Ċ Ċ import Ġorg . jetbrains . kotlin . kon an . black box test . support . util . Null Storage . unwrap Ċ import Ġorg . jetbrains . kotlin . kon an . black box test . support . util . Null Storage . wrap Ċ import Ġjava . util . concurrent . Concurrent HashMap Ċ Ċ /** Ċ Ġ* ĠPer mit s Ġnull Ġvalues . ĠCalls Ġ[ function ] Ġat Ġmost Ġonce Ġper Ġevery Ġkey Ġin Ġconcurrent Ġenvironment . Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ internal Ġclass ĠThread Safe Factory < K Ġ: ĠAny , ĠV >( private Ġval Ġfunction : Ġ( K ) Ġ-> ĠV ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmap Ġ= ĠConcurrent HashMap < K , ĠAny >() ĊĊĠĠĠ Ġoperator Ġfun Ġget ( key : ĠK ): ĠV Ġ= Ġunwrap ( map . compute If Absent ( key ) Ġ{ Ġwrap ( function ( key )) Ġ}) Ġas ĠV Ċ } Ċ Ċ /** Ċ Ġ* ĠPer mit s Ġnull Ġvalues . ĠAtomic Ġmodifications Ġin Ġconcurrent Ġenvironment . Ċ Ġ*/ Ċ @ Suppress (" UN CHECK ED _ CAST ") Ċ internal Ġclass ĠThread Safe Cache < K Ġ: ĠAny , ĠV > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġmap Ġ= ĠConcurrent HashMap < K , ĠAny >() ĊĊĠĠĠ Ġoperator Ġfun Ġget ( key : ĠK ): ĠV ? Ġ= Ġunwrap ( map [ key ]) Ġas ĠV ? ĊĠĠĠ Ġfun Ġcompute If Absent ( key : ĠK , Ġfunction : Ġ( K ) Ġ-> ĠV ): ĠV Ġ= Ġunwrap ( map . compute If Absent ( key ) Ġ{ Ġwrap ( function ( key )) Ġ}) Ġas ĠV Ċ } Ċ Ċ private Ġobject ĠNull Storage Ġ{ ĊĠĠĠ Ġprivate Ġval ĠNULL _ OBJECT Ġ= ĠAny () ĊĊĠĠĠ Ġfun Ġwrap ( value : ĠAny ?): ĠAny Ġ= Ġvalue Ġ?: ĠNULL _ OBJECT ĊĠĠĠ Ġfun Ġunwrap ( value : ĠAny ?): ĠAny ? Ġ= Ġif Ġ( value Ġ== ĠNULL _ OBJECT ) Ġnull Ġelse Ġvalue Ċ } Ċ