summaryrefslogtreecommitdiff
path: root/formats/json/commonMain/src/kotlinx/serialization/json/internal/JsonElementMarker.kt
blob: 85a4624b52b8624948f4fabebc4308272edb4baf (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
/*
 * Copyright 2017-2021 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license.
 */


package kotlinx.serialization.json.internal

import kotlinx.serialization.ExperimentalSerializationApi
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.internal.ElementMarker

@OptIn(ExperimentalSerializationApi::class)
internal class JsonElementMarker(descriptor: SerialDescriptor) {
    private val origin: ElementMarker = ElementMarker(descriptor, ::readIfAbsent)

    internal var isUnmarkedNull: Boolean = false
        private set

    internal fun mark(index: Int) {
        origin.mark(index)
    }

    internal fun nextUnmarkedIndex(): Int {
        return origin.nextUnmarkedIndex()
    }

    private fun readIfAbsent(descriptor: SerialDescriptor, index: Int): Boolean {
        isUnmarkedNull = !descriptor.isElementOptional(index) && descriptor.getElementDescriptor(index).isNullable
        return isUnmarkedNull
    }
}