1 /* 2 * Copyright 2017-2020 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license. 3 */ 4 @file:OptIn(ExperimentalSerializationApi::class) 5 6 package kotlinx.serialization.protobuf.internal 7 8 import kotlinx.serialization.* 9 import kotlinx.serialization.descriptors.* 10 import kotlinx.serialization.encoding.* 11 12 internal abstract class ProtobufTaggedDecoder : ProtobufTaggedBase(), Decoder, CompositeDecoder { SerialDescriptornull13 protected abstract fun SerialDescriptor.getTag(index: Int): ProtoDesc 14 15 protected abstract fun decodeTaggedBoolean(tag: ProtoDesc): Boolean 16 protected abstract fun decodeTaggedByte(tag: ProtoDesc): Byte 17 protected abstract fun decodeTaggedShort(tag: ProtoDesc): Short 18 protected abstract fun decodeTaggedInt(tag: ProtoDesc): Int 19 protected abstract fun decodeTaggedLong(tag: ProtoDesc): Long 20 protected abstract fun decodeTaggedFloat(tag: ProtoDesc): Float 21 protected abstract fun decodeTaggedDouble(tag: ProtoDesc): Double 22 protected abstract fun decodeTaggedChar(tag: ProtoDesc): Char 23 protected abstract fun decodeTaggedString(tag: ProtoDesc): String 24 protected abstract fun decodeTaggedEnum(tag: ProtoDesc, enumDescription: SerialDescriptor): Int 25 protected abstract fun <T : Any?> decodeSerializableValue(deserializer: DeserializationStrategy<T>, previousValue: T?): T 26 27 protected open fun decodeTaggedInline(tag: ProtoDesc, inlineDescriptor: SerialDescriptor): Decoder = this.apply { pushTag(tag) } 28 decodeNotNullMarknull29 override fun decodeNotNullMark(): Boolean = true 30 final override fun decodeNull(): Nothing? = null 31 final override fun decodeBoolean(): Boolean = decodeTaggedBoolean(popTagOrDefault()) 32 final override fun decodeByte(): Byte = decodeTaggedByte(popTagOrDefault()) 33 final override fun decodeShort(): Short = decodeTaggedShort(popTagOrDefault()) 34 final override fun decodeInt(): Int = decodeTaggedInt(popTagOrDefault()) 35 final override fun decodeLong(): Long = decodeTaggedLong(popTagOrDefault()) 36 final override fun decodeFloat(): Float = decodeTaggedFloat(popTagOrDefault()) 37 final override fun decodeDouble(): Double = decodeTaggedDouble(popTagOrDefault()) 38 final override fun decodeChar(): Char = decodeTaggedChar(popTagOrDefault()) 39 final override fun decodeString(): String = decodeTaggedString(popTagOrDefault()) 40 final override fun decodeEnum(enumDescriptor: SerialDescriptor): Int = decodeTaggedEnum(popTagOrDefault(), enumDescriptor) 41 42 override fun beginStructure(descriptor: SerialDescriptor): CompositeDecoder { 43 return this 44 } 45 endStructurenull46 override fun endStructure(descriptor: SerialDescriptor) { 47 // Nothing 48 } 49 decodeBooleanElementnull50 final override fun decodeBooleanElement(descriptor: SerialDescriptor, index: Int): Boolean = 51 decodeTaggedBoolean(descriptor.getTag(index)) 52 53 final override fun decodeByteElement(descriptor: SerialDescriptor, index: Int): Byte = 54 decodeTaggedByte(descriptor.getTag(index)) 55 56 final override fun decodeShortElement(descriptor: SerialDescriptor, index: Int): Short = 57 decodeTaggedShort(descriptor.getTag(index)) 58 59 final override fun decodeIntElement(descriptor: SerialDescriptor, index: Int): Int = 60 decodeTaggedInt(descriptor.getTag(index)) 61 62 final override fun decodeLongElement(descriptor: SerialDescriptor, index: Int): Long = 63 decodeTaggedLong(descriptor.getTag(index)) 64 65 final override fun decodeFloatElement(descriptor: SerialDescriptor, index: Int): Float = 66 decodeTaggedFloat(descriptor.getTag(index)) 67 68 final override fun decodeDoubleElement(descriptor: SerialDescriptor, index: Int): Double = 69 decodeTaggedDouble(descriptor.getTag(index)) 70 71 final override fun decodeCharElement(descriptor: SerialDescriptor, index: Int): Char = 72 decodeTaggedChar(descriptor.getTag(index)) 73 74 final override fun decodeStringElement(descriptor: SerialDescriptor, index: Int): String = 75 decodeTaggedString(descriptor.getTag(index)) 76 77 final override fun <T : Any?> decodeSerializableElement( 78 descriptor: SerialDescriptor, 79 index: Int, 80 deserializer: DeserializationStrategy<T>, 81 previousValue: T? 82 ): T = tagBlock(descriptor.getTag(index)) { decodeSerializableValue(deserializer, previousValue) } 83 decodeNullableSerializableElementnull84 final override fun <T : Any> decodeNullableSerializableElement( 85 descriptor: SerialDescriptor, 86 index: Int, 87 deserializer: DeserializationStrategy<T?>, 88 previousValue: T? 89 ): T? = tagBlock(descriptor.getTag(index)) { 90 if (decodeNotNullMark()) { 91 decodeSerializableValue(deserializer, previousValue) 92 } else { 93 decodeNull() 94 } 95 } 96 decodeInlinenull97 override fun decodeInline(descriptor: SerialDescriptor): Decoder { 98 return decodeTaggedInline(popTag(), descriptor) 99 } 100 decodeInlineElementnull101 override fun decodeInlineElement( 102 descriptor: SerialDescriptor, 103 index: Int 104 ): Decoder { 105 return decodeTaggedInline(descriptor.getTag(index), descriptor.getElementDescriptor(index)) 106 } 107 } 108