Skip to content

Commit 9c6ad21

Browse files
committed
Add implementation for computing the required bytes to encode a message
This commit introduces a new API which computes the required bytes to encode a message without actually serializing a message. By extension, this API is meant to be used as a cornerstone for implementing #2075. Signed-off-by: George Papadopoulos <[email protected]>
1 parent 694e2f7 commit 9c6ad21

File tree

8 files changed

+1200
-0
lines changed

8 files changed

+1200
-0
lines changed

formats/protobuf/api/kotlinx-serialization-protobuf.api

+4
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,10 @@ public final class kotlinx/serialization/protobuf/ProtoBufKt {
2121
public static synthetic fun ProtoBuf$default (Lkotlinx/serialization/protobuf/ProtoBuf;Lkotlin/jvm/functions/Function1;ILjava/lang/Object;)Lkotlinx/serialization/protobuf/ProtoBuf;
2222
}
2323

24+
public final class kotlinx/serialization/protobuf/ProtoBufSerializedSizeCalculatorKt {
25+
public static final fun getOrComputeSerializedSize (Lkotlinx/serialization/protobuf/ProtoBuf;Lkotlinx/serialization/SerializationStrategy;Ljava/lang/Object;)I
26+
}
27+
2428
public final class kotlinx/serialization/protobuf/ProtoIntegerType : java/lang/Enum {
2529
public static final field DEFAULT Lkotlinx/serialization/protobuf/ProtoIntegerType;
2630
public static final field FIXED Lkotlinx/serialization/protobuf/ProtoIntegerType;

formats/protobuf/commonMain/src/kotlinx/serialization/protobuf/ProtoBufSerializedSize.kt

+643
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package kotlinx.serialization.protobuf
2+
3+
import kotlinx.serialization.descriptors.SerialDescriptor
4+
5+
internal actual fun createSerializedSizeCache(): SerializedSizeCache = JsHashMap()
6+
7+
private class JsHashMap : SerializedSizeCache {
8+
private val cache = mutableMapOf<SerialDescriptor, SerializedData>()
9+
10+
override fun get(descriptor: SerialDescriptor, key: SerializedSizeCacheKey): Int? = cache[descriptor]?.get(key)
11+
12+
override fun set(descriptor: SerialDescriptor, key: SerializedSizeCacheKey, serializedSize: Int) {
13+
cache[descriptor] = mapOf(key to serializedSize)
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package kotlinx.serialization.protobuf
2+
3+
import kotlinx.serialization.descriptors.SerialDescriptor
4+
import java.util.concurrent.ConcurrentHashMap
5+
6+
internal actual fun createSerializedSizeCache(): SerializedSizeCache {
7+
return ConcurrentHashMapSerializedCache()
8+
}
9+
10+
private class ConcurrentHashMapSerializedCache : SerializedSizeCache {
11+
private val cache = ConcurrentHashMap<SerialDescriptor, SerializedData>()
12+
13+
override fun get(descriptor: SerialDescriptor, key: SerializedSizeCacheKey): Int? = cache[descriptor]?.get(key)
14+
15+
override fun set(descriptor: SerialDescriptor, key: SerializedSizeCacheKey, serializedSize: Int) {
16+
cache[descriptor] = mapOf(key to serializedSize)
17+
}
18+
}

0 commit comments

Comments
 (0)