package Ġcom . so y wiz . kor io . serialization . binary Ċ Ċ import Ġcom . so y wiz . k mem .* Ċ import Ġcom . so y wiz . kor io . lang .* Ċ import Ġcom . so y wiz . kor io . serialization . binary . Struct Reflect . Companion . read Struct Ċ import Ġcom . so y wiz . kor io . stream .* Ċ import Ġcom . so y wiz . kor io . util .* Ċ import Ġjava . lang . Exception Ċ import Ġjava . lang . reflect .* Ċ import Ġjava . nio .* Ċ import Ġkotlin . reflect . K Property Ċ Ċ /* Ċ class ĠWrite Once Count Delegate () Ġ: ĠRead Write Delegate < Struct . Type . ARRAY , ĠInt > Ġ{ ĊĠ Ġprivate Ġvar Ġoverride Size : ĠInt ? Ġ= Ġnull ĊĠ Ġfun ĠgetValue ( this Ref : ĠStruct . Type . ARRAY , Ġproperty : ĠK Property < Int >): ĠInt Ġ{ ĊĠĠĠ Ġreturn Ġoverride Size Ġ?: Ġif Ġ( this Ref . use Alt Size ) Ġ{ ĊĠĠĠĠĠ Ġthis Ref . alt Size Source ?. getInt ( this Ref . outer Instance )?. also Ġ{ Ġthis . override Size Ġ= Ġit Ġ} Ġ?: Ġthis Ref . count ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠ Ġthis Ref . count ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġfun ĠsetValue ( this Ref : ĠStruct . Type . ARRAY , Ġproperty : ĠK Property < Int >, Ġvalue : ĠInt ) Ġ{ ĊĠĠĠ Ġoverride Size Ġ= Ġoverride Size Ġ?: Ġvalue ĊĠ Ġ} Ċ } Ċ */ Ċ @ Experimental Unsigned Types Ċ interface ĠStruct Ġ{ ĊĠ Ġval Ġself : ĠAny ? ĊĠĠĠ Ġget () Ġ= Ġthis ĊĠ Ġsealed Ġclass ĠType ( ĊĠĠĠĠĠ Ġval Ġsize : ĠInt ĊĠ Ġ) Ġ{ ĊĠĠĠ Ġobject ĠS 1 Ġ: ĠType ( 1 ) ĊĠĠĠ Ġobject ĠS 2 Ġ: ĠType ( 2 ) ĊĠĠĠ Ġobject ĠS 4 Ġ: ĠType ( 4 ) ĊĠĠĠ Ġobject ĠS 8 Ġ: ĠType ( 8 ) ĊĠĠĠ Ġobject ĠF 4 Ġ: ĠType ( 4 ) ĊĠĠĠ Ġobject ĠF 8 Ġ: ĠType ( 8 ) ĊĠĠĠ Ġobject ĠU 1 Ġ: ĠType ( 1 ) ĊĠĠĠ Ġobject ĠU 2 Ġ: ĠType ( 2 ) ĊĠĠĠ Ġobject ĠU 4 Ġ: ĠType ( 4 ) ĊĠĠĠ Ġobject ĠU 8 Ġ: ĠType ( 8 ) ĊĠĠĠ Ġclass ĠCUSTOM ( val Ġelement Clazz : ĠClass < Struct >) Ġ: ĠType ( Struct Reflect [ element Clazz ]. size ) ĊĠĠĠ Ġclass ĠARRAY ( ĊĠĠĠĠĠĠĠ Ġval Ġelement Type : ĠType , ĊĠĠĠĠĠĠĠ Ġval Ġcount : ĠInt ĊĠĠĠ Ġ) Ġ: ĠType ( elementType . size Ġ* Ġcount ) ĊĠĠĠ Ġclass ĠSTRING ( val Ġcharset : ĠCharset , Ġval Ġcount : ĠInt ) Ġ: ĠType ( count ) ĊĠ Ġ} Ċ } Ċ Ċ @ Target ( Annotation Target . FIELD , ĠAnnotation Target . CLASS ) Ċ annotation Ġclass ĠLE Ċ Ċ @ Target ( Annotation Target . FIELD , ĠAnnotation Target . CLASS ) Ċ annotation Ġclass ĠBE Ċ Ċ annotation Ġclass ĠSize ( val Ġsize : ĠInt ) Ċ @ Target ( Annotation Target . FIELD ) Ċ annotation Ġclass ĠOffset ( val Ġoffset : ĠInt ) Ċ Ċ @ Target ( Annotation Target . FIELD ) Ċ annotation Ġclass ĠCount ( val Ġcount : ĠInt ) Ċ Ċ @ Target ( Annotation Target . FIELD ) Ċ annotation Ġclass ĠDynamic Count ( val ĠfieldName : ĠString ) Ċ Ċ @ Target ( Annotation Target . FIELD ) Ċ annotation Ġclass ĠEncoding ( val Ġname : ĠString ) Ċ Ċ @ Target ( Annotation Target . FIELD ) Ċ annotation Ġclass ĠOrder ( val Ġorder : ĠInt ) Ċ Ċ class ĠStruct Reflect < T >( private Ġval Ġclazz : ĠClass < T >) Ġ{ ĊĠ Ġdata Ġclass ĠField Info ( ĊĠĠĠĠĠ Ġval Ġfield : ĠField , ĊĠĠĠĠĠ Ġval Ġoffset : ĠInt , ĊĠĠĠĠĠ Ġval Ġtype : ĠStruct . Type , ĊĠĠĠĠĠ Ġval Ġbig Endian : ĠBoolean ĊĠ Ġ) ĊĊĠ Ġvar Ġlast Instance : ĠT ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġset ĊĠ Ġprivate Ġval Ġcf Ġ= ĠClass Factory ( clazz ) ĊĠ Ġval Ġconstructor Ġ= Ġclazz . declared Construct ors . first OrNull () ĊĠĠĠĠĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Class Ġ$ clazz Ġdoesn 't Ġhave Ġconstructors ") ĊĠ Ġprivate Ġval Ġfields : ĠArray < Field > Ġ= Ġclazz . declared Fields ĊĠ Ġprivate Ġval Ġglobal Bo Ġ= Ġwhen Ġ{ ĊĠĠĠ Ġclazz . getAnnotation ( LE :: class . java ) Ġ!= Ġnull Ġ-> Ġ ĠByte Order . LIT TLE _ ENDIAN ĊĠĠĠ Ġclazz . getAnnotation ( BE :: class . java ) Ġ!= Ġnull Ġ-> ĠByte Order . BIG _ ENDIAN ĊĠĠĠ Ġelse Ġ-> Ġnull ĊĠ Ġ} ĊĊĠ Ġ@ Experimental Unsigned Types ĊĠ Ġprivate Ġfun Ġdecode Type ( field : ĠField , Ġclazz : ĠClass <* >, Ġtarget : ĠT ?): ĠStruct . Type Ġ{ ĊĠĠĠ Ġreturn Ġwhen Ġ( clazz ) Ġ{ ĊĠĠĠĠĠ Ġjava . lang . Byte . TYPE Ġ-> ĠStruct . Type . S 1 ĊĠĠĠĠĠ Ġjava . lang . Short . TYPE Ġ-> ĠStruct . Type . S 2 ĊĠĠĠĠĠ Ġjava . lang . Integer . TYPE Ġ-> ĠStruct . Type . S 4 ĊĠĠĠĠĠ Ġjava . lang . Long . TYPE Ġ-> ĠStruct . Type . S 8 ĊĠĠĠĠĠ Ġjava . lang . Float . TYPE Ġ-> ĠStruct . Type . F 4 ĊĠĠĠĠĠ Ġjava . lang . Double . TYPE Ġ-> ĠStruct . Type . F 8 ĊĠĠĠĠĠ ĠU Byte . java Class Ġ-> ĠStruct . Type . U 1 ĊĠĠĠĠĠ ĠU Short . java Class Ġ-> ĠStruct . Type . U 2 ĊĠĠĠĠĠ ĠUInt . java Class Ġ-> ĠStruct . Type . U 4 ĊĠĠĠĠĠ ĠU Long . java Class Ġ-> ĠStruct . Type . U 8 ĊĠĠĠĠĠ Ġjava . lang . String :: class . java Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġencoding Ġ= Ġfield . getAnnotation ( Encoding :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġfield . getAnnotation ( Count :: class . java ) ĊĠĠĠĠĠĠĠ Ġval Ġcharset Ġ= ĠCharset . forName ( encoding . name ) ĊĠĠĠĠĠĠĠ ĠStruct . Type . STRING ( charset , Ġcount . count ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( clazz . isArray ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġfield ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . type . getField ( it . getAnnotation ( Dynamic Count :: class . java ). fieldName ). getInt ( target ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( anything : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfield . getAnnotation ( Count :: class . java ). count ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠ ĠStruct . Type . ARRAY ( decode Type ( field , Ġclazz . component Type , Ġtarget ), Ġcount ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠStruct . Type . CUSTOM ( clazz Ġas ĠClass < Struct >) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġvar Ġlast Offset Ġ= Ġ 0 ĊĊĠ Ġval Ġfields With Annotation Ġ= Ġfields ĊĠĠĠĠĠ Ġ. filter Ġ{ Ġ( it . getAnnotation ( Offset :: class . java ) Ġ!= Ġnull ) Ġ|| Ġ( it . getAnnotation ( Order :: class . java ) Ġ!= Ġnull ) Ġ} ĊĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . getAnnotation ( Offset :: class . java )?. offset Ġ?: Ġit . getAnnotation ( Order :: class . java )?. order Ġ?: Ġ 0 Ġ} ĊĠĠĠĠĠ Ġ. map Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbo Ġ= Ġif Ġ( it . getAnnotation ( LE :: class . java ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠByte Order . LIT TLE _ ENDIAN ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( it . getAnnotation ( BE :: class . java ) Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ ĠByte Order . BIG _ ENDIAN ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġab Ġ= Ġbo Ġ?: Ġglobal Bo Ġ?: ĠByte Order . LIT TLE _ ENDIAN ĊĠĠĠĠĠĠĠ Ġval Ġlittle Endian Ġ= Ġ( ab Ġ== ĠByte Order . LIT TLE _ ENDIAN ) ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġdecode Type ( it , Ġit . type , Ġlast Instance ) ĊĊĠĠĠĠĠĠĠ Ġval Ġoffset Ġ= Ġit . getAnnotation ( Offset :: class . java )?. offset Ġ?: Ġlast Offset ĊĊĠĠĠĠĠĠĠ Ġlast Offset Ġ= Ġoffset Ġ+ Ġtype . size ĊĊĠĠĠĠĠĠĠ ĠField Info ( it , Ġoffset , Ġtype , Ġlittle Endian ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ. sorted By Ġ{ Ġit . offset Ġ} ĊĊĠ Ġval Ġspecified Size Ġ= Ġclazz . getAnnotation ( Size :: class . java )?. size ĊĠ Ġval Ġcalculated Size Ġ= Ġfields With Annotation . map Ġ{ Ġit . offset Ġ+ Ġit . type . size Ġ}. max () ĊĠ Ġval Ġsize Ġ= Ġspecified Size Ġ?: Ġcalculated Size Ġ?: Ġfields With Annotation . map Ġ{ Ġit . offset Ġ+ Ġit . type . size Ġ}. max () ĊĠ Ġ?: Ġthrow ĠIllegalArgumentException (" Empty Ġstruct Ġ$ clazz Ġor Ġwithout Ġ@ Offset ") ĊĊĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠ Ġfun Ġcreate (): ĠT Ġ= Ġcf . create Dummy () ĊĊĠ Ġinit Ġ{ ĊĠĠĠ Ġfor Ġ( f Ġin Ġfields ) Ġ{ ĊĠĠĠĠĠ Ġf . is Accessible Ġ= Ġtrue ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠ Ġval Ġcache Ġ= Ġlinked Map Of < Class <* >, ĠStruct Reflect <* >>() ĊĠĠĠ Ġ@ Suppress (" UN CHECK ED _ CAST ") ĊĠĠĠ Ġoperator Ġfun Ġ< T > Ġget ( clazz : ĠClass < T >): ĠStruct Reflect < T > Ġ{ ĊĠĠĠĠĠ Ġreturn Ġcache . get Or Put ( clazz ) Ġ{ ĊĠĠĠĠĠĠĠ ĠStruct Reflect < T >( clazz ) ĊĠĠĠĠĠ Ġ} Ġas ĠStruct Reflect < T > ĊĠĠĠ Ġ} ĊĠĠĠ Ġfun Ġ< T Ġ: ĠStruct > ĠByteArray . read Struct ( offset : ĠInt , Ġclazz : ĠClass < T >): ĠT Ġ{ ĊĠĠĠĠĠ Ġval Ġsr Ġ= ĠStruct Reflect [ clazz ] ĊĠĠĠĠĠ Ġval Ġobj Ġ= Ġsr . create () ĊĠĠĠĠĠ Ġsr . last Instance Ġ= Ġobj ĊĊĠĠĠĠĠ Ġfor Ġ(( field , Ġo , Ġtype , Ġlittle Endian ) Ġin Ġsr . fields With Annotation ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfield . set ( obj , Ġread Struct Element ( offset Ġ+ Ġo , Ġtype , Ġlittle Endian , Ġobj )) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġobj ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ Ċ fun Ġ< T Ġ: ĠStruct > ĠClass < T >. get Struct Size (): ĠInt Ġ= ĠStruct Reflect [ this ]. size Ċ Ċ @ Experimental Unsigned Types Ċ fun ĠByteArray . read Struct Element ( offset : ĠInt , Ġtype : ĠStruct . Type , Ġlittle Endian : ĠBoolean , Ġinstance : ĠAny ?): ĠAny Ġ{ ĊĠ Ġval Ġdata Ġ= Ġthis ĊĠ Ġreturn Ġwhen Ġ( type ) Ġ{ ĊĠĠĠ ĠStruct . Type . S 1 Ġ-> Ġdata . read S 8 ( offset ). to Byte () ĊĠĠĠ ĠStruct . Type . S 2 Ġ-> Ġdata . read S 1 6 ( offset , Ġlittle Endian ). to Short () ĊĠĠĠ ĠStruct . Type . S 4 Ġ-> Ġdata . read S 3 2 ( offset , Ġlittle Endian ) ĊĠĠĠ ĠStruct . Type . S 8 Ġ-> Ġdata . read S 6 4 ( offset , Ġlittle Endian ) ĊĠĠĠ ĠStruct . Type . F 4 Ġ-> Ġdata . read F 3 2 ( offset , Ġlittle Endian ) ĊĠĠĠ ĠStruct . Type . F 8 Ġ-> Ġdata . read F 6 4 ( offset , Ġlittle Endian ) ĊĠĠĠ ĠStruct . Type . U 1 Ġ-> Ġdata . read S 8 ( offset ). to U Byte () ĊĠĠĠ ĠStruct . Type . U 2 Ġ-> Ġdata . read S 1 6 ( offset , Ġlittle Endian ). to U Short () ĊĠĠĠ ĠStruct . Type . U 4 Ġ-> Ġdata . read S 3 2 ( offset , Ġlittle Endian ). to UInt () ĊĠĠĠ ĠStruct . Type . U 8 Ġ-> Ġdata . read S 6 4 ( offset , Ġlittle Endian ). to UL ong () ĊĠĠĠ Ġis ĠStruct . Type . CUSTOM Ġ-> Ġdata . read Struct ( offset , Ġtype . element Clazz ) ĊĠĠĠ Ġis ĠStruct . Type . ARRAY Ġ-> Ġ{ ĊĠĠĠĠĠ Ġval Ġelement Size Ġ= Ġtype . elementType . size ĊĠĠĠĠĠ Ġval Ġelement Type Ġ= Ġtype . elementType ĊĠĠĠĠĠ Ġval Ġcount Ġ= Ġtype . count ĊĠĠĠĠĠ Ġwhen Ġ( elementType ) Ġ{ ĊĠĠĠĠĠĠĠ ĠStruct . Type . S 1 Ġ-> Ġread ByteArray ( offset , Ġcount ) ĊĠĠĠĠĠĠĠ ĠStruct . Type . S 2 Ġ-> Ġread Short Array ( offset , Ġcount , Ġlittle Endian ) ĊĠĠĠĠĠĠĠ ĠStruct . Type . S 4 Ġ-> Ġread IntArray ( offset , Ġcount , Ġlittle Endian ) ĊĠĠĠĠĠĠĠ ĠStruct . Type . S 8 Ġ-> Ġread Long Array ( offset , Ġcount , Ġlittle Endian ) ĊĠĠĠĠĠĠĠ ĠStruct . Type . F 4 Ġ-> Ġread Float Array ( offset , Ġcount , Ġlittle Endian ) ĊĠĠĠĠĠĠĠ ĠStruct . Type . F 8 Ġ-> Ġread Double Array ( offset , Ġcount , Ġlittle Endian ) ĊĠĠĠĠĠĠĠ ĠStruct . Type . U 1 Ġ-> Ġread U ByteArray ( offset , Ġcount ) ĊĠĠĠĠĠĠĠ ĠStruct . Type . U 2 Ġ-> Ġread U Short Array ( offset , Ġcount , Ġlittle Endian ) ĊĠĠĠĠĠĠĠ ĠStruct . Type . U 4 Ġ-> Ġread UInt Array ( offset , Ġcount , Ġlittle Endian ) ĊĠĠĠĠĠĠĠ ĠStruct . Type . U 8 Ġ-> Ġread UL ong Array ( offset , Ġcount , Ġlittle Endian ) ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĊĠĠĠĠĠĠĠĠĠ Ġval Ġal Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( 0 Ġuntil Ġcount ). map Ġ{ Ġread Struct Element ( offset Ġ+ Ġelement Size Ġ* Ġit , Ġelement Type , Ġlittle Endian , Ġinstance ) Ġ} ĊĠĠĠĠĠĠĠĠĠ Ġval Ġout Ġ= Ġjava . lang . reflect . Array . newInstance ( al . first () :: class . java , Ġal . size ) ĊĠĠĠĠĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 0 Ġuntil Ġcount ) Ġjava . lang . reflect . Array . set ( out , Ġn , Ġal [ n ]) ĊĠĠĠĠĠĠĠĠĠ Ġout ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠStruct . Type . STRING Ġ-> Ġ{ ĊĠĠĠĠĠ Ġval Ġstr Bytes Ġ= Ġread ByteArray ( offset , Ġtype . count ) ĊĠĠĠĠĠ Ġstr Bytes . copyOf ( str Bytes . indexOf ( 0 , Ġdefault Ġ= Ġstr Bytes . size )). toString ( type . charset ) ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } ĊĊĊ Ċ inline Ġfun Ġ< re ified ĠT Ġ: ĠStruct > ĠSync Stream . read Struct () Ġ= Ġthis . read Struct ( T :: class . java ) Ċ fun Ġ< T Ġ: ĠStruct > ĠSync Stream . read Struct ( clazz : ĠClass < T >): ĠT Ġ{ ĊĠ Ġreturn Ġread Bytes ( clazz . get Struct Size ()). read Struct ( 0 , Ġclazz ) Ċ } Ċ Ċ @ Experimental Unsigned Types Ċ fun ĠByteArray . write Struct Element ( offset : ĠInt , Ġtype : ĠStruct . Type , Ġvalue : ĠAny , Ġlittle Endian : ĠBoolean ): ĠInt Ġ{ ĊĠ Ġwhen Ġ( type ) Ġ{ ĊĠĠĠ ĠStruct . Type . S 1 Ġ-> Ġwrite 8 ( offset , Ġ( value Ġas ĠByte ). toInt ()) ĊĠĠĠ ĠStruct . Type . S 2 Ġ-> Ġwrite 1 6 ( offset , Ġ( value Ġas ĠShort ). toInt (), Ġlittle Endian ) ĊĠĠĠ ĠStruct . Type . S 4 Ġ-> Ġwrite 3 2 ( offset , Ġ( value Ġas ĠInt ). toInt (), Ġlittle Endian ) ĊĠĠĠ ĠStruct . Type . S 8 Ġ-> Ġwrite 6 4 ( offset , Ġ( value Ġas ĠLong ). to Long (), Ġlittle Endian ) ĊĠĠĠ ĠStruct . Type . F 4 Ġ-> Ġwrite F 3 2 ( offset , Ġ( value Ġas ĠFloat ). toFloat (), Ġlittle Endian ) ĊĠĠĠ ĠStruct . Type . F 8 Ġ-> Ġwrite F 6 4 ( offset , Ġ( value Ġas ĠDouble ). toDouble (), Ġlittle Endian ) ĊĠĠĠ Ġis ĠStruct . Type . CUSTOM Ġ-> Ġwrite Struct ( offset , Ġvalue Ġas ĠStruct ) ĊĠĠĠ Ġis ĠStruct . Type . ARRAY Ġ-> Ġ{ ĊĠĠĠĠĠ Ġvar Ġco Ġ= Ġoffset ĊĠĠĠĠĠ Ġfor Ġ( n Ġin Ġ 0 Ġuntil Ġtype . count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġco Ġ+= Ġwrite Struct Element ( co , Ġtype . elementType , Ġjava . lang . reflect . Array . get ( value , Ġn ), Ġlittle Endian ) ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠStruct . Type . STRING Ġ-> Ġ{ ĊĠĠĠĠĠ Ġwrite Bytes ( offset , Ġ(( value Ġas ĠString ). toByteArray ( type . charset ). copyOf ( type . count ))) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĠ Ġreturn Ġtype . size Ċ } Ċ Ċ fun Ġ< T Ġ: ĠStruct > ĠByteArray . write Struct ( offset : ĠInt , Ġobj : ĠT ): ĠByteArray Ġ{ ĊĠ Ġval Ġsr Ġ= ĠStruct Reflect [ obj :: class . java ] ĊĠ Ġval Ġout Ġ= Ġthis ĊĊĠ Ġfor Ġ(( field , Ġo , Ġtype , Ġlittle Endian ) Ġin Ġsr . fields With Annotation ) Ġ{ ĊĠĠĠ Ġout . write Struct Element ( offset Ġ+ Ġo , Ġtype , Ġfield . get ( obj ), Ġlittle Endian ) ĊĠ Ġ} ĊĊĠ Ġreturn Ġout Ċ } Ċ Ċ fun Ġ< T Ġ: ĠStruct > ĠT . get Struct Bytes (): ĠByteArray Ġ= ĠByteArray ( Struct Reflect [ this :: class . java ]. size ). write Struct ( 0 , Ġthis ) Ċ Ċ fun Ġ< T Ġ: ĠStruct > ĠSync Stream . write Struct ( obj : ĠT ) Ġ= Ġthis . write Bytes ( obj . get Struct Bytes ()) Ċ Ċ suspend Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠStruct > ĠAsync Stream . read Struct ( clazz : ĠClass < T >): ĠT Ġ{ ĊĠ Ġreturn Ġread Bytes Exact ( clazz . get Struct Size ()). read Struct ( 0 , Ġclazz ) Ċ } Ċ Ċ suspend Ġinline Ġfun Ġ< re ified ĠT Ġ: ĠStruct > ĠAsync Stream . read Struct () Ġ= Ġthis . read Struct ( T :: class . java ) Ċ Ċ suspend Ġfun Ġ< T Ġ: ĠStruct > ĠAsync Stream . write Struct ( obj : ĠT ) Ġ= Ġthis . write Bytes ( obj . get Struct Bytes ()) Ċ Ċ inline Ġfun Ġ< T > ĠByteArray . read UT yped Array ( o : ĠInt , Ġcount : ĠInt , Ġelement Size : ĠInt , Ġarray : ĠT , Ġcross inline Ġread : ĠByteArray .( array : ĠT , Ġn : ĠInt , Ġpos : ĠInt ) Ġ-> ĠUnit ): ĠT Ġ= Ġarray . also Ġ{ ĊĠ Ġfor Ġ( n Ġin Ġ 0 Ġuntil Ġcount ) Ġread ( this , Ġarray , Ġn , Ġo Ġ+ Ġn Ġ* Ġelement Size ) Ċ } Ċ Ċ fun ĠByteArray . read U ByteArray ( o : ĠInt , Ġcount : ĠInt ): ĠU ByteArray Ġ= Ġthis . copyOf Range ( o , Ġo Ġ+ Ġcount ). as U ByteArray () Ċ Ċ fun ĠByteArray . read U Short Array LE ( o : ĠInt , Ġcount : ĠInt ): ĠU Short Array Ġ= Ġthis . read UT yped Array ( ĊĠĠĠ Ġo , Ġcount , Ġ 2 , ĠU Short Array ( count ) Ċ ) Ġ{ Ġarray , Ġn , Ġpos Ġ-> Ġarray [ n ] Ġ= Ġread S 1 6 LE ( pos ). to Short (). to U Short () Ġ} Ċ Ċ fun ĠByteArray . read UInt Array LE ( o : ĠInt , Ġcount : ĠInt ): ĠUInt Array Ġ= Ġthis . read UT yped Array ( o , Ġcount , Ġ 4 , ĠUInt Array ( count )) Ġ{ Ġarray , Ġn , Ġpos Ġ-> Ġarray [ n ] Ġ= Ġread S 3 2 LE ( pos ). to UInt () Ġ} Ċ fun ĠByteArray . read UL ong Array LE ( o : ĠInt , Ġcount : ĠInt ): ĠU Long Array Ġ= Ġthis . read UT yped Array ( o , Ġcount , Ġ 8 , ĠU Long Array ( count )) Ġ{ Ġarray , Ġn , Ġpos Ġ-> Ġarray [ n ] Ġ= Ġread S 6 4 LE ( pos ). to UL ong () Ġ} Ċ fun ĠByteArray . read U Short Array BE ( o : ĠInt , Ġcount : ĠInt ): ĠU Short Array Ġ= Ġthis . read UT yped Array ( o , Ġcount , Ġ 2 , ĠU Short Array ( count )) Ġ{ Ġarray , Ġn , Ġpos Ġ-> Ġarray [ n ] Ġ= Ġread S 1 6 BE ( pos ). to U Short () Ġ} Ċ fun ĠByteArray . read UInt Array BE ( o : ĠInt , Ġcount : ĠInt ): ĠUInt Array Ġ= Ġthis . read UT yped Array ( o , Ġcount , Ġ 4 , ĠUInt Array ( count )) Ġ{ Ġarray , Ġn , Ġpos Ġ-> Ġarray [ n ] Ġ= Ġread S 3 2 BE ( pos ). to UInt () Ġ} Ċ fun ĠByteArray . read UL ong Array BE ( o : ĠInt , Ġcount : ĠInt ): ĠU Long Array Ġ= Ġthis . read UT yped Array ( o , Ġcount , Ġ 8 , ĠU Long Array ( count )) Ġ{ Ġarray , Ġn , Ġpos Ġ-> Ġarray [ n ] Ġ= Ġread S 6 4 BE ( pos ). to UL ong () Ġ} Ċ Ċ fun ĠByteArray . read U Short Array ( o : ĠInt , Ġcount : ĠInt , Ġlittle : ĠBoolean ): ĠU Short Array Ġ= Ġif Ġ( little ) Ġread U Short Array LE ( o , Ġcount ) Ġelse Ġread U Short Array BE ( o , Ġcount ) Ċ fun ĠByteArray . read UInt Array ( o : ĠInt , Ġcount : ĠInt , Ġlittle : ĠBoolean ): ĠUInt Array Ġ= Ġif Ġ( little ) Ġread UInt Array LE ( o , Ġcount ) Ġelse Ġread UInt Array BE ( o , Ġcount ) Ċ fun ĠByteArray . read UL ong Array ( o : ĠInt , Ġcount : ĠInt , Ġlittle : ĠBoolean ): ĠU Long Array Ġ= Ġif Ġ( little ) Ġread UL ong Array LE ( o , Ġcount ) Ġelse Ġread UL ong Array BE ( o , Ġcount ) Ċ