/* Ċ Ġ* ĠCopyright Ġ 2 0 1 7 - 2 0 2 0 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġkotlinx . serialization . internal Ċ Ċ import Ġkotlinx . serialization .* Ċ import Ġkotlinx . serialization . descriptors .* Ċ import Ġkotlinx . serialization . encoding .* Ċ Ċ /* Ċ Ġ* ĠDescriptor Ġused Ġfor Ġexplicitly Ġserial izable Ġenums Ġby Ġthe Ġplugin . Ċ Ġ* ĠDesign ed Ġto Ġbe Ġconsistent Ġwith Ġ` Enum Serializer . descriptor ` Ġand Ġweird Ġplugin Ġusage . Ċ Ġ*/ Ċ @ Suppress (" unused ") Ġ// ĠUsed Ġby Ġthe Ġplugin Ċ @ Published Api Ċ @ Opt In ( Experimental Serialization Api :: class ) Ċ internal Ġclass ĠEnum Descriptor ( ĊĠĠĠ Ġname : ĠString , ĊĠĠĠ Ġelements Count : ĠInt Ċ ) Ġ: ĠPlugin Generated Serial Descriptor ( name , Ġelements Count Ġ= Ġelements Count ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġkind : ĠSerial Kind Ġ= ĠSerial Kind . ENUM ĊĠĠĠ Ġprivate Ġval Ġelement Descriptors Ġby Ġlazy Ġ{ ĊĠĠĠĠĠĠĠ ĠArray ( elements Count ) Ġ{ Ġbuild Serial Descriptor ( name Ġ+ Ġ"." Ġ+ Ġget ElementName ( it ), ĠStructure Kind . OBJECT ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget Element Descriptor ( index : ĠInt ): ĠSerial Descriptor Ġ= Ġelement Descriptors . get Checked ( index ) ĊĊĠĠĠ Ġoverride Ġfun Ġequals ( other : ĠAny ?): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( this Ġ=== Ġother ) Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ== Ġnull ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( other Ġ! is ĠSerial Descriptor ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( other . kind Ġ!== ĠSerial Kind . ENUM ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( serial Name Ġ!= Ġother . serial Name ) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġif Ġ( cached Serial Names () Ġ!= Ġother . cached Serial Names ()) Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġelement Names . join ToString (", Ġ", Ġ"$ serial Name (", Ġ") ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠhashCode (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġresult Ġ= Ġserial Name . hashCode () ĊĠĠĠĠĠĠĠ Ġval Ġelements HashCode Ġ= Ġelement Names . elements HashCode By Ġ{ Ġit Ġ} ĊĠĠĠĠĠĠĠ Ġresult Ġ= Ġ 3 1 Ġ* Ġresult Ġ+ Ġelements HashCode ĊĠĠĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} Ċ } Ċ Ċ // ĠUsed Ġfor Ġenums Ġthat Ġare Ġnot Ġexplicitly Ġserial izable Ġby Ġthe Ġplugin Ċ @ Published Api Ċ @ Opt In ( Experimental Serialization Api :: class ) Ċ internal Ġclass ĠEnum Serializer < T Ġ: ĠEnum < T >>( ĊĠĠĠ Ġserial Name : ĠString , ĊĠĠĠ Ġprivate Ġval Ġvalues : ĠArray < T > Ċ ) Ġ: ĠK Serializer < T > Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġdescriptor : ĠSerial Descriptor Ġ= Ġbuild Serial Descriptor ( serial Name , ĠSerial Kind . ENUM ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalues . forEach Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġf qn Ġ= Ġ"$ serial Name .${ it . name }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġenum Member Descriptor Ġ= Ġbuild Serial Descriptor ( fq n , ĠStructure Kind . OBJECT ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelement ( it . name , Ġenum Member Descriptor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġserialize ( encoder : ĠEncoder , Ġvalue : ĠT ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġvalues . indexOf ( value ) ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== Ġ- 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSerialization Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ value Ġis Ġnot Ġa Ġvalid Ġenum Ġ${ descriptor . serial Name }, Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" must Ġbe Ġone Ġof Ġ${ values . content ToString () }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġencoder . encode Enum ( descriptor , Ġindex ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdeserialize ( decoder : ĠDecoder ): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġdecoder . decode Enum ( descriptor ) ĊĠĠĠĠĠĠĠ Ġif Ġ( index Ġ! in Ġvalues . indices ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSerialization Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"$ index Ġis Ġnot Ġamong Ġvalid Ġ${ descriptor . serial Name } Ġenum Ġvalues , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" values Ġsize Ġis Ġ${ values . size }" ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġvalues [ index ] ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString (): ĠString Ġ= Ġ" kotlin x . serialization . internal . Enum Serializer < ${ descriptor . serial Name }> " Ċ } Ċ