/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 9 Ġ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 Ġkotlin . time Ċ Ċ /** Ċ Ġ* ĠThe Ġmost Ġprecise Ġclock Ġavailable Ġin Ġthe Ġplatform . Ċ Ġ* Ċ Ġ* ĠThe Ġclock Ġreturns Ġits Ġread ings Ġfrom Ġa Ġsource Ġof Ġmon otonic Ġtime Ġwhen Ġit Ġis Ġavailable Ġin Ġa Ġtarget Ġplatform , Ċ Ġ* Ġand Ġres ort s Ġto Ġa Ġnon - mon otonic Ġtime Ġsource Ġotherwise . Ċ Ġ*/ Ċ @ Since Kotlin (" 1 . 3 ") Ċ @ Experimental Time Ċ public Ġexpect Ġobject ĠMono Clock Ġ: ĠClock Ċ Ċ /** Ċ Ġ* ĠAn Ġabstract Ġclass Ġused Ġto Ġimplement Ġclock s Ġthat Ġreturn Ġtheir Ġread ings Ġas Ġ[ Long ] Ġvalues Ġin Ġthe Ġspecified Ġ[ unit ]. Ċ Ġ* Ċ Ġ* Ġ@ property Ġunit ĠThe Ġunit Ġin Ġwhich Ġthis Ġclock Ġread ings Ġare Ġexpressed . Ċ Ġ*/ Ċ @ Since Kotlin (" 1 . 3 ") Ċ @ Experimental Time Ċ public Ġabstract Ġclass ĠAbstract Long Clock ( protected Ġval Ġunit : ĠDuration Unit ) Ġ: ĠClock Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġprotected Ġmethod Ġshould Ġbe Ġoverridden Ġto Ġreturn Ġthe Ġcurrent Ġreading Ġof Ġthe Ġclock Ġexpressed Ġas Ġa Ġ[ Long ] Ġnumber ĊĠĠĠĠ Ġ* Ġin Ġthe Ġunit Ġspecified Ġby Ġthe Ġ[ unit ] Ġproperty . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġread (): ĠLong ĊĊĠĠĠ Ġprivate Ġclass ĠLong Clock Mark ( private Ġval Ġstarted At : ĠLong , Ġprivate Ġval Ġclock : ĠAbstract Long Clock , Ġprivate Ġval Ġoffset : ĠDuration ) Ġ: ĠClock Mark () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġelapsed Now (): ĠDuration Ġ= Ġ( clock . read () Ġ- Ġstarted At ). to Duration ( clock . unit ) Ġ- Ġoffset ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġplus ( duration : ĠDuration ): ĠClock Mark Ġ= ĠLong Clock Mark ( started At , Ġclock , Ġoffset Ġ+ Ġduration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmark Now (): ĠClock Mark Ġ= ĠLong Clock Mark ( read (), Ġthis , ĠDuration . ZERO ) Ċ } Ċ Ċ /** Ċ Ġ* ĠAn Ġabstract Ġclass Ġused Ġto Ġimplement Ġclock s Ġthat Ġreturn Ġtheir Ġread ings Ġas Ġ[ Double ] Ġvalues Ġin Ġthe Ġspecified Ġ[ unit ]. Ċ Ġ* Ċ Ġ* Ġ@ property Ġunit ĠThe Ġunit Ġin Ġwhich Ġthis Ġclock Ġread ings Ġare Ġexpressed . Ċ Ġ*/ Ċ @ Since Kotlin (" 1 . 3 ") Ċ @ Experimental Time Ċ public Ġabstract Ġclass ĠAbstract Double Clock ( protected Ġval Ġunit : ĠDuration Unit ) Ġ: ĠClock Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġprotected Ġmethod Ġshould Ġbe Ġoverridden Ġto Ġreturn Ġthe Ġcurrent Ġreading Ġof Ġthe Ġclock Ġexpressed Ġas Ġa Ġ[ Double ] Ġnumber ĊĠĠĠĠ Ġ* Ġin Ġthe Ġunit Ġspecified Ġby Ġthe Ġ[ unit ] Ġproperty . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġabstract Ġfun Ġread (): ĠDouble ĊĊĠĠĠ Ġprivate Ġclass ĠDouble Clock Mark ( private Ġval Ġstarted At : ĠDouble , Ġprivate Ġval Ġclock : ĠAbstract Double Clock , Ġprivate Ġval Ġoffset : ĠDuration ) Ġ: ĠClock Mark () Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġelapsed Now (): ĠDuration Ġ= Ġ( clock . read () Ġ- Ġstarted At ). to Duration ( clock . unit ) Ġ- Ġoffset ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġplus ( duration : ĠDuration ): ĠClock Mark Ġ= ĠDouble Clock Mark ( started At , Ġclock , Ġoffset Ġ+ Ġduration ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġmark Now (): ĠClock Mark Ġ= ĠDouble Clock Mark ( read (), Ġthis , ĠDuration . ZERO ) Ċ } Ċ Ċ /** Ċ Ġ* ĠA Ġclock Ġthat Ġhas Ġprogram matically Ġup datable Ġread ings . ĠIt Ġis Ġuseful Ġas Ġa Ġpredict able Ġsource Ġof Ġtime Ġin Ġtests . Ċ Ġ* Ċ Ġ* ĠThe Ġcurrent Ġclock Ġreading Ġvalue Ġcan Ġbe Ġadvanced Ġby Ġthe Ġspecified Ġduration Ġamount Ġwith Ġthe Ġoperator Ġ[ plus Assign ]: Ċ Ġ* Ċ Ġ* Ġ``` Ċ Ġ* Ġval Ġclock Ġ= ĠTest Clock () Ċ Ġ* Ġclock Ġ+= Ġ 1 0 . seconds Ċ Ġ* Ġ``` Ċ Ġ* Ċ Ġ* ĠImplementation Ġnote : Ġthe Ġcurrent Ġclock Ġreading Ġvalue Ġis Ġstored Ġas Ġa Ġ[ Long ] Ġnumber Ġof Ġnan oseconds , Ċ Ġ* Ġthus Ġit 's Ġcapable Ġto Ġrepresent Ġa Ġtime Ġrange Ġof Ġapproximately ĠÂ ± 2 9 2 Ġyears . Ċ Ġ* ĠShould Ġthe Ġreading Ġvalue Ġoverflow Ġas Ġthe Ġresult Ġof Ġ[ plus Assign ] Ġoperation , Ġan Ġ[ IllegalStateException ] Ġis Ġthrown . Ċ Ġ*/ Ċ @ Since Kotlin (" 1 . 3 ") Ċ @ Experimental Time Ċ public Ġclass ĠTest Clock Ġ: ĠAbstract Long Clock ( unit Ġ= ĠDuration Unit . NAN O SECONDS ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġreading : ĠLong Ġ= Ġ 0 L ĊĊĠĠĠ Ġoverride Ġfun Ġread (): ĠLong Ġ= Ġreading ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdv ances Ġthe Ġcurrent Ġreading Ġvalue Ġof Ġthis Ġclock Ġby Ġthe Ġspecified Ġ[ duration ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ[ duration ] Ġvalue Ġis Ġrounded Ġdown Ġtowards Ġzero Ġwhen Ġconverting Ġit Ġto Ġa Ġ[ Long ] Ġnumber Ġof Ġnan oseconds . ĊĠĠĠĠ Ġ* ĠFor Ġexample , Ġif Ġthe Ġduration Ġbeing Ġadded Ġis Ġ` 0 . 6 . nan oseconds `, Ġthe Ġclock Ġreading Ġwon 't Ġadvance Ġbecause ĊĠĠĠĠ Ġ* Ġthe Ġduration Ġvalue Ġwill Ġbe Ġrounded Ġto Ġzero Ġnan oseconds . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ throws ĠIllegalStateException Ġwhen Ġthe Ġreading Ġvalue Ġoverflow s Ġas Ġthe Ġresult Ġof Ġthis Ġoperation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġpublic Ġoperator Ġfun Ġplus Assign ( duration : ĠDuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdelta Ġ= Ġduration . toDouble ( unit ) ĊĠĠĠĠĠĠĠ Ġval Ġlong Delta Ġ= Ġdelta . to Long () ĊĠĠĠĠĠĠĠ Ġreading Ġ= Ġif Ġ( long Delta Ġ!= ĠLong . MIN _ VALUE Ġ&& Ġlong Delta Ġ!= ĠLong . MAX _ VALUE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġdelta Ġfits Ġin Ġlong , Ġadd Ġit Ġas Ġlong ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Reading Ġ= Ġreading Ġ+ Ġlong Delta ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reading Ġxor Ġlong Delta Ġ>= Ġ 0 Ġ&& Ġreading Ġxor Ġnew Reading Ġ< Ġ 0 ) Ġoverflow ( duration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Reading ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhen Ġdelta Ġis Ġgreater Ġthan Ġlong , Ġadd Ġit Ġas Ġdouble ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Reading Ġ= Ġreading Ġ+ Ġdelta ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( new Reading Ġ> ĠLong . MAX _ VALUE Ġ|| Ġnew Reading Ġ< ĠLong . MIN _ VALUE ) Ġoverflow ( duration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnew Reading . to Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġoverflow ( duration : ĠDuration ) Ġ{ ĊĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Test Clock Ġwill Ġoverflow Ġif Ġits Ġreading Ġ${ reading } ns Ġis Ġadvanced Ġby Ġ$ duration .") ĊĠĠĠ Ġ} Ċ } Ċ Ċ /* Ċ public Ġinterface ĠWall Clock Ġ{ ĊĠĠĠ Ġfun ĠcurrentTime Milliseconds (): ĠLong ĊĊĠĠĠ Ġcompanion Ġobject Ġ: ĠWall Clock , ĠAbstract Long Clock ( unit Ġ= ĠDuration Unit . MILLISECONDS ) Ġ{ ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠcurrentTime Milliseconds (): ĠLong Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġread (): ĠLong Ġ= ĠSystem . currentTimeMillis () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" Wall Clock ( System . currentTimeMillis ()) " ĊĠĠĠ Ġ} Ċ } Ċ */