package Ġcom . github . j ershell . kb son Ċ Ċ import Ġkotlinx . serialization . Deserialization Strategy Ċ import Ġkotlinx . serialization . Internal Serialization Api Ċ import Ġkotlinx . serialization . Serialization Exception Ċ import Ġkotlinx . serialization . descriptors . Pol ymorphic Kind Ċ import Ġkotlinx . serialization . descriptors . Serial Descriptor Ċ import Ġkotlinx . serialization . descriptors . Structure Kind Ċ import Ġkotlinx . serialization . encoding . Abstract Decoder Ċ import Ġkotlinx . serialization . encoding . Composite Decoder Ċ import Ġkotlinx . serialization . encoding . Composite Decoder . Companion . UNKNOWN _ NAME Ċ import Ġkotlinx . serialization . modules . Serial izers Module Ċ import Ġorg . bson . Abstract B son Reader Ċ import Ġorg . bson . Abstract B son Reader . State Ċ import Ġorg . bson . B son Type Ċ import Ġorg . bson . types . ObjectId Ċ Ċ abstract Ġclass ĠFlex ible Decoder ( ĊĠĠĠ Ġval Ġreader : ĠAbstract B son Reader , ĊĠĠĠ Ġoverride Ġval Ġserializers Module : ĠSerial izers Module , ĊĠĠĠ Ġval Ġconfiguration : ĠConfiguration Ċ ) Ġ: ĠAbstract Decoder () Ġ{ ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* Ġ_ id Ġfield Ġcomes Ġalways Ġfirst Ġin ĠMongo Db . ĊĠĠĠĠ Ġ* ĠSometimes Ġyou Ġmay Ġneed Ġto Ġcheck Ġif Ġthis Ġid Ġis Ġnot Ġalready Ġread Ġby Ġthe Ġ[ reader ] ĊĠĠĠĠ Ġ* Ġ- Ġand Ġthen Ġyou Ġmay Ġneed Ġto Ġset Ġthe Ġ[ already Read Id ] Ġto Ġnull Ġin Ġorder Ġto Ġspecify Ġthat Ġis Ġhas Ġbeen Ġtaken Ġinto Ġaccount . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġvar Ġalready Read Id : ĠAny ? ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġset (_) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// do Ġnothing ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġbegin Structure ( descriptor : ĠSerial Descriptor ): ĠComposite Decoder Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( descriptor . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStructure Kind . CLASS Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Ġ= Ġreader . current B son Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( current Ġ== Ġnull Ġ|| Ġcurrent Ġ== ĠB son Type . DOCUMENT ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Start Document () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB son Flex ible Decoder ( reader , Ġserializers Module , Ġconfiguration , Ġalready Read Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStructure Kind . MAP Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Start Document () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMap Decoder ( reader , Ġserializers Module , Ġconfiguration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ ĠStructure Kind . LIST Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Start Array () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠList Decoder ( reader , Ġserializers Module , Ġconfiguration ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPol ymorphic Kind Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Start Document () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPol ym orphism Decoder ( reader , Ġserializers Module , Ġconfiguration , Ġalready Read Id ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġthis ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġend Structure ( descriptor : ĠSerial Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( descriptor . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStructure Kind . LIST Ġ-> Ġreader . read End Array () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠStructure Kind . MAP , ĠStructure Kind . CLASS , ĠStructure Kind . OBJECT Ġ-> Ġreader . read End Document () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode NotNull Mark (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreader . current B son Type Ġ!= ĠB son Type . NULL ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Boolean (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreader . read Boolean () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Enum ( enum Descriptor : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġreader . readString () ĊĠĠĠĠĠĠĠ Ġval Ġvalue Ġ= Ġenum Descriptor . getElement Index ( name ) ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( value Ġ== ĠUNKNOWN _ NAME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠSerialization Exception (" Enum Ġhas Ġunknown Ġvalue Ġ$ name ") ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalue ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Byte (): ĠByte Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreader . readInt 3 2 (). to Byte () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Null (): ĠNothing ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreader . read Null () ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Char (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreader . read Symbol (). first () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Double (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreader . read Double () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Int (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreader . readInt 3 2 () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Short (): ĠShort Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreader . readInt 3 2 (). to Short () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Long (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreader . readInt 6 4 () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Float (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreader . read Double (). toFloat () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode String (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġreader . readString () ĊĠĠĠ Ġ} Ċ } Ċ Ċ class ĠB son Flex ible Decoder ( ĊĠĠĠ Ġreader : ĠAbstract B son Reader , ĊĠĠĠ Ġcontext : ĠSerial izers Module , ĊĠĠĠ Ġconfiguration : ĠConfiguration , ĊĠĠĠ Ġoverride Ġvar Ġalready Read Id : ĠAny ? Ġ= Ġnull Ċ ) Ġ: ĠFlex ible Decoder ( reader , Ġcontext , Ġconfiguration ) Ġ{ ĊĊĠĠĠ Ġ// to Ġhandle Ġnot Ġoptional Ġnullable Ġproperties ĊĠĠĠ Ġprivate Ġvar Ġindexes Set : ĠBoolean Array ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcontains Not Optional Nullable : ĠBoolean ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġvar Ġcheck Not Optional Nullable Ġ= Ġfalse ĊĊĠĠĠ Ġprivate Ġfun Ġinit Not Optional Properties ( desc : ĠSerial Descriptor ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( contains Not Optional Nullable Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġdesc . elements Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! desc . is Element Optional ( i )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnullable Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc . getElement Descriptor ( i ). is Nullable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( nullable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontains Not Optional Nullable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contains Not Optional Nullable Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontains Not Optional Nullable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes Set Ġ= ĠBoolean Array ( desc . elements Count ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Not Optional Properties ( desc : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġ// set Ġto Ġnull Ġnot Ġoptional Ġnullable Ġproperties Ġif Ġany ĊĠĠĠĠĠĠĠ Ġif Ġ( contains Not Optional Nullable !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġdesc . elements Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( indexes Set ?. get ( i ) Ġ!= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġ! desc . is Element Optional ( i ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ&& Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdesc . getElement Descriptor ( i ). is Nullable ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Not Optional Nullable Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes Set ! ![ i ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġi ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠComposite Decoder . DECODE _ DONE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Element Index ( descriptor : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġinit Not Optional Properties ( descriptor ) ĊĠĠĠĠĠĠĠ Ġif Ġ( already Read Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Index Ġ= Ġdescriptor . getElement Index ("_ id ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Index Ġ!= ĠUNKNOWN _ NAME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġid Index ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalready Read Id Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( reader . state Ġ== ĠState . TYPE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read B son Type () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( reader . state ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠState . NAME Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcurrent Name Ġ= Ġreader . read Name () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġindex Ġ= Ġdescriptor . getElement Index ( current Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( index Ġ== ĠUNKNOWN _ NAME ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . skip Value () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Element Index ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( contains Not Optional Nullable !! ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindexes Set ! ![ index ] Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġindex ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Not Optional Properties ( descriptor ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode NotNull Mark (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġ! check Not Optional Nullable Ġ&& Ġreader . current B son Type Ġ!= ĠB son Type . NULL ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Null (): ĠNothing ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! check Not Optional Nullable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Null () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode String (): ĠString Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( already Read Id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġalready Read Id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġalready Read Id Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġas ? ĠString Ġ?: Ġ( result Ġas ĠObjectId ). toString () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . decode String () ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠPol ym orphism Decoder ( ĊĠĠĠ Ġreader : ĠAbstract B son Reader , ĊĠĠĠ Ġval Ġcontext : ĠSerial izers Module , ĊĠĠĠ Ġconfiguration : ĠConfiguration , ĊĠĠĠ Ġoverride Ġvar Ġalready Read Id : ĠAny ? Ġ= Ġnull Ċ ) Ġ: ĠFlex ible Decoder ( reader , Ġcontext , Ġconfiguration ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġdecode Count Ġ= Ġ 0 ĊĊĠĠĠ Ġ@ Internal Serialization Api ĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġdecode Serializable Value ( de serializer : ĠDeserial ization Strategy < T >): ĠT Ġ= ĊĠĠĠĠĠĠĠ Ġde serializer . deserialize ( B son Flex ible Decoder ( reader , Ġcontext , Ġconfiguration , Ġalready Read Id )) ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Element Index ( descriptor : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( decode Count ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠ 0 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( reader . state Ġ== ĠState . TYPE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read B son Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠfieldName Ġ= Ġreader . read Name () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( fieldName Ġ== Ġ"_ id ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġalready Read Id Ġ= Ġwhen Ġ( reader . current B son Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB son Type . OBJECT _ ID Ġ-> Ġreader . read ObjectId () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠB son Type . STRING Ġ-> Ġreader . readString () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" only ĠObjectId Ġor Ġstring Ġare Ġsupported Ġas Ġ_ id Ġfor Ġpol ym orphism Ġdecoder Ġ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠ 1 Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdecode Count ++ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠComposite Decoder . DECODE _ DONE ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠMap Decoder ( ĊĠĠĠ Ġreader : ĠAbstract B son Reader , ĊĠĠĠ Ġcontext : ĠSerial izers Module , ĊĠĠĠ Ġconfiguration : ĠConfiguration Ċ ) Ġ: ĠFlex ible Decoder ( reader , Ġcontext , Ġconfiguration ) Ġ{ ĊĊĠĠĠ Ġprivate Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠ Ġprivate Ġvar Ġkey : ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Boolean (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Name () !!. to Boolean () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . decode Boolean () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Enum ( enum Descriptor : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġenum Descriptor . getElement Index ( reader . read Name () !! ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . decode Enum ( enum Descriptor ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Byte (): ĠByte Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Name () !!. to Byte () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . decode Byte () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Char (): ĠChar Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Name () !!. first () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . decode Char () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Double (): ĠDouble Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Name () !!. toDouble () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . decode Double () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Int (): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Name () !!. toInt () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . decode Int () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Short (): ĠShort Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Name () !!. to Short () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . decode Short () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Long (): ĠLong Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Name () !!. to Long () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . decode Long () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Float (): ĠFloat Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Name () !!. toFloat () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . decode Float () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode String (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreader . read Name () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . decode String () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġdecode Element Index ( descriptor : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! key ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnext Type Ġ= Ġreader . read B son Type () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( next Type Ġ== ĠB son Type . END _ OF _ DOCUMENT ) Ġreturn ĠComposite Decoder . DECODE _ DONE ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkey Ġ= Ġfalse ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġindex ++ ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġclass ĠList Decoder ( ĊĠĠĠ Ġreader : ĠAbstract B son Reader , ĊĠĠĠ Ġcontext : ĠSerial izers Module , ĊĠĠĠ Ġconfiguration : ĠConfiguration Ċ ) Ġ: ĠFlex ible Decoder ( reader , Ġcontext , Ġconfiguration ) Ġ{ ĊĠĠĠ Ġprivate Ġvar Ġindex Ġ= Ġ 0 ĊĠĠĠ Ġoverride Ġfun Ġdecode Element Index ( descriptor : ĠSerial Descriptor ): ĠInt Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġnext Type Ġ= Ġreader . read B son Type () ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( next Type Ġ== ĠB son Type . END _ OF _ DOCUMENT ) ĠComposite Decoder . DECODE _ DONE Ġelse Ġindex ++ ĊĠĠĠ Ġ} Ċ }