/* ĊĠĠĠ ĠCopyright Ġ 2 0 1 7 - 2 0 2 1 ĠChar les ĠK orn . ĊĊĠĠĠ ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); ĊĠĠĠ Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . ĊĠĠĠ ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat ĊĊĠĠĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 ĊĊĠĠĠ ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware ĊĠĠĠ Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , ĊĠĠĠ ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . ĊĠĠĠ ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand ĊĠĠĠ Ġlimitations Ġunder Ġthe ĠLicense . Ċ */ Ċ Ċ package Ġb ate ct . config Ċ Ċ import Ġb ate ct . config . io . ConfigurationException Ċ import Ġcom . char les k orn . k aml . Yaml Input Ċ import Ġkotlinx . serialization . K Serializer Ċ import Ġkotlinx . serialization . Serializable Ċ import Ġkotlinx . serialization . builtins . serializer Ċ import Ġkotlinx . serialization . descriptors . Serial Descriptor Ċ import Ġkotlinx . serialization . encoding . Decoder Ċ import Ġkotlinx . serialization . encoding . Encoder Ċ Ċ @ Serializable ( with Ġ= ĠBinary Size . Companion :: class ) Ċ data Ġclass ĠBinary Size ( ĊĠĠĠ Ġval Ġbytes : ĠLong Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ: ĠK Serializer < Binary Size > Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġof ( count : ĠLong , Ġunit : ĠBinary Unit ) Ġ= ĠBinary Size ( count Ġ* Ġunit . bytes ) ĊĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġparsing Pattern Ġ= Ġ""" ^ (? < count >\ d +)\ s *( ?< unit >[ mk g ] ?) b ?$ """. to Regex ( Regex Option . IGNORE _ CASE ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġval Ġdescriptor : ĠSerial Descriptor Ġ= ĠString . serializer (). descriptor ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġdeserialize ( decoder : ĠDecoder ): ĠBinary Size Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġdecoder . decode String () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmatch Ġ= Ġparsing Pattern . match Ent ire ( value ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( match Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠConfiguration Exception (" Invalid Ġsize Ġ'$ value '. ĠIt Ġmust Ġbe Ġin Ġthe Ġformat Ġ' 1 2 3 ', Ġ' 1 2 3 b ', Ġ' 1 2 3 k ', Ġ' 1 2 3 m ' Ġor Ġ' 1 2 3 g '. ", Ġdecoder Ġas ĠYaml Input ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcount Ġ= Ġmatch . groups [" count "] !!. value . to Long () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġunit Ġ= Ġwhen Ġ( match . groups [" unit "] !!. value . lowercase ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"" Ġ-> ĠBinary Unit . Byte ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" k " Ġ-> ĠBinary Unit . Ki lob yte ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" m " Ġ-> ĠBinary Unit . Me g abyte ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" g " Ġ-> ĠBinary Unit . G ig abyte ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthrow ĠIllegalArgumentException (" Should Ġnever Ġhappen : Ġun re cogn ised Ġunits Ġin Ġ${ Binary Size :: class . simple Name }") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġof ( count , Ġunit ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġserialize ( encoder : ĠEncoder , Ġvalue : ĠBinary Size ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġencoder . encode Long ( value . bytes ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ enum Ġclass ĠBinary Unit ( val Ġbytes : ĠLong ) Ġ{ ĊĠĠĠ ĠByte ( 1 ), ĊĠĠĠ ĠKi lob yte ( 1 0 2 4 ), ĊĠĠĠ ĠMe g abyte ( 1 0 2 4 Ġ* ĠKi lob yte . bytes ), ĊĠĠĠ ĠG ig abyte ( 1 0 2 4 Ġ* ĠMe g abyte . bytes ) Ċ } Ċ