Coverage Summary for Class: IntArraySerializer (com.ghost.serialization.serializers)
| Class |
Class, %
|
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| IntArraySerializer |
100%
(1/1)
|
83.3%
(5/6)
|
55.6%
(10/18)
|
65.8%
(25/38)
|
62%
(85/137)
|
@file:OptIn(InternalGhostApi::class)
package com.ghost.serialization.serializers
import com.ghost.serialization.InternalGhostApi
import com.ghost.serialization.contract.GhostSerializer
import com.ghost.serialization.parser.GhostJsonConstants.CLOSE_ARR
import com.ghost.serialization.parser.GhostJsonConstants.CLOSE_OBJ
import com.ghost.serialization.parser.GhostJsonReader
import com.ghost.serialization.parser.GhostJsonFlatReader
import com.ghost.serialization.parser.GhostJsonStringReader
import com.ghost.serialization.parser.beginArray
import com.ghost.serialization.parser.beginObject
import com.ghost.serialization.parser.consumeArraySeparator
import com.ghost.serialization.parser.consumeKeySeparator
import com.ghost.serialization.parser.decodeResilient
import com.ghost.serialization.parser.endArray
import com.ghost.serialization.parser.endObject
import com.ghost.serialization.parser.hasNext
import com.ghost.serialization.parser.nextInt
import com.ghost.serialization.parser.nextKey
import com.ghost.serialization.parser.nextLong
import com.ghost.serialization.parser.readList
import com.ghost.serialization.parser.readSet
import com.ghost.serialization.writer.GhostJsonFlatWriter
import com.ghost.serialization.writer.GhostJsonStringWriter
import com.ghost.serialization.writer.GhostJsonWriter
import kotlin.collections.RandomAccess
/**
* Serializer implementation for standard Kotlin [List] collections.
*/
@OptIn(InternalGhostApi::class)
class ListSerializer<T>(
private val itemSerializer: GhostSerializer<T>
) : GhostSerializer<List<T>> {
override val typeName: String
get() = "List<${itemSerializer.typeName}>"
override fun serialize(
writer: GhostJsonWriter,
value: List<T>
) {
writer.beginArray()
val size = value.size
if (size == 0) {
writer.endArray()
return
}
if (value is RandomAccess) {
for (i in 0 until size) {
itemSerializer.serialize(writer, value[i])
}
} else {
for (item in value) {
itemSerializer.serialize(writer, item)
}
}
writer.endArray()
}
override fun serialize(
writer: GhostJsonFlatWriter,
value: List<T>
) {
writer.beginArray()
val size = value.size
if (size == 0) {
writer.endArray()
return
}
if (value is RandomAccess) {
for (i in 0 until size) {
itemSerializer.serialize(writer, value[i])
}
} else {
for (item in value) {
itemSerializer.serialize(writer, item)
}
}
writer.endArray()
}
override fun serialize(
writer: GhostJsonStringWriter,
value: List<T>
) {
writer.beginArray()
val size = value.size
if (size == 0) {
writer.endArray()
return
}
if (value is RandomAccess) {
for (i in 0 until size) {
itemSerializer.serialize(writer, value[i])
}
} else {
for (item in value) {
itemSerializer.serialize(writer, item)
}
}
writer.endArray()
}
override fun deserialize(
reader: GhostJsonReader
): List<T> {
return if (itemSerializer.isResilient) {
reader.readList {
reader.decodeResilient {
itemSerializer.deserialize(reader)
}
}.filterNotNull()
} else {
reader.readList {
itemSerializer.deserialize(reader)
}
}
}
override fun deserialize(
reader: GhostJsonFlatReader
): List<T> {
return if (itemSerializer.isResilient) {
reader.readList {
reader.decodeResilient {
itemSerializer.deserialize(reader)
}
}.filterNotNull()
} else {
reader.readList {
itemSerializer.deserialize(reader)
}
}
}
override fun deserialize(
reader: GhostJsonStringReader
): List<T> {
return if (itemSerializer.isResilient) {
reader.readList {
reader.decodeResilient {
itemSerializer.deserialize(reader)
}
}.filterNotNull()
} else {
reader.readList {
itemSerializer.deserialize(reader)
}
}
}
}
/**
* Serializer implementation for standard Kotlin [Set] collections.
* Wire format is a JSON array; decode builds [HashSet] directly without a [List] intermediate.
*/
@OptIn(InternalGhostApi::class)
class SetSerializer<T>(
private val itemSerializer: GhostSerializer<T>
) : GhostSerializer<Set<T>> {
override val typeName: String
get() = "Set<${itemSerializer.typeName}>"
override fun serialize(
writer: GhostJsonWriter,
value: Set<T>
) {
writer.beginArray()
if (value.isEmpty()) {
writer.endArray()
return
}
for (item in value) {
itemSerializer.serialize(writer, item)
}
writer.endArray()
}
override fun serialize(
writer: GhostJsonFlatWriter,
value: Set<T>
) {
writer.beginArray()
if (value.isEmpty()) {
writer.endArray()
return
}
for (item in value) {
itemSerializer.serialize(writer, item)
}
writer.endArray()
}
override fun serialize(
writer: GhostJsonStringWriter,
value: Set<T>
) {
writer.beginArray()
if (value.isEmpty()) {
writer.endArray()
return
}
for (item in value) {
itemSerializer.serialize(writer, item)
}
writer.endArray()
}
override fun deserialize(
reader: GhostJsonReader
): Set<T> {
return if (itemSerializer.isResilient) {
reader.readSet {
reader.decodeResilient {
itemSerializer.deserialize(reader)
}
}.filterNotNull().toSet()
} else {
reader.readSet {
itemSerializer.deserialize(reader)
}
}
}
override fun deserialize(
reader: GhostJsonFlatReader
): Set<T> {
return if (itemSerializer.isResilient) {
reader.readSet {
reader.decodeResilient {
itemSerializer.deserialize(reader)
}
}.filterNotNull().toSet()
} else {
reader.readSet {
itemSerializer.deserialize(reader)
}
}
}
override fun deserialize(
reader: GhostJsonStringReader
): Set<T> {
return if (itemSerializer.isResilient) {
reader.readSet {
reader.decodeResilient {
itemSerializer.deserialize(reader)
}
}.filterNotNull().toSet()
} else {
reader.readSet {
itemSerializer.deserialize(reader)
}
}
}
}
/**
* Serializer implementation for standard Kotlin [Map] collections with String keys.
*/
class MapSerializer<V>(
private val valueSerializer: GhostSerializer<V>
) : GhostSerializer<Map<String, V>> {
override val typeName: String get() =
"Map<String, ${valueSerializer.typeName}>"
override fun serialize(
writer: GhostJsonWriter,
value: Map<String, V>
) {
writer.beginObject()
for (entry in value.entries) {
writer.name(entry.key)
valueSerializer.serialize(writer, entry.value)
}
writer.endObject()
}
override fun serialize(
writer: GhostJsonFlatWriter,
value: Map<String, V>
) {
writer.beginObject()
for (entry in value.entries) {
writer.name(entry.key)
valueSerializer.serialize(writer, entry.value)
}
writer.endObject()
}
override fun serialize(
writer: GhostJsonStringWriter,
value: Map<String, V>
) {
writer.beginObject()
for (entry in value.entries) {
writer.name(entry.key)
valueSerializer.serialize(writer, entry.value)
}
writer.endObject()
}
override fun deserialize(
reader: GhostJsonReader
): Map<String, V> {
reader.beginObject()
if (reader.peekByte() == CLOSE_OBJ) {
reader.endObject()
return emptyMap()
}
return buildMap {
while (true) {
val key = reader.nextKey() ?: break
reader.consumeKeySeparator()
put(
key,
valueSerializer.deserialize(reader)
)
}
reader.endObject()
}
}
override fun deserialize(
reader: GhostJsonFlatReader
): Map<String, V> {
reader.beginObject()
if (reader.peekByte() == CLOSE_OBJ) {
reader.endObject()
return emptyMap()
}
return buildMap {
while (true) {
val key = reader.nextKey() ?: break
reader.consumeKeySeparator()
put(
key,
valueSerializer.deserialize(reader)
)
}
reader.endObject()
}
}
override fun deserialize(
reader: GhostJsonStringReader
): Map<String, V> {
reader.beginObject()
if (reader.peekByte() == CLOSE_OBJ) {
reader.endObject()
return emptyMap()
}
return buildMap {
while (true) {
val key = reader.nextKey() ?: break
reader.consumeKeySeparator()
put(
key,
valueSerializer.deserialize(reader)
)
}
reader.endObject()
}
}
}
/**
* Serializer implementation for primitive [IntArray].
*/
object IntArraySerializer : GhostSerializer<IntArray> {
override val typeName: String = "IntArray"
override fun serialize(
writer: GhostJsonWriter,
value: IntArray
) {
writer.beginArray()
val size = value.size
for (i in 0 until size) {
writer.value(value[i])
}
writer.endArray()
}
override fun serialize(
writer: GhostJsonFlatWriter,
value: IntArray
) {
writer.beginArray()
val size = value.size
for (i in 0 until size) {
writer.value(value[i])
}
writer.endArray()
}
override fun serialize(
writer: GhostJsonStringWriter,
value: IntArray
) {
writer.beginArray()
val size = value.size
for (i in 0 until size) {
writer.value(value[i])
}
writer.endArray()
}
override fun deserialize(
reader: GhostJsonReader
): IntArray {
reader.beginArray()
if (reader.peekByte() == CLOSE_ARR) {
reader.endArray()
return IntArray(0)
}
val list = GhostIntList()
while (reader.hasNext()) {
if (!list.isEmpty()) {
reader.consumeArraySeparator()
}
list.add(reader.nextInt())
}
reader.endArray()
return list.toArray()
}
override fun deserialize(
reader: GhostJsonFlatReader
): IntArray {
reader.beginArray()
if (reader.peekByte() == CLOSE_ARR) {
reader.endArray()
return IntArray(0)
}
val list = GhostIntList()
while (reader.hasNext()) {
if (!list.isEmpty()) {
reader.consumeArraySeparator()
}
list.add(reader.nextInt())
}
reader.endArray()
return list.toArray()
}
}
/**
* Serializer implementation for primitive [LongArray].
*/
object LongArraySerializer : GhostSerializer<LongArray> {
override val typeName: String = "LongArray"
override fun serialize(
writer: GhostJsonWriter,
value: LongArray
) {
writer.beginArray()
val size = value.size
for (i in 0 until size) {
writer.value(value[i])
}
writer.endArray()
}
override fun serialize(
writer: GhostJsonFlatWriter,
value: LongArray
) {
writer.beginArray()
val size = value.size
for (i in 0 until size) {
writer.value(value[i])
}
writer.endArray()
}
override fun serialize(
writer: GhostJsonStringWriter,
value: LongArray
) {
writer.beginArray()
val size = value.size
for (i in 0 until size) {
writer.value(value[i])
}
writer.endArray()
}
override fun deserialize(
reader: GhostJsonReader
): LongArray {
reader.beginArray()
if (reader.peekByte() == CLOSE_ARR) {
reader.endArray()
return LongArray(0)
}
val list = GhostLongList()
while (reader.hasNext()) {
if (!list.isEmpty()) {
reader.consumeArraySeparator()
}
list.add(reader.nextLong())
}
reader.endArray()
return list.toArray()
}
override fun deserialize(
reader: GhostJsonFlatReader
): LongArray {
reader.beginArray()
if (reader.peekByte() == CLOSE_ARR) {
reader.endArray()
return LongArray(0)
}
val list = GhostLongList()
while (reader.hasNext()) {
if (!list.isEmpty()) {
reader.consumeArraySeparator()
}
list.add(reader.nextLong())
}
reader.endArray()
return list.toArray()
}
}