|
| 1 | +package com.fasterxml.jackson.module.kotlin |
| 2 | + |
| 3 | +import java.util.AbstractMap.SimpleEntry as Entry |
| 4 | +import kotlin.reflect.KParameter |
| 5 | + |
| 6 | +internal class ArgumentBucket(private val parameters: List<KParameter>) : Map<KParameter, Any?> { |
| 7 | + // This array is sorted by KParameter::index. |
| 8 | + val valueArray: Array<Any?> = arrayOfNulls(parameters.size) |
| 9 | + private val initializationStatuses: BooleanArray = BooleanArray(parameters.size) |
| 10 | + private var count = 0 |
| 11 | + |
| 12 | + operator fun set(key: KParameter, value: Any?): Any? { |
| 13 | + return valueArray[key.index].apply { |
| 14 | + valueArray[key.index] = value |
| 15 | + |
| 16 | + if (!initializationStatuses[key.index]) { |
| 17 | + initializationStatuses[key.index] = true |
| 18 | + count++ |
| 19 | + } |
| 20 | + } |
| 21 | + } |
| 22 | + |
| 23 | + fun isFullInitialized(): Boolean = parameters.size == count |
| 24 | + |
| 25 | + override val entries: Set<Map.Entry<KParameter, Any?>> |
| 26 | + get() = valueArray.withIndex() |
| 27 | + .filter { (i, _) -> initializationStatuses[i] } |
| 28 | + .map { (i, arg) -> Entry(parameters[i], arg) } |
| 29 | + .toSet() |
| 30 | + override val keys: Set<KParameter> |
| 31 | + get() = parameters |
| 32 | + .filterIndexed { i, _ -> initializationStatuses[i] } |
| 33 | + .toSet() |
| 34 | + override val size: Int |
| 35 | + get() = count |
| 36 | + override val values: Collection<Any?> |
| 37 | + get() = valueArray.filterIndexed { i, _ -> initializationStatuses[i] } |
| 38 | + |
| 39 | + override fun containsKey(key: KParameter): Boolean = initializationStatuses[key.index] |
| 40 | + |
| 41 | + override fun containsValue(value: Any?): Boolean = valueArray.withIndex() |
| 42 | + .any { (i, arg) -> initializationStatuses[i] && value == arg } |
| 43 | + |
| 44 | + override fun get(key: KParameter): Any? = valueArray[key.index] |
| 45 | + |
| 46 | + override fun isEmpty(): Boolean = count == 0 |
| 47 | +} |
0 commit comments