/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġkotlin . native . concurrent Ċ Ċ import Ġkotlin . native . internal . Frozen Ċ import Ġkotlin . native . internal . No Re order Fields Ċ Ċ @ Symbol Name (" Kon an _ ensure Ac yc lic AndSet ") Ċ private Ġexternal Ġfun Ġensure Ac yc lic AndSet ( where : ĠAny , Ġindex : ĠInt , Ġwhat : ĠAny ?): ĠBoolean Ċ Ċ @ No Re order Fields Ċ internal Ġclass ĠFree ze Aware Lazy Impl < out ĠT >( initializer : Ġ() Ġ-> ĠT ) Ġ: ĠLazy < T > Ġ{ ĊĠĠĠ Ġ// ĠIMPORT ANT : Ġdue Ġto Ġsimplified Ġensure Ac yc lic AndSet () Ġsemantics Ġfields Ġhere Ġmust Ġbe Ġordered Ġlike Ġthis , ĊĠĠĠ Ġ// Ġas Ġan Ġordinal Ġis Ġused Ġto Ġrefer Ġa Ġfield . ĊĠĠĠ Ġprivate Ġvar Ġvalue _: ĠAny ? Ġ= ĠUN INITIAL IZED ĊĠĠĠ Ġprivate Ġvar Ġinitializer _: Ġ(() Ġ-> ĠT )? Ġ= Ġinitializer ĊĠĠĠ Ġprivate Ġval Ġlock _ Ġ= ĠLock () ĊĊĠĠĠ Ġoverride Ġval Ġvalue : ĠT ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Frozen ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocked ( lock _) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult : ĠAny ? Ġ= Ġvalue _ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ!== ĠUN INITIAL IZED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( result Ġ!== ĠINITIAL IZ ING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġvalue _ Ġto ĠINITIAL IZ ING . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġensure Ac yc lic AndSet ( this , Ġ 0 , ĠINITIAL IZ ING ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġinitializer _ !! (). freeze () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSet Ġvalue _. ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! ensure Ac yc lic AndSet ( this , Ġ 0 , Ġresult )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Mut ability Exception (" Setting Ġcy clic Ġdata Ġvia Ġlazy Ġin Ġ$ this : Ġ$ result ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠClear Ġinitializer _ Ġreference . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġensure Ac yc lic AndSet ( this , Ġ 1 , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult : ĠAny ? Ġ= Ġvalue _ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( result Ġ=== ĠUN INITIAL IZED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġinitializer _ !! () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Frozen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠInvalid Mut ability Exception ("$ this Ġgot Ġfrozen Ġduring Ġlazy Ġevaluation " Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue _ Ġ= Ġresult ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinitializer _ Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult Ġas ĠT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġoperation Ġon Ġshared Ġobjects Ġmay Ġreturn Ġvalue Ġwhich Ġis Ġno Ġlonger Ġreflect Ġthe Ġcurrent Ġstate Ġof Ġlazy . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġfun Ġis Initialized (): ĠBoolean Ġ= Ġ( value _ Ġ!== ĠUN INITIAL IZED ) Ġ&& Ġ( value _ Ġ!== ĠINITIAL IZ ING ) ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġif Ġ( isInitialized ()) ĊĠĠĠĠĠĠĠ Ġvalue . toString () Ġelse Ġ" Lazy Ġvalue Ġnot Ġinitialized Ġyet ." Ċ } Ċ Ċ internal Ġobject ĠUN INITIAL IZED Ġ{ ĊĠĠĠ Ġ// ĠSo Ġthat Ġsingle - threaded Ġconfigs Ġcan Ġuse Ġthose Ġas Ġwell . ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfreeze () ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġobject ĠINITIAL IZ ING Ġ{ ĊĠĠĠ Ġ// ĠSo Ġthat Ġsingle - threaded Ġconfigs Ġcan Ġuse Ġthose Ġas Ġwell . ĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġfreeze () ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Frozen Ċ internal Ġclass ĠAtomic Lazy Impl < out ĠT >( initializer : Ġ() Ġ-> ĠT ) Ġ: ĠLazy < T > Ġ{ ĊĠĠĠ Ġprivate Ġval Ġinitializer _ Ġ= ĠAtomic Reference < Function 0 < T >? >( initializer . freeze ()) ĊĠĠĠ Ġprivate Ġval Ġvalue _ Ġ= ĠAtomic Reference < Any ? >( UN INITIAL IZED ) ĊĊĠĠĠ Ġoverride Ġval Ġvalue : ĠT ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value _. compare And Swap ( UN INITIAL IZED , ĠINITIAL IZ ING ) Ġ=== ĠUN INITIAL IZED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠWe Ġexecute Ġexclus ively Ġhere . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġctor Ġ= Ġinitializer _. value ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( ctor Ġ!= Ġnull Ġ&& Ġinitializer _. compare AndSet ( ctor , Ġnull )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalue _. compare AndSet ( INITIAL IZ ING , Ġctor (). freeze ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSomething Ġwrong . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġresult : ĠAny ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdo Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġ= Ġvalue _. value ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġwhile Ġ( result Ġ=== ĠINITIAL IZ ING ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( result Ġ!== ĠUN INITIAL IZED Ġ&& Ġresult Ġ!== ĠINITIAL IZ ING ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġresult Ġas ĠT ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġis Initialized (): ĠBoolean Ġ= Ġvalue _. value Ġ!== ĠUN INITIAL IZED ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġif Ġ( isInitialized ()) ĊĠĠĠĠĠĠĠ Ġvalue _. value . toString () Ġelse Ġ" Lazy Ġvalue Ġnot Ġinitialized Ġyet ." Ċ } Ċ Ċ /** Ċ Ġ* ĠAtomic Ġlazy Ġinitializer , Ġcould Ġbe Ġused Ġin Ġfrozen Ġobjects , Ġfree zes Ġinitializing Ġlambda , Ċ Ġ* Ġso Ġuse Ġvery Ġcarefully . ĠAlso , Ġas Ġwith Ġother Ġuses Ġof Ġan Ġ@ Atomic Reference Ġmay Ġpotentially Ċ Ġ* Ġleak Ġmemory , Ġso Ġit Ġis Ġrecommended Ġto Ġuse Ġ` atomic Lazy ` Ġin Ġcases Ġof Ġobjects Ġliving Ġforever , Ċ Ġ* Ġsuch Ġas Ġobject Ġsign letons , Ġor Ġin Ġcases Ġwhere Ġit 's Ġguaranteed Ġnot Ġto Ġhave Ġcy clic al Ġgarbage . Ċ Ġ*/ Ċ public Ġfun Ġ< T > Ġatomic Lazy ( initializer : Ġ() Ġ-> ĠT ): ĠLazy < T > Ġ= ĠAtomic Lazy Impl ( initializer )