/* Ċ Ġ* ĠCopyright Ġ 2 0 1 6 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . coroutines . internal Ċ Ċ import Ġkotlinx . atomic fu .* Ċ import Ġkotlinx . coroutines .* Ċ import Ġkotlin . native . concurrent . Shared Immutable Ċ Ċ /** Ċ Ġ* ĠReturns Ġthe Ġfirst Ġsegment Ġ` s ` Ġwith Ġ` s . id Ġ>= Ġid ` Ġor Ġ` CLOSED ` Ċ Ġ* Ġif Ġall Ġthe Ġsegments Ġin Ġthis Ġlinked Ġlist Ġhave Ġlower Ġ` id `, Ġand Ġthe Ġlist Ġis Ġclosed Ġfor Ġfurther Ġsegment Ġadditions . Ċ Ġ*/ Ċ private Ġinline Ġfun Ġ< S Ġ: ĠSegment < S >> ĠS . find Segment Internal ( ĊĠĠĠ Ġid : ĠLong , ĊĠĠĠ Ġcreate New Segment : Ġ( id : ĠLong , Ġprev : ĠS ?) Ġ-> ĠS Ċ ): ĠSegment Or Closed < S > Ġ{ ĊĠĠĠ Ġ/* ĊĠĠĠĠĠĠ ĠGo Ġthrough Ġ` next ` Ġreferences Ġand Ġadd Ġnew Ġsegments Ġif Ġneeded , Ġsimilar ly Ġto Ġthe Ġ` push ` Ġin Ġthe ĠMichael - S cott ĊĠĠĠĠĠĠ Ġqueue Ġalgorithm . ĠThe Ġonly Ġdifference Ġis Ġthat Ġ" CAS Ġfailure " Ġmeans Ġthat Ġthe Ġrequired Ġsegment Ġhas Ġalready Ġbeen ĊĠĠĠĠĠĠ Ġadded , Ġso Ġthe Ġalgorithm Ġjust Ġuses Ġit . ĠThis Ġway , Ġonly Ġone Ġsegment Ġwith Ġeach Ġid Ġcan Ġbe Ġadded . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġvar Ġcur : ĠS Ġ= Ġthis ĊĠĠĠ Ġwhile Ġ( cur . id Ġ< Ġid Ġ|| Ġcur . removed ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġcur . next Or If Closed Ġ{ Ġreturn ĠSegment Or Closed ( CLOSED ) Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( next Ġ!= Ġnull ) Ġ{ Ġ// Ġthere Ġis Ġa Ġnext Ġnode Ġ-- Ġmove Ġthere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcur Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġnew Tail Ġ= Ġcreate New Segment ( cur . id Ġ+ Ġ 1 , Ġcur ) ĊĠĠĠĠĠĠĠ Ġif Ġ( cur . try Set Next ( new Tail )) Ġ{ Ġ// Ġsuccessfully Ġadded Ġnew Ġnode Ġ-- Ġmove Ġthere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur . removed ) Ġcur . remove () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcur Ġ= Ġnew Tail ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn ĠSegment Or Closed ( cur ) Ċ } Ċ Ċ /** Ċ Ġ* ĠReturns Ġ` false ` Ġif Ġthe Ġsegment Ġ` to ` Ġis Ġlog ically Ġremoved , Ġ` true ` Ġon Ġa Ġsuccessful Ġupdate . Ċ Ġ*/ Ċ @ Suppress (" NOTH ING _ TO _ INLINE ") Ġ// ĠMust Ġbe Ġinline Ġbecause Ġit Ġis Ġan ĠAtomic Ref Ġextension Ċ private Ġinline Ġfun Ġ< S Ġ: ĠSegment < S >> ĠAtomic Ref < S >. move Forward ( to : ĠS ): ĠBoolean Ġ= Ġloop Ġ{ Ġcur Ġ-> ĊĠĠĠ Ġif Ġ( cur . id Ġ>= Ġto . id ) Ġreturn Ġtrue ĊĠĠĠ Ġif Ġ(! to . try Inc Pointers ()) Ġreturn Ġfalse ĊĠĠĠ Ġif Ġ( compare AndSet ( cur , Ġto )) Ġ{ Ġ// Ġthe Ġsegment Ġis Ġmoved ĊĠĠĠĠĠĠĠ Ġif Ġ( cur . dec Pointers ()) Ġcur . remove () ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĠĠĠ Ġif Ġ( to . dec Pointers ()) Ġto . remove () Ġ// Ġundo Ġtry Inc Pointers Ċ } Ċ Ċ /** Ċ Ġ* ĠT ries Ġto Ġfind Ġa Ġsegment Ġwith Ġthe Ġspecified Ġ[ id ] Ġfollowing Ġby Ġnext Ġreferences Ġfrom Ġthe Ċ Ġ* Ġ[ start From ] Ġsegment Ġand Ġcreating Ġnew Ġones Ġif Ġneeded . ĠThe Ġtypical Ġuse - case Ġis Ġreading Ġthis Ġ` Atomic Ref ` Ġvalues , Ċ Ġ* Ġdoing Ġsome Ġsynchronization , Ġand Ġinvoking Ġthis Ġfunction Ġto Ġfind Ġthe Ġrequired Ġsegment Ġand Ġupdate Ġthe Ġpointer . Ċ Ġ* ĠAt Ġthe Ġsame Ġtime , Ġ[ Segment . clean Prev ] Ġshould Ġalso Ġbe Ġinvoked Ġif Ġthe Ġprevious Ġsegments Ġare Ġno Ġlonger Ġneeded Ċ Ġ* Ġ( e . g ., Ġqueues Ġshould Ġuse Ġit Ġin Ġde queue Ġoperations ). Ċ Ġ* Ċ Ġ* ĠSince Ġsegments Ġcan Ġbe Ġremoved Ġfrom Ġthe Ġlist , Ġor Ġit Ġcan Ġbe Ġclosed Ġfor Ġfurther Ġsegment Ġadditions . Ċ Ġ* ĠReturns Ġthe Ġsegment Ġ` s ` Ġwith Ġ` s . id Ġ>= Ġid ` Ġor Ġ` CLOSED ` Ġif Ġall Ġthe Ġsegments Ġin Ġthis Ġlinked Ġlist Ġhave Ġlower Ġ` id `, Ċ Ġ* Ġand Ġthe Ġlist Ġis Ġclosed . Ċ Ġ*/ Ċ internal Ġinline Ġfun Ġ< S Ġ: ĠSegment < S >> ĠAtomic Ref < S >. find Segment And Move Forward ( ĊĠĠĠ Ġid : ĠLong , ĊĠĠĠ Ġstart From : ĠS , ĊĠĠĠ Ġcreate New Segment : Ġ( id : ĠLong , Ġprev : ĠS ?) Ġ-> ĠS Ċ ): ĠSegment Or Closed < S > Ġ{ ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġs Ġ= Ġstart From . find Segment Internal ( id , Ġcreate New Segment ) ĊĠĠĠĠĠĠĠ Ġif Ġ( s . is Closed Ġ|| Ġmove Forward ( s . segment )) Ġreturn Ġs ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠCloses Ġthis Ġlinked Ġlist Ġof Ġnodes Ġby Ġfor b idding Ġadding Ġnew Ġones , Ċ Ġ* Ġreturns Ġthe Ġlast Ġnode Ġin Ġthe Ġlist . Ċ Ġ*/ Ċ internal Ġfun Ġ< N Ġ: ĠConcurrent LinkedList Node < N >> ĠN . close (): ĠN Ġ{ ĊĠĠĠ Ġvar Ġcur : ĠN Ġ= Ġthis ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġcur . next Or If Closed Ġ{ Ġreturn Ġcur Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( next Ġ=== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cur . mark As Closed ()) Ġreturn Ġcur ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcur Ġ= Ġnext ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ internal Ġabstract Ġclass ĠConcurrent LinkedList Node < N Ġ: ĠConcurrent LinkedList Node < N >>( prev : ĠN ?) Ġ{ ĊĠĠĠ Ġ// ĠPointer Ġto Ġthe Ġnext Ġnode , Ġupdates Ġsimilar ly Ġto Ġthe ĠMichael - S cott Ġqueue Ġalgorithm . ĊĠĠĠ Ġprivate Ġval Ġ_ next Ġ= Ġatomic < Any ? >( null ) ĊĠĠĠ Ġ// ĠPointer Ġto Ġthe Ġprevious Ġnode , Ġupdates Ġin Ġ[ remove ] Ġfunction . ĊĠĠĠ Ġprivate Ġval Ġ_ prev Ġ= Ġatomic ( prev ) ĊĊĠĠĠ Ġprivate Ġval Ġnext Or Closed Ġget () Ġ= Ġ_ next . value ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġnext Ġsegment Ġor Ġ` null ` Ġof Ġthe Ġone Ġdoes Ġnot Ġexist , ĊĠĠĠĠ Ġ* Ġand Ġinvokes Ġ[ on Closed Action ] Ġif Ġthis Ġsegment Ġis Ġmarked Ġas Ġclosed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġinline Ġfun Ġnext Or If Closed ( on Closed Action : Ġ() Ġ-> ĠNothing ): ĠN ? Ġ= Ġnext Or Closed . let Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġ=== ĠCLO SED ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġon Closed Action () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġit Ġas ĠN ? ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġnext : ĠN ? Ġget () Ġ= Ġnext Or If Closed Ġ{ Ġreturn Ġnull Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠT ries Ġto Ġset Ġthe Ġnext Ġsegment Ġif Ġit Ġis Ġnot Ġspecified Ġand Ġthis Ġsegment Ġis Ġnot Ġmarked Ġas Ġclosed . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġtry Set Next ( value : ĠN ): ĠBoolean Ġ= Ġ_ next . compare AndSet ( null , Ġvalue ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġthis Ġnode Ġis Ġthe Ġphysical Ġtail Ġof Ġthe Ġcurrent Ġlinked Ġlist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġis Tail : ĠBoolean Ġget () Ġ= Ġnext Ġ== Ġnull ĊĊĠĠĠ Ġval Ġprev : ĠN ? Ġget () Ġ= Ġ_ prev . value ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠC le ans Ġthe Ġpointer Ġto Ġthe Ġprevious Ġnode . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġclean Prev () Ġ{ Ġ_ prev . lazy Set ( null ) Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠT ries Ġto Ġmark Ġthe Ġlinked Ġlist Ġas Ġclosed Ġby Ġfor b idding Ġadding Ġnew Ġnodes Ġafter Ġthis Ġone . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġmark As Closed () Ġ= Ġ_ next . compare AndSet ( null , ĠCLO SED ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġproperty Ġindicates Ġwhether Ġthe Ġcurrent Ġnode Ġis Ġlog ically Ġremoved . ĊĠĠĠĠ Ġ* ĠThe Ġexpected Ġuse - case Ġis Ġremoving Ġthe Ġnode Ġlog ically Ġ( so Ġthat Ġ[ removed ] Ġbecomes Ġtrue ), ĊĠĠĠĠ Ġ* Ġand Ġinvoking Ġ[ remove ] Ġafter Ġthat . ĠNote Ġthat Ġthis Ġimplementation Ġrelies Ġon Ġthe Ġcontract ĊĠĠĠĠ Ġ* Ġthat Ġthe Ġphysical Ġtail Ġcannot Ġbe Ġlog ically Ġremoved . ĠPlease , Ġdo Ġnot Ġbreak Ġthis Ġcontract ; ĊĠĠĠĠ Ġ* Ġotherwise , Ġmemory Ġle aks Ġand Ġunexpected Ġbehavior Ġcan Ġoccur . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġval Ġremoved : ĠBoolean ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRemoves Ġthis Ġnode Ġphys ically Ġfrom Ġthis Ġlinked Ġlist . ĠThe Ġnode Ġshould Ġbe ĊĠĠĠĠ Ġ* Ġlog ically Ġremoved Ġ( so Ġ[ removed ] Ġreturns Ġ` true `) Ġat Ġthe Ġpoint Ġof Ġinvocation . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġremove () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Ġ{ Ġremoved Ġ} Ġ// ĠThe Ġnode Ġshould Ġbe Ġlog ically Ġremoved Ġat Ġfirst . ĊĠĠĠĠĠĠĠ Ġassert Ġ{ Ġ! is Tail Ġ} Ġ// ĠThe Ġphysical Ġtail Ġcannot Ġbe Ġremoved . ĊĠĠĠĠĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠRead Ġ` next ` Ġand Ġ` prev ` Ġpointers Ġignoring Ġlog ically Ġremoved Ġnodes . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprev Ġ= Ġleft most Alive Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Ġ= Ġright most Alive Node ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLink Ġ` next ` Ġand Ġ` prev `. ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnext ._ prev . value Ġ= Ġprev ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Ġ!== Ġnull ) Ġprev ._ next . value Ġ= Ġnext ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠChecks Ġthat Ġprev Ġand Ġnext Ġare Ġstill Ġalive . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next . removed ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( prev Ġ!== Ġnull Ġ&& Ġprev . removed ) Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġnode Ġis Ġremoved . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġleft most Alive Node : ĠN ? Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġcur Ġ= Ġprev ĊĠĠĠĠĠĠĠ Ġwhile Ġ( cur Ġ!== Ġnull Ġ&& Ġcur . removed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcur Ġ= Ġcur ._ prev . value ĊĠĠĠĠĠĠĠ Ġreturn Ġcur ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġright most Alive Node : ĠN Ġget () Ġ{ ĊĠĠĠĠĠĠĠ Ġassert Ġ{ Ġ! is Tail Ġ} Ġ// ĠShould Ġnot Ġbe Ġinvoked Ġon Ġthe Ġtail Ġnode ĊĠĠĠĠĠĠĠ Ġvar Ġcur Ġ= Ġnext !! ĊĠĠĠĠĠĠĠ Ġwhile Ġ( cur . removed ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcur Ġ= Ġcur . next !! ĊĠĠĠĠĠĠĠ Ġreturn Ġcur ĊĠĠĠ Ġ} Ċ } Ċ Ċ /** Ċ Ġ* ĠEach Ġsegment Ġin Ġthe Ġlist Ġhas Ġa Ġunique Ġid Ġand Ġis Ġcreated Ġby Ġthe Ġprovided Ġto Ġ[ find Segment And Move Forward ] Ġmethod . Ċ Ġ* ĠEss entially , Ġthis Ġis Ġa Ġnode Ġin Ġthe ĠMichael - S cott Ġqueue Ġalgorithm , Ċ Ġ* Ġbut Ġwith Ġmaintaining Ġ[ prev ] Ġpointer Ġfor Ġefficient Ġ[ remove ] Ġimplementation . Ċ Ġ*/ Ċ internal Ġabstract Ġclass ĠSegment < S Ġ: ĠSegment < S >>( val Ġid : ĠLong , Ġprev : ĠS ?, Ġpointers : ĠInt ): ĠConcurrent LinkedList Node < S >( prev ) Ġ{ ĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThis Ġproperty Ġshould Ġreturn Ġthe Ġmax imal Ġnumber Ġof Ġslots Ġin Ġthis Ġsegment , ĊĠĠĠĠ Ġ* Ġit Ġis Ġused Ġto Ġdefine Ġwhether Ġthe Ġsegment Ġis Ġlog ically Ġremoved . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġval Ġmax Slots : ĠInt ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠNumbers Ġof Ġcleaned Ġslots Ġ( the Ġlowest Ġbits ) Ġand ĠAtomic Ref Ġpointers Ġto Ġthis Ġsegment Ġ( the Ġhighest Ġbits ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġval Ġcleaned And Pointers Ġ= Ġatomic ( pointers Ġshl ĠPO INTER S _ SHIFT ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠThe Ġsegment Ġis Ġconsidered Ġas Ġremoved Ġif Ġall Ġthe Ġslots Ġare Ġcleaned . ĊĠĠĠĠ Ġ* ĠThere Ġare Ġno Ġpointers Ġto Ġthis Ġsegment Ġfrom Ġoutside , Ġand ĊĠĠĠĠ Ġ* Ġit Ġis Ġnot Ġa Ġphysical Ġtail Ġin Ġthe Ġlinked Ġlist Ġof Ġsegments . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġoverride Ġval Ġremoved Ġget () Ġ= Ġcleaned And Pointers . value Ġ== Ġmax Slots Ġ&& Ġ! is Tail ĊĊĠĠĠ Ġ// Ġincre ments Ġthe Ġnumber Ġof Ġpointers Ġif Ġthis Ġsegment Ġis Ġnot Ġlog ically Ġremoved . ĊĠĠĠ Ġinternal Ġfun Ġtry Inc Pointers () Ġ= Ġcleaned And Pointers . add Condition ally ( 1 Ġshl ĠPO INTER S _ SHIFT ) Ġ{ Ġit Ġ!= Ġmax Slots Ġ|| Ġis Tail Ġ} ĊĊĠĠĠ Ġ// Ġreturns Ġ` true ` Ġif Ġthis Ġsegment Ġis Ġlog ically Ġremoved Ġafter Ġthe Ġdecrement . ĊĠĠĠ Ġinternal Ġfun Ġdec Pointers () Ġ= Ġcleaned And Pointers . add AndGet (- ( 1 Ġshl ĠPO INTER S _ SHIFT )) Ġ== Ġmax Slots Ġ&& Ġ! is Tail ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInv oked Ġon Ġeach Ġslot Ġclean - up ; Ġshould Ġnot Ġbe Ġinvoked Ġtwice Ġfor Ġthe Ġsame Ġslot . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġon Slot Clean ed () Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( cleaned And Pointers . increment AndGet () Ġ== Ġmax Slots Ġ&& Ġ! is Tail ) Ġremove () ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġinline Ġfun ĠAtomic Int . add Condition ally ( delta : ĠInt , Ġcondition : Ġ( cur : ĠInt ) Ġ-> ĠBoolean ): ĠBoolean Ġ{ ĊĠĠĠ Ġwhile Ġ( true ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcur Ġ= Ġthis . value ĊĠĠĠĠĠĠĠ Ġif Ġ(! condition ( cur )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( this . compare AndSet ( cur , Ġcur Ġ+ Ġdelta )) Ġreturn Ġtrue ĊĠĠĠ Ġ} Ċ } Ċ Ċ @ Suppress (" EXPERIMENT AL _ FEATURE _ WARNING ") Ġ// ĠWe Ġare Ġusing Ġinline Ġclass Ġonly Ġinternally , Ġso Ġit Ġis ĠOk Ċ internal Ġinline Ġclass ĠSegment Or Closed < S Ġ: ĠSegment < S >>( private Ġval Ġvalue : ĠAny ?) Ġ{ ĊĠĠĠ Ġval Ġis Closed : ĠBoolean Ġget () Ġ= Ġvalue Ġ=== ĠCLO SED ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġval Ġsegment : ĠS Ġget () Ġ= Ġif Ġ( value Ġ=== ĠCLO SED ) Ġerror (" Does Ġnot Ġcontain Ġsegment ") Ġelse Ġvalue Ġas ĠS Ċ } Ċ Ċ private Ġconst Ġval ĠPO INTER S _ SHIFT Ġ= Ġ 1 6 Ċ Ċ @ Shared Immutable Ċ private Ġval ĠCLO SED Ġ= ĠSymbol (" CLOSED ")