package Ġcom . gitlab . k ord lib . common Ċ Ċ import Ġkotlinx . serialization . K Serializer Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġkotlinx . serialization . descriptors . Primitive Kind Ċ import Ġkotlinx . serialization . descriptors . Primitive Serial Descriptor Ċ import Ġkotlinx . serialization . descriptors . Serial Descriptor Ċ import Ġkotlinx . serialization . encoding . Decoder Ċ import Ġkotlinx . serialization . encoding . Encoder Ċ import Ġjava . math . BigInteger Ċ import Ġjava . nio . ByteBuffer Ċ import Ġkotlin . math . max Ċ import Ġkotlin . math . min Ċ Ċ private Ġconst Ġval ĠSA FE _ LENGTH Ġ= Ġ 1 9 Ċ private Ġconst Ġval ĠWIDTH Ġ= ĠByte . SIZE _ BITS Ċ fun ĠEmpty Bit Set () Ġ= ĠDiscord Bit Set ( 0 ) Ċ Ċ @ Opt In ( Experimental Unsigned Types :: class ) Ċ @ Serializable ( with Ġ= ĠDiscord Bit Set Serializer :: class ) Ċ class ĠDiscord Bit Set ( internal Ġvar Ġdata : ĠLong Array ) Ġ{ ĊĊĠĠĠ Ġval ĠisEmpty : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdata . all Ġ{ Ġit Ġ== Ġ 0 L Ġ} ĊĊĠĠĠ Ġval Ġvalue : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuffer Ġ= ĠByteBuffer . allocate ( data . size Ġ* ĠLong . SIZE _ BYTES ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbuffer . as Long Buffer (). put ( data . reversed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠBigInteger ( buffer . array ()). toString () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġval Ġsize : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdata . size Ġ* ĠWIDTH ĊĊĠĠĠ Ġval Ġbinary : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdata . join ToString ("") Ġ{ Ġit . to UL ong (). toString ( 2 ) Ġ}. reversed (). pad End ( 8 , Ġ' 0 ') ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠDiscord Bit Set ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmax ( data . size , Ġother . data . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( get Or Zero ( i ) Ġ!= Ġget Or Zero ( i )) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Or Zero ( i : ĠInt ) Ġ= Ġdata . get OrNull ( i ) Ġ?: Ġ 0 L ĊĊĠĠĠ Ġoperator Ġfun Ġget ( index : ĠInt ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ! in Ġ 0 Ġuntil Ġsize ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval ĠindexOf Width Ġ= Ġindex Ġ/ ĠWIDTH ĊĠĠĠĠĠĠĠ Ġval Ġbit Index Ġ= Ġindex Ġ% ĠWIDTH ĊĠĠĠĠĠĠĠ Ġreturn Ġdata [ indexOf Width ] Ġand Ġ( 1 L Ġshl Ġbit Index ) Ġ!= Ġ 0 L ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġcontains ( other : ĠDiscord Bit Set ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif ( other . size Ġ> Ġsize ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġother . data . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( data [ i ] Ġand Ġother . data [ i ] Ġ!= Ġother . data [ i ]) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġset ( index : ĠInt , Ġvalue : ĠBoolean ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ! in Ġ 0 Ġuntil Ġsize ) Ġdata . copyOf (( 6 3 Ġ+ Ġindex ) Ġ/ ĠWIDTH ) ĊĠĠĠĠĠĠĠ Ġval ĠindexOf Width Ġ= Ġindex Ġ/ ĠWIDTH ĊĠĠĠĠĠĠĠ Ġval Ġbit Index Ġ= Ġindex Ġ% ĠWIDTH ĊĠĠĠĠĠĠĠ Ġval Ġbit Ġ= Ġif Ġ( value ) Ġ 1 L Ġelse Ġ 0 L ĊĠĠĠĠĠĠĠ Ġdata [ index ] Ġ= Ġdata [ indexOf Width ] Ġor Ġ( bit Ġshl Ġbit Index ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġplus ( another : ĠDiscord Bit Set ): ĠDiscord Bit Set Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdist Ġ= ĠLong Array ( size ) ĊĠĠĠĠĠĠĠ Ġdata . copy Into ( dist ) ĊĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= ĠDiscord Bit Set ( dist ) ĊĠĠĠĠĠĠĠ Ġcopy . add ( another ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġminus ( another : ĠDiscord Bit Set ): ĠDiscord Bit Set Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdist Ġ= ĠLong Array ( size ) ĊĠĠĠĠĠĠĠ Ġdata . copy Into ( dist ) ĊĠĠĠĠĠĠĠ Ġval Ġcopy Ġ= ĠDiscord Bit Set ( dist ) ĊĠĠĠĠĠĠĠ Ġcopy . remove ( another ) ĊĠĠĠĠĠĠĠ Ġreturn Ġcopy ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġadd ( another : ĠDiscord Bit Set ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( another . data . size Ġ> Ġdata . size ) Ġdata Ġ= Ġdata . copyOf ( another . data . size ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġanother . data . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ i ] Ġ= Ġdata [ i ] Ġor Ġanother . data [ i ] ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĊĠĠĠ Ġfun Ġremove ( another : ĠDiscord Bit Set ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġmin ( data . size , Ġanother . data . size )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdata [ i ] Ġ= Ġdata [ i ] Ġxor Ġ( data [ i ] Ġand Ġanother . data [ i ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġdata . content HashCode () ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġsize ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ" Discord Bit Set ($ binary )" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( var arg Ġwidths : ĠLong ): ĠDiscord Bit Set Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDiscord Bit Set ( widths ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoperator Ġfun Ġinvoke ( value : ĠString ): ĠDiscord Bit Set Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( value . length Ġ<= ĠSA FE _ LENGTH ) Ġ{// Ġfast Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDiscord Bit Set ( long ArrayOf ( value . to UL ong (). to Long ())) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= ĠBigInteger ( value ). toByteArray () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlong Size Ġ= Ġ( bytes . size Ġ/ ĠLong . SIZE _ BYTES ) Ġ+ Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdestination Ġ= ĠLong Array ( long Size ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlong Index Ġ= Ġ- 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbytes . reversed (). forEach Indexed Ġ{ Ġindex , Ġbyte Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġindex Ġ% ĠLong . SIZE _ BYTES ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( offset Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlong Index Ġ+= Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdestination [ long Index ] Ġ= Ġ( destination [ long Index ]. to UL ong () Ġor Ġ( byte . to U Byte (). to UL ong () Ġshl Ġoffset Ġ* ĠByte . SIZE _ BITS )). to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDiscord Bit Set ( destination ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } ĊĊ Ċ object ĠDiscord Bit Set Serializer Ġ: ĠK Serializer < Discord Bit Set > Ġ{ ĊĠĠĠ Ġoverride Ġval Ġdescriptor : ĠSerial Descriptor ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠPrimitive Serial Descriptor (" Discord Bit Set ", ĠPrimitive Kind . STRING ) ĊĊĠĠĠ Ġoverride Ġfun Ġdeserialize ( decoder : ĠDecoder ): ĠDiscord Bit Set Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠDiscord Bit Set ( decoder . decode String ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġserialize ( encoder : ĠEncoder , Ġvalue : ĠDiscord Bit Set ) Ġ{ ĊĠĠĠĠĠĠĠ Ġencoder . encode String ( value . value ) ĊĊĠĠĠ Ġ} Ċ } ĊĊ