Skip to content
This repository was archived by the owner on Jan 20, 2023. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions build.gradle.kts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
plugins {
id("maven")
id("java")
id("org.jetbrains.kotlin.jvm") version "1.3.70"
id("org.jetbrains.kotlin.jvm") version "1.3.71"
id("org.jlleitschuh.gradle.ktlint") version "9.2.1"
}

group = "com.mapk"
version = "0.9"
version = "0.10"

java {
sourceCompatibility = JavaVersion.VERSION_1_8
Expand All @@ -18,7 +18,7 @@ buildscript {
}

dependencies {
classpath(kotlin("gradle-plugin", version = "1.3.70"))
classpath(kotlin("gradle-plugin", version = "1.3.71"))
}
}

Expand All @@ -33,7 +33,7 @@ dependencies {
implementation(group = "org.jetbrains", name = "annotations", version = "19.0.0")

// https://mvnrepository.com/artifact/org.junit.jupiter/junit-jupiter
testImplementation(group = "org.junit.jupiter", name = "junit-jupiter", version = "5.6.0") {
testImplementation(group = "org.junit.jupiter", name = "junit-jupiter", version = "5.6.1") {
exclude(group = "org.junit.vintage", module = "junit-vintage-engine")
}
// https://mvnrepository.com/artifact/io.mockk/mockk
Expand Down
19 changes: 10 additions & 9 deletions src/main/kotlin/com/mapk/core/ArgumentBucket.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import java.util.Objects
import kotlin.reflect.KParameter

class ArgumentBucket internal constructor(
private val keyArray: Array<KParameter?>,
private val keyList: List<KParameter>,
internal val valueArray: Array<Any?>,
private val isRequireNonNull: List<Boolean>,
private val initializationStatusManager: InitializationStatusManager
Expand All @@ -22,8 +22,7 @@ class ArgumentBucket internal constructor(
override val size: Int get() = count

override fun containsKey(key: KParameter): Boolean {
// NOTE: もしかしたらステータスを見た方が速いかも
return keyArray[key.index] != null
return initializationStatusManager.isInitialized(key.index)
}

override fun containsValue(value: Any?): Boolean = valueArray.any { Objects.equals(value, it) }
Expand All @@ -36,11 +35,14 @@ class ArgumentBucket internal constructor(
override fun isEmpty(): Boolean = count == 0

override val entries: Set<Map.Entry<KParameter, Any?>>
get() = keyArray.mapNotNull { it?.let { Entry(it, valueArray[it.index]) } }.toSet()
override val keys: MutableSet<KParameter>
get() = keyArray.filterNotNull().toMutableSet()
override val values: MutableCollection<Any?>
get() = valueArray.filterIndexed { i, _ -> initializationStatusManager.isInitialized(i) }.toMutableList()
get() = keyList
.filter { initializationStatusManager.isInitialized(it.index) }
.map { Entry(it, valueArray[it.index]) }
.toSet()
override val keys: Set<KParameter>
get() = keyList.filter { initializationStatusManager.isInitialized(it.index) }.toSet()
override val values: Collection<Any?>
get() = valueArray.filterIndexed { i, _ -> initializationStatusManager.isInitialized(i) }

fun putIfAbsent(key: KParameter, value: Any?) {
val index = key.index
Expand All @@ -53,7 +55,6 @@ class ArgumentBucket internal constructor(

count += 1
initializationStatusManager.put(index)
keyArray[index] = key
valueArray[index] = value

return
Expand Down
11 changes: 4 additions & 7 deletions src/main/kotlin/com/mapk/core/BucketGenerator.kt
Original file line number Diff line number Diff line change
Expand Up @@ -3,10 +3,9 @@ package com.mapk.core
import com.mapk.annotations.KParameterRequireNonNull
import kotlin.reflect.KParameter

internal class BucketGenerator(parameters: List<KParameter>, instancePair: Pair<KParameter, Any>?) {
internal class BucketGenerator(private val parameters: List<KParameter>, instance: Any?) {
private val initializationStatus: Array<Boolean>
private val isRequireNonNull: List<Boolean>
private val keyArray: Array<KParameter?>
private val valueArray: Array<Any?>

init {
Expand All @@ -16,12 +15,10 @@ internal class BucketGenerator(parameters: List<KParameter>, instancePair: Pair<
}
initializationStatus = Array(capacity) { false }

keyArray = arrayOfNulls(capacity)
valueArray = arrayOfNulls(capacity)

if (instancePair != null) {
keyArray[0] = instancePair.first
valueArray[0] = instancePair.second
if (instance != null) {
valueArray[0] = instance
initializationStatus[0] = true
} else {
initializationStatus[0] = false
Expand All @@ -30,7 +27,7 @@ internal class BucketGenerator(parameters: List<KParameter>, instancePair: Pair<

fun generate(): ArgumentBucket {
return ArgumentBucket(
keyArray.clone(),
parameters,
valueArray.clone(),
isRequireNonNull,
InitializationStatusManager(initializationStatus.clone())
Expand Down
5 changes: 2 additions & 3 deletions src/main/kotlin/com/mapk/core/KFunctionForCall.kt
Original file line number Diff line number Diff line change
Expand Up @@ -20,9 +20,8 @@ class KFunctionForCall<T>(internal val function: KFunction<T>, instance: Any? =
// この関数には確実にアクセスするためアクセシビリティ書き換え
function.isAccessible = true

generator = BucketGenerator(
parameters, instance?.let { parameters.first { param -> param.kind == KParameter.Kind.INSTANCE } to it }
)
// パラメータのチェックを済ませてから初期化しないとエラーになる
generator = BucketGenerator(parameters, instance)
}

fun getArgumentBucket(): ArgumentBucket = generator.generate()
Expand Down