/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . atomic fu . test Ċ Ċ import Ġkotlinx . atomic fu .* Ċ import Ġkotlin . test .* Ċ Ċ class ĠArithmetic Test Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Int () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠInt Arithmetic () ĊĠĠĠĠĠĠĠ Ġcheck ( a . x Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a ._ x . get AndSet ( 3 ) Ġ== Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a ._ x . compare AndSet ( 3 , Ġ 8 )) ĊĠĠĠĠĠĠĠ Ġa ._ x . lazy Set ( 1 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . x Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a ._ x . get AndSet ( 2 ) Ġ== Ġ 1 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . x Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a ._ x . get And Increment () Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . x Ġ== Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a ._ x . get And De crement () Ġ== Ġ 3 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . x Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a ._ x . get And Add ( 2 ) Ġ== Ġ 2 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . x Ġ== Ġ 4 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a ._ x . add AndGet ( 3 ) Ġ== Ġ 7 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . x Ġ== Ġ 7 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a ._ x . increment AndGet () Ġ== Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . x Ġ== Ġ 8 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a ._ x . decrement AndGet () Ġ== Ġ 7 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . x Ġ== Ġ 7 ) ĊĠĠĠĠĠĠĠ Ġa ._ x . compare AndSet ( 7 , Ġ 1 0 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Long () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠLong Arithmetic () ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . value Ġ== Ġ 2 4 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 8 ) ĊĠĠĠĠĠĠĠ Ġa . z . lazy Set ( 8 4 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 8 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . value Ġ== Ġ 8 4 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 8 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . get AndSet ( 8 9 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 8 ) Ġ== Ġ 8 4 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 8 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . value Ġ== Ġ 8 9 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 8 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . increment AndGet () Ġ== Ġ 8 9 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 9 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . value Ġ== Ġ 8 9 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 9 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . get And De crement () Ġ== Ġ 8 9 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 9 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . value Ġ== Ġ 8 9 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 8 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . get And Add ( 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 ) Ġ== Ġ 8 9 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 8 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . value Ġ== Ġ 9 0 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 8 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . add AndGet (- 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 ) Ġ== Ġ- 1 9 8 4 5 2 0 1 1 9 6 5 8 8 6 9 5 9 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . value Ġ== Ġ- 1 9 8 4 5 2 0 1 1 9 6 5 8 8 6 9 5 9 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . increment AndGet () Ġ== Ġ- 1 9 8 4 5 2 0 1 1 9 6 5 8 8 6 9 5 8 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . value Ġ== Ġ- 1 9 8 4 5 2 0 1 1 9 6 5 8 8 6 9 5 8 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . decrement AndGet () Ġ== Ġ- 1 9 8 4 5 2 0 1 1 9 6 5 8 8 6 9 5 9 ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . z . value Ġ== Ġ- 1 9 8 4 5 2 0 1 1 9 6 5 8 8 6 9 5 9 ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Boolean () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠBoolean Arithmetic () ĊĠĠĠĠĠĠĠ Ġcheck (! a . x ) ĊĠĠĠĠĠĠĠ Ġa ._ x . lazy Set ( true ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . x ) ĊĠĠĠĠĠĠĠ Ġcheck ( a ._ x . get AndSet ( true )) ĊĠĠĠĠĠĠĠ Ġcheck ( a ._ x . compare AndSet ( true , Ġfalse )) ĊĠĠĠĠĠĠĠ Ġcheck (! a . x ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Deep Reference () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġa Ġ= ĠDeep Reference () ĊĠĠĠĠĠĠĠ Ġcheck ( a . abc deref . value . b . c . d . e . n Ġ== Ġ 5 ) ĊĠĠĠĠĠĠĠ Ġval Ġnew Ġ= ĠA Ref ( B Ref ( C Ref ( D Ref ( E Ref ( 7 ))))) ĊĠĠĠĠĠĠĠ Ġa . abc deref . lazy Set ( new ) ĊĠĠĠĠĠĠĠ Ġcheck ( a . abc deref . value . b . c . d . e . n Ġ== Ġ 7 ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠInt Arithmetic Ġ{ ĊĠĠĠ Ġval Ġ_ x Ġ= Ġatomic ( 0 ) ĊĠĠĠ Ġval Ġx Ġget () Ġ= Ġ_ x . value Ċ } Ċ Ċ class ĠLong Arithmetic Ġ{ ĊĠĠĠ Ġval Ġ_ x Ġ= Ġatomic ( 4 2 9 4 9 6 7 2 9 6 ) ĊĠĠĠ Ġval Ġx Ġget () Ġ= Ġ_ x . value ĊĠĠĠ Ġval Ġy Ġ= Ġatomic ( 5 0 0 0 0 0 0 0 0 0 ) ĊĠĠĠ Ġval Ġz Ġ= Ġatomic ( 2 4 2 4 9 2 0 0 2 4 8 8 8 8 8 8 8 4 8 ) ĊĠĠĠ Ġval Ġmax Ġ= Ġatomic ( 9 2 2 3 3 7 2 0 3 6 8 5 4 7 7 5 8 0 7 ) Ċ } Ċ Ċ class ĠBoolean Arithmetic Ġ{ ĊĠĠĠ Ġval Ġ_ x Ġ= Ġatomic ( false ) ĊĠĠĠ Ġval Ġx Ġget () Ġ= Ġ_ x . value Ċ } Ċ Ċ class ĠDeep Reference Ġ{ ĊĠĠĠ Ġval Ġabc deref Ġ= Ġatomic ( A Ref ( B Ref ( C Ref ( D Ref ( E Ref ( 5 )))))) Ċ } Ċ Ċ data Ġclass ĠA Ref ( val Ġb : ĠB Ref ) Ċ data Ġclass ĠB Ref ( val Ġc : ĠC Ref ) Ċ data Ġclass ĠC Ref ( val Ġd : ĠD Ref ) Ċ data Ġclass ĠD Ref ( val Ġe : ĠE Ref ) Ċ data Ġclass ĠE Ref ( val Ġn : ĠInt )