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
2 changes: 1 addition & 1 deletion build.gradle.kts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ plugins {
}

group = "com.mapk"
version = "0.14"
version = "0.15"

java {
sourceCompatibility = JavaVersion.VERSION_1_8
Expand Down
7 changes: 4 additions & 3 deletions src/main/kotlin/com/mapk/core/internal/ArgumentBinder.kt
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,9 @@ internal sealed class ArgumentBinder(val annotations: List<Annotation>) {
override val requiredClazz: KClass<T>
) : ArgumentBinder(annotations), ValueParameter<T> {
override fun bindArgument(adaptor: ArgumentAdaptor, valueArray: Array<Any?>): Boolean {
return if (adaptor.isInitialized(name)) {
valueArray[index] = adaptor.readout(name)
val value = adaptor.readout(name)
return if (value != null || adaptor.isInitialized(name)) {
valueArray[index] = value
true
} else {
false
Expand All @@ -43,7 +44,7 @@ internal sealed class ArgumentBinder(val annotations: List<Annotation>) {
override fun bindArgument(adaptor: ArgumentAdaptor, valueArray: Array<Any?>): Boolean {
val temp = function.call(adaptor)

if (!isNullable && temp == null) return false
if (temp == null && !isNullable) return false

valueArray[index] = temp
return true
Expand Down
26 changes: 16 additions & 10 deletions src/main/kotlin/com/mapk/core/internal/ArgumentBucket.kt
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import com.mapk.core.ArgumentAdaptor
import java.util.Objects
import kotlin.reflect.KParameter

// TODO: 初期化の効率化方法の検討他
internal class ArgumentBucket(
private val keyList: List<KParameter>,
val valueArray: Array<Any?>,
Expand All @@ -17,35 +16,42 @@ internal class ArgumentBucket(
override var value: Any?
) : Map.Entry<KParameter, Any?>

private val initializationStatusManager = InitializationStatusManager(initializationStatus)
private val initializationStatuses: List<Boolean>
val isInitialized: Boolean
override val size: Int

init {
var count: Int = if (initializationStatus[0]) 1 else 0

argumentBinders.forEach {
val result = it.bindArgument(adaptor, valueArray)
if (result) initializationStatusManager.put(it.index)
if (result) {
count++
initializationStatus[it.index] = true
}
}

isInitialized = initializationStatusManager.isFullInitialized
size = initializationStatusManager.count
initializationStatuses = initializationStatus.toList()
isInitialized = count == initializationStatus.size
size = count
}

override fun containsKey(key: KParameter): Boolean = initializationStatusManager.isInitialized(key.index)
override fun containsKey(key: KParameter): Boolean = initializationStatuses[key.index]

override fun containsValue(value: Any?): Boolean = valueArray.any { Objects.equals(value, it) }

override fun get(key: KParameter): Any? = valueArray[key.index]

override fun isEmpty(): Boolean = initializationStatusManager.count == 0
override fun isEmpty(): Boolean = size == 0

// NOTE: 本来であれば生成時に確定する内容だが、これらのメソッドは関数呼び出し時にアクセスされることが無いため、カスタムゲッターとしている
override val entries: Set<Map.Entry<KParameter, Any?>>
get() = keyList
.filter { initializationStatusManager.isInitialized(it.index) }
.filter { initializationStatuses[it.index] }
.map { Entry(it, valueArray[it.index]) }
.toSet()
override val keys: Set<KParameter>
get() = keyList.filter { initializationStatusManager.isInitialized(it.index) }.toSet()
get() = keyList.filter { initializationStatuses[it.index] }.toSet()
override val values: Collection<Any?>
get() = valueArray.filterIndexed { i, _ -> initializationStatusManager.isInitialized(i) }
get() = valueArray.filterIndexed { i, _ -> initializationStatuses[i] }
}

This file was deleted.