@ file : ĠSup press ( Warnings . NOTH ING _ TO _ INLINE ) Ċ @ file : ĠOpt In ( Experimental Std lib Api :: class , ĠExperimental Unsigned Types :: class ) Ċ Ċ package Ġru . spb stu . wheel s Ċ Ċ import Ġkotlinx . warnings . Warnings Ċ import Ġkotlin . math . ceil Ċ Ċ type alias ĠJ Long Ġ= ĠUnit Ċ type alias ĠInteger Ġ= ĠUnit Ċ Ċ inline Ġfun ĠInt . as Bits () Ġ= ĠInt Bits ( this ) Ċ Ċ // put ting Ġthese Ġguys Ġas Ġmembers Ġtriggers Ċ // https :// yout rack . jetbrains . com / issue / KT - 3 1 4 3 1 Ċ val ĠInt Bits . Companion . Zero Ġget () Ġ= Ġ 0 . as Bits () Ċ val ĠInt Bits . Companion . One Ġget () Ġ= Ġ 1 . as Bits () Ċ val ĠInt Bits . Companion . All On es Ġget () Ġ= Ġ(- 1 ). as Bits () Ċ val ĠInt Bits . Companion . SIZE Ġget () Ġ= ĠInt . SIZE _ BITS Ċ Ċ fun ĠInt Bits . Companion . fromString ( s : ĠString ): ĠInt Bits Ġ= ĠInt Bits ( s . to UInt ( 2 ). toInt ()) Ċ Ċ @ Published Api Ċ internal Ġexpect Ġfun ĠInt . reverse Bits (): ĠInt Ċ Ċ @ Opt In ( Experimental Std lib Api :: class ) Ċ inline Ġclass ĠInt Bits Ċ constructor ( val Ġdata : ĠInt ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{} ĊĊĠĠĠ Ġinline Ġfun Ġas Int () Ġ= Ġdata ĊĊĠĠĠ Ġinline Ġin fix Ġfun Ġshl ( bit Count : ĠInt ): ĠInt Bits Ġ= ĠInt Bits ( data Ġshl Ġbit Count ) ĊĠĠĠ Ġinline Ġin fix Ġfun Ġshr ( bit Count : ĠInt ): ĠInt Bits Ġ= ĠInt Bits ( data Ġ ush r Ġbit Count ) ĊĠĠĠ Ġinline Ġin fix Ġfun Ġand ( that : ĠInt Bits ): ĠInt Bits Ġ= ĠInt Bits ( data Ġand Ġthat . data ) ĊĠĠĠ Ġinline Ġin fix Ġfun Ġand Not ( that : ĠInt Bits ): ĠInt Bits Ġ= ĠInt Bits ( data Ġand Ġthat . data . inv ()) ĊĠĠĠ Ġinline Ġin fix Ġfun Ġor ( that : ĠInt Bits ): ĠInt Bits Ġ= ĠInt Bits ( data Ġor Ġthat . data ) ĊĠĠĠ Ġinline Ġin fix Ġfun Ġxor ( that : ĠInt Bits ): ĠInt Bits Ġ= ĠInt Bits ( data Ġxor Ġthat . data ) ĊĠĠĠ Ġinline Ġfun Ġinv (): ĠInt Bits Ġ= Ġdata . inv (). as Bits () ĊĠĠĠ Ġinline Ġfun Ġreverse (): ĠInt Bits Ġ= ĠInt Bits ( data . reverse Bits ()) ĊĊĠĠĠ Ġinline Ġval Ġpop Count : ĠInt Ġget () Ġ= Ġdata . count One Bits () ĊĠĠĠ Ġinline Ġval Ġlowest Bit Set Ġget () Ġ= ĠInt Bits ( data . take Low est One Bit ()) ĊĠĠĠ Ġinline Ġval Ġhighest Bit Set Ġget () Ġ= ĠInt Bits ( data . take Highest One Bit ()) ĊĠĠĠ Ġinline Ġval ĠnumberOf Leading Z eros : ĠInt Ġget () Ġ= Ġdata . count Leading Zero Bits () ĊĠĠĠ Ġinline Ġval ĠnumberOf Trailing Z eros : ĠInt Ġget () Ġ= Ġdata . count Trailing Zero Bits () ĊĊĠĠĠ Ġinline Ġfun ĠforEach One Bit ( body : Ġ( Int Bits ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmask Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġwhile Ġ( mask Ġ!= ĠZero ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbit Ġ= Ġmask . lowest Bit Set ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( bit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmask Ġ= Ġmask Ġand Not Ġbit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠD ANG ER : Ġbox ing ! ĊĠĠĠ Ġfun Ġone Bit Sequence () Ġ= Ġsequence Ġ{ ĠforEach One Bit Ġ{ Ġyield ( it ) Ġ} Ġ} ĊĊĠĠĠ Ġinline Ġoperator Ġfun Ġget ( index : ĠInt ) Ġ= Ġdata Ġand Ġ( 1 Ġshl Ġindex ) Ġ!= Ġ 0 ĊĠĠĠ Ġinline Ġfun Ġset ( index : ĠInt ) Ġ= Ġthis Ġor Ġ( One Ġshl Ġindex ) ĊĠĠĠ Ġinline Ġfun Ġclear ( index : ĠInt ) Ġ= Ġthis Ġand Not Ġ( One Ġshl Ġindex ) ĊĠĠĠ Ġinline Ġfun Ġslice ( from : ĠInt Ġ= Ġ 0 , Ġto Exclusive : ĠInt Ġ= ĠSIZE ): ĠInt Bits Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( from Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġrequire ( to Exclusive Ġ>= Ġfrom ) ĊĠĠĠĠĠĠĠ Ġrequire ( to Exclusive Ġ<= ĠSIZE ) ĊĠĠĠĠĠĠĠ Ġval Ġmask Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġsize Ġ= Ġto Exclusive Ġ- Ġfrom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġreturn ĠZero ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSIZE Ġ-> Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ(( 1 Ġshl Ġsize ) Ġ- Ġ 1 ) Ġshl Ġfrom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( this Ġand Ġmask . as Bits ()) Ġshr Ġfrom ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġslice ( range : ĠInt Range ): ĠInt Bits Ġ= Ġslice ( range . start , Ġrange . end Inclusive Ġ+ Ġ 1 ) ĊĠĠĠ Ġinline Ġfun Ġset Slice ( from : ĠInt Ġ= Ġ 0 , Ġto Exclusive : ĠInt Ġ= ĠSIZE , Ġvalue : ĠInt Bits ): ĠInt Bits Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( from Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġrequire ( to Exclusive Ġ>= Ġfrom ) ĊĠĠĠĠĠĠĠ Ġrequire ( to Exclusive Ġ<= ĠSIZE ) ĊĠĠĠĠĠĠĠ Ġval Ġones Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġsize Ġ= Ġto Exclusive Ġ- Ġfrom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSIZE Ġ-> Ġreturn Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ(( 1 Ġshl Ġsize ) Ġ- Ġ 1 ). as Bits () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġadjusted Value Ġ= Ġvalue Ġand Ġones ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġand Not Ġ( ones Ġshl Ġfrom ) Ġor Ġ( adjusted Value Ġshl Ġfrom ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġword At ( index : ĠInt , Ġbyte Size : ĠInt Ġ= ĠByte . SIZE _ BITS ) Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( index Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġrequire ( index Ġ< Ġceil ( SIZE . toDouble () Ġ/ Ġbyte Size )) ĊĠĠĠĠĠĠĠ Ġslice ( byte Size Ġ* Ġindex , Ġmin Of ( byte Size Ġ* Ġindex Ġ+ Ġbyte Size , ĠSIZE )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġset Word At ( index : ĠInt , Ġvalue : ĠInt Bits , Ġbyte Size : ĠInt Ġ= ĠByte . SIZE _ BITS ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Slice ( byte Size Ġ* Ġindex , Ġmin Of ( byte Size Ġ* Ġindex Ġ+ Ġbyte Size , ĠSIZE ), Ġvalue ) ĊĊĊĠĠĠ Ġ@ Suppress ( Warnings . OVERRIDE _ BY _ INLINE ) ĊĠĠĠ Ġoverride Ġinline Ġfun ĠtoString (): ĠString Ġ= Ġdata . to UInt (). toString ( 2 ) Ċ } Ċ Ċ inline Ġfun Ġbits ( data : ĠInt ) Ġ= Ġdata . as Bits () Ċ Ċ inline Ġfun ĠLong . as Bits () Ġ= ĠLong Bits ( this ) Ċ Ċ // put ting Ġthese Ġguys Ġas Ġmembers Ġtriggers Ċ // https :// yout rack . jetbrains . com / issue / KT - 3 1 4 3 1 Ċ val ĠLong Bits . Companion . Zero Ġget () Ġ= Ġ 0 L . as Bits () Ċ val ĠLong Bits . Companion . One Ġget () Ġ= Ġ 1 L . as Bits () Ċ val ĠLong Bits . Companion . All On es Ġget () Ġ= Ġ(- 1 L ). as Bits () Ċ val ĠLong Bits . Companion . SIZE Ġget () Ġ= ĠLong . SIZE _ BITS Ċ Ċ fun ĠLong Bits . Companion . fromString ( s : ĠString ): ĠLong Bits Ġ= Ġbits ( s . to UL ong ( 2 ). to Long ()) Ċ Ċ @ Opt In ( Experimental Std lib Api :: class ) Ċ inline Ġclass ĠLong Bits Ċ constructor ( val Ġdata : ĠLong ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{} ĊĊĠĠĠ Ġinline Ġfun Ġas Long () Ġ= Ġdata ĊĊĠĠĠ Ġinline Ġin fix Ġfun Ġshl ( bit Count : ĠInt ): ĠLong Bits Ġ= ĠLong Bits ( data Ġshl Ġbit Count ) ĊĠĠĠ Ġinline Ġin fix Ġfun Ġshr ( bit Count : ĠInt ): ĠLong Bits Ġ= ĠLong Bits ( data Ġ ush r Ġbit Count ) ĊĠĠĠ Ġinline Ġin fix Ġfun Ġand ( that : ĠLong Bits ): ĠLong Bits Ġ= ĠLong Bits ( data Ġand Ġthat . data ) ĊĠĠĠ Ġinline Ġin fix Ġfun Ġand Not ( that : ĠLong Bits ): ĠLong Bits Ġ= ĠLong Bits ( data Ġand Ġthat . data . inv ()) ĊĠĠĠ Ġinline Ġin fix Ġfun Ġor ( that : ĠLong Bits ): ĠLong Bits Ġ= ĠLong Bits ( data Ġor Ġthat . data ) ĊĠĠĠ Ġinline Ġin fix Ġfun Ġxor ( that : ĠLong Bits ): ĠLong Bits Ġ= ĠLong Bits ( data Ġxor Ġthat . data ) ĊĠĠĠ Ġinline Ġfun Ġinv (): ĠLong Bits Ġ= Ġdata . inv (). as Bits () ĊĠĠĠ Ġ// inline Ġfun Ġreverse (): ĠLong Bits Ġ= ĠJ Long . reverse ( data ). as Bits () ĊĊĠĠĠ Ġinline Ġval Ġpop Count : ĠInt Ġget () Ġ= Ġdata . count One Bits () ĊĠĠĠ Ġinline Ġval Ġlowest Bit Set Ġget () Ġ= ĠLong Bits ( data . take Low est One Bit ()) ĊĠĠĠ Ġinline Ġval Ġhighest Bit Set Ġget () Ġ= ĠLong Bits ( data . take Highest One Bit ()) ĊĠĠĠ Ġinline Ġval ĠnumberOf Leading Z eros : ĠInt Ġget () Ġ= Ġdata . count Leading Zero Bits () ĊĠĠĠ Ġinline Ġval ĠnumberOf Trailing Z eros : ĠInt Ġget () Ġ= Ġdata . count Trailing Zero Bits () ĊĊĠĠĠ Ġinline Ġfun ĠforEach One Bit ( body : Ġ( Long Bits ) Ġ-> ĠUnit ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġmask Ġ= Ġthis ĊĠĠĠĠĠĠĠ Ġwhile Ġ( mask Ġ!= ĠZero ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbit Ġ= Ġmask . lowest Bit Set ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbody ( bit ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmask Ġ= Ġmask Ġand Not Ġbit ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠD ANG ER : Ġbox ing ! ĊĠĠĠ Ġfun Ġone Bit Sequence () Ġ= Ġsequence Ġ{ ĠforEach One Bit Ġ{ Ġyield ( it ) Ġ} Ġ} ĊĊĠĠĠ Ġinline Ġoperator Ġfun Ġget ( index : ĠInt ) Ġ= Ġdata Ġand Ġ( 1 L Ġshl Ġindex ) Ġ!= Ġ 0 L ĊĠĠĠ Ġinline Ġfun Ġset ( index : ĠInt ) Ġ= Ġthis Ġor Ġ( One Ġshl Ġindex ) ĊĠĠĠ Ġinline Ġfun Ġclear ( index : ĠInt ) Ġ= Ġthis Ġand Not Ġ( One Ġshl Ġindex ) ĊĠĠĠ Ġinline Ġfun Ġslice ( from : ĠInt Ġ= Ġ 0 , Ġto Exclusive : ĠInt Ġ= ĠSIZE ): ĠLong Bits Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( from Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġrequire ( to Exclusive Ġ>= Ġfrom ) ĊĠĠĠĠĠĠĠ Ġrequire ( to Exclusive Ġ<= ĠSIZE ) ĊĠĠĠĠĠĠĠ Ġval Ġmask Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġsize Ġ= Ġto Exclusive Ġ- Ġfrom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġreturn ĠZero ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSIZE Ġ-> Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ(( 1 L Ġshl Ġsize ) Ġ- Ġ 1 L ) Ġshl Ġfrom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġ( this Ġand Ġmask . as Bits ()) Ġshr Ġfrom ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġslice ( range : ĠInt Range ): ĠLong Bits Ġ= Ġslice ( range . start , Ġrange . end Inclusive Ġ+ Ġ 1 ) ĊĠĠĠ Ġinline Ġfun Ġset Slice ( from : ĠInt Ġ= Ġ 0 , Ġto Exclusive : ĠInt Ġ= ĠSIZE , Ġvalue : ĠLong Bits ): ĠLong Bits Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( from Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġrequire ( to Exclusive Ġ>= Ġfrom ) ĊĠĠĠĠĠĠĠ Ġrequire ( to Exclusive Ġ<= ĠSIZE ) ĊĠĠĠĠĠĠĠ Ġval Ġones Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġsize Ġ= Ġto Exclusive Ġ- Ġfrom ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġreturn Ġthis ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSIZE Ġ-> Ġreturn Ġvalue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ(( 1 L Ġshl Ġsize ) Ġ- Ġ 1 ). as Bits () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġadjusted Value Ġ= Ġvalue Ġand Ġones ĊĊĠĠĠĠĠĠĠ Ġreturn Ġthis Ġand Not Ġ( ones Ġshl Ġfrom ) Ġor Ġ( adjusted Value Ġshl Ġfrom ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġword At ( index : ĠInt , Ġbyte Size : ĠInt Ġ= ĠByte . SIZE _ BITS ) Ġ= Ġrun Ġ{ ĊĠĠĠĠĠĠĠ Ġrequire ( index Ġ>= Ġ 0 ) ĊĠĠĠĠĠĠĠ Ġrequire ( index Ġ< Ġceil ( SIZE . toDouble () Ġ/ Ġbyte Size )) ĊĠĠĠĠĠĠĠ Ġslice ( byte Size Ġ* Ġindex , Ġmin Of ( byte Size Ġ* Ġindex Ġ+ Ġbyte Size , ĠSIZE )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinline Ġfun Ġset Word At ( index : ĠInt , Ġvalue : ĠLong Bits , Ġbyte Size : ĠInt Ġ= ĠByte . SIZE _ BITS ) Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġset Slice ( byte Size Ġ* Ġindex , Ġmin Of ( byte Size Ġ* Ġindex Ġ+ Ġbyte Size , ĠSIZE ), Ġvalue ) ĊĊĊĠĠĠ Ġ@ Suppress ( Warnings . OVERRIDE _ BY _ INLINE ) ĊĠĠĠ Ġoverride Ġinline Ġfun ĠtoString (): ĠString Ġ= Ġdata . to UL ong (). toString ( 2 ) Ċ } Ċ Ċ inline Ġfun Ġbits ( data : ĠLong ) Ġ= Ġdata . as Bits () Ċ