Skip to content

Commit 34703df

Browse files
committed
Add argument bucket
1 parent ace1ae8 commit 34703df

File tree

1 file changed

+47
-0
lines changed

1 file changed

+47
-0
lines changed
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
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

Comments
 (0)