From 602c38377b9bf376092c4507d128712dff3e543a Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 29 Mar 2020 00:20:19 +0900 Subject: [PATCH 01/13] =?UTF-8?q?=E3=82=B3=E3=83=A1=E3=83=B3=E3=83=88?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/mapk/core/EnumMapper.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/mapk/core/EnumMapper.java b/src/main/java/com/mapk/core/EnumMapper.java index e206016..2b9e8da 100644 --- a/src/main/java/com/mapk/core/EnumMapper.java +++ b/src/main/java/com/mapk/core/EnumMapper.java @@ -3,9 +3,12 @@ import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +/** + * Kotlinの型推論バグでクラスからvalueOfが使えないため、ここだけJavaで書いている(型引数もT extends Enumでは書けなかった) + */ public class EnumMapper { /** - * Kotlinの型推論バグでクラスからvalueOfが使えないため、ここだけJavaで書いている(型引数もT extends Enumでは書けなかった) + * 文字列 -> Enumのマッピング * @param clazz Class of Enum * @param value StringValue * @param enumClass From ead9ef0c6ab50e8355756e464b1009a813c0c173 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 29 Mar 2020 00:20:52 +0900 Subject: [PATCH 02/13] =?UTF-8?q?=E3=83=91=E3=83=A9=E3=83=A1=E3=83=BC?= =?UTF-8?q?=E3=82=BF=E7=AE=A1=E7=90=86=E3=81=AE=E3=81=9F=E3=82=81=E3=81=AE?= =?UTF-8?q?=E3=82=A4=E3=83=B3=E3=82=BF=E3=83=BC=E3=83=95=E3=82=A7=E3=83=BC?= =?UTF-8?q?=E3=82=B9=E3=83=BB=E3=82=AF=E3=83=A9=E3=82=B9=E3=82=92=E8=BF=BD?= =?UTF-8?q?=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit これを用いることで33以上の引数の関数に対しても対応できるようになる(ただし、65以上には未対応) --- .../mapk/core/InitializationStatusManager.kt | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 src/main/kotlin/com/mapk/core/InitializationStatusManager.kt diff --git a/src/main/kotlin/com/mapk/core/InitializationStatusManager.kt b/src/main/kotlin/com/mapk/core/InitializationStatusManager.kt new file mode 100644 index 0000000..43ed8ba --- /dev/null +++ b/src/main/kotlin/com/mapk/core/InitializationStatusManager.kt @@ -0,0 +1,24 @@ +package com.mapk.core + +internal interface InitializationStatusManager { + val isFullInitialized: Boolean + val count: Int + fun isInitialized(index: Int): Boolean + fun put(index: Int) +} + +internal class BitFlagInitializationStatusManager( + private var initializationStatus: Long, + private val initializeMask: List, + private val completionValue: Long +) : InitializationStatusManager { + override val isFullInitialized: Boolean get() = initializationStatus == completionValue + // インスタンス有りなら1、そうでなければ0スタート + override var count = completionValue.toInt() + + override fun isInitialized(index: Int) = initializationStatus and initializeMask[index] != 0L + + override fun put(index: Int) { + initializationStatus = initializationStatus or initializeMask[index] + } +} From 978133a2d42ded511a5d24ca271d8b27b1c97ea0 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 29 Mar 2020 00:22:15 +0900 Subject: [PATCH 03/13] =?UTF-8?q?=E3=82=B9=E3=83=86=E3=83=BC=E3=82=BF?= =?UTF-8?q?=E3=82=B9=E7=AE=A1=E7=90=86=E3=81=AF=E3=82=A4=E3=83=B3=E3=82=BF?= =?UTF-8?q?=E3=83=BC=E3=83=95=E3=82=A7=E3=83=BC=E3=82=B9=E7=B5=8C=E7=94=B1?= =?UTF-8?q?=E3=81=A7=E8=A1=8C=E3=81=86=E3=82=88=E3=81=86=E3=81=AB=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../kotlin/com/mapk/core/ArgumentBucket.kt | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/src/main/kotlin/com/mapk/core/ArgumentBucket.kt b/src/main/kotlin/com/mapk/core/ArgumentBucket.kt index d17fd06..3454817 100644 --- a/src/main/kotlin/com/mapk/core/ArgumentBucket.kt +++ b/src/main/kotlin/com/mapk/core/ArgumentBucket.kt @@ -7,14 +7,12 @@ class ArgumentBucket internal constructor( private val keyArray: Array, internal val valueArray: Array, private val isRequireNonNull: List, - private var initializationStatus: Int, - private val initializeMask: List, - private val completionValue: Int + private val initializationStatusManager: InitializationStatusManager ) : Map { // インスタンス有りなら1、そうでなければ0スタート - private var count: Int = initializationStatus + private var count: Int = initializationStatusManager.count - val isInitialized: Boolean get() = initializationStatus == completionValue + val isInitialized: Boolean get() = initializationStatusManager.isFullInitialized class Entry internal constructor( override val key: KParameter, @@ -32,7 +30,7 @@ class ArgumentBucket internal constructor( override fun get(key: KParameter): Any? = valueArray[key.index] fun getByIndex(key: Int): Any? = - if (initializationStatus and initializeMask[key] != 0) valueArray[key] + if (initializationStatusManager.isInitialized(key)) valueArray[key] else throw IllegalStateException("This argument is not initialized.") override fun isEmpty(): Boolean = count == 0 @@ -42,7 +40,7 @@ class ArgumentBucket internal constructor( override val keys: MutableSet get() = keyArray.filterNotNull().toMutableSet() override val values: MutableCollection - get() = valueArray.filterIndexed { i, _ -> initializationStatus and initializeMask[i] != 0 }.toMutableList() + get() = valueArray.filterIndexed { i, _ -> initializationStatusManager.isInitialized(i) }.toMutableList() fun putIfAbsent(key: KParameter, value: Any?) { val index = key.index @@ -50,13 +48,11 @@ class ArgumentBucket internal constructor( // null入力禁止かつnullなら無視する if (isRequireNonNull[index] && value == null) return - val temp = initializationStatus or initializeMask[index] - // 先に入ったものを優先するため、初期化済みなら何もしない - if (initializationStatus == temp) return + if (initializationStatusManager.isInitialized(index)) return count += 1 - initializationStatus = temp + initializationStatusManager.put(index) keyArray[index] = key valueArray[index] = value From 879aea5c3acf4f501994e38d648f92a2ec605c5b Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 29 Mar 2020 00:22:27 +0900 Subject: [PATCH 04/13] =?UTF-8?q?=E3=83=90=E3=82=B1=E3=83=84=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E3=82=92=E4=BB=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/mapk/core/BucketGenerator.java | 11 +++++------ 1 file changed, 5 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/mapk/core/BucketGenerator.java b/src/main/java/com/mapk/core/BucketGenerator.java index 2f9f6be..e27edba 100644 --- a/src/main/java/com/mapk/core/BucketGenerator.java +++ b/src/main/java/com/mapk/core/BucketGenerator.java @@ -12,8 +12,8 @@ class BucketGenerator { private final int initializationStatus; @NotNull - private final List initializeMask; - private final int completionValue; + private final List initializeMask; + private final long completionValue; @NotNull private final List isRequireNonNull; @@ -41,7 +41,8 @@ class BucketGenerator { initializeMask = new ArrayList<>(capacity); int completionValue = 0; - for (int i = 0, mask = 1; i < capacity; i++, mask <<= 1) { + long mask = 1; + for (int i = 0; i < capacity; i++, mask <<= 1) { isRequireNonNull.add( i, parameters.get(i).getAnnotations().stream().anyMatch(it -> it instanceof KParameterRequireNonNull) @@ -59,9 +60,7 @@ ArgumentBucket generate() { keyArray.clone(), valueArray.clone(), isRequireNonNull, - initializationStatus, - initializeMask, - completionValue + new BitFlagInitializationStatusManager(initializationStatus, initializeMask, completionValue) ); } } From 45d2efea7701225ff46e496bc7f5772404650f70 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 29 Mar 2020 00:50:04 +0900 Subject: [PATCH 05/13] =?UTF-8?q?exclude=E8=A8=AD=E5=AE=9A=E3=82=92?= =?UTF-8?q?=E8=BF=BD=E5=8A=A0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 1e92756..f0505df 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,5 @@ # Project exclude paths /.gradle/ /build/ -/target/ \ No newline at end of file +/target/ +/out/ \ No newline at end of file From 4c5b8527bfff9b4265a23cf6b65e4711b1b165ef Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 29 Mar 2020 00:51:10 +0900 Subject: [PATCH 06/13] =?UTF-8?q?=E3=82=AB=E3=82=A6=E3=83=B3=E3=83=88?= =?UTF-8?q?=E3=81=AE=E5=8A=A0=E7=AE=97=E6=BC=8F=E3=82=8C=E3=82=92=E4=BF=AE?= =?UTF-8?q?=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/kotlin/com/mapk/core/InitializationStatusManager.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/com/mapk/core/InitializationStatusManager.kt b/src/main/kotlin/com/mapk/core/InitializationStatusManager.kt index 43ed8ba..34a35c0 100644 --- a/src/main/kotlin/com/mapk/core/InitializationStatusManager.kt +++ b/src/main/kotlin/com/mapk/core/InitializationStatusManager.kt @@ -20,5 +20,6 @@ internal class BitFlagInitializationStatusManager( override fun put(index: Int) { initializationStatus = initializationStatus or initializeMask[index] + count++ } } From b3c5ee138ee007c7072c94a6d9cae487c415a50c Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 29 Mar 2020 01:12:10 +0900 Subject: [PATCH 07/13] =?UTF-8?q?Boolean=E3=81=AE=E9=85=8D=E5=88=97?= =?UTF-8?q?=E3=81=A7=E7=AE=A1=E7=90=86=E3=81=99=E3=82=8B=E5=BD=A2=E5=BC=8F?= =?UTF-8?q?=E3=81=AB=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/mapk/core/InitializationStatusManager.kt | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/com/mapk/core/InitializationStatusManager.kt b/src/main/kotlin/com/mapk/core/InitializationStatusManager.kt index 34a35c0..160ff4a 100644 --- a/src/main/kotlin/com/mapk/core/InitializationStatusManager.kt +++ b/src/main/kotlin/com/mapk/core/InitializationStatusManager.kt @@ -7,19 +7,17 @@ internal interface InitializationStatusManager { fun put(index: Int) } -internal class BitFlagInitializationStatusManager( - private var initializationStatus: Long, - private val initializeMask: List, - private val completionValue: Long +internal class InitializationStatusManagerImpl( + private val initializationStatus: Array ) : InitializationStatusManager { - override val isFullInitialized: Boolean get() = initializationStatus == completionValue - // インスタンス有りなら1、そうでなければ0スタート - override var count = completionValue.toInt() + private val size = initializationStatus.size + override val isFullInitialized: Boolean get() = count == size + override var count: Int = if (initializationStatus[0]) 1 else 0 - override fun isInitialized(index: Int) = initializationStatus and initializeMask[index] != 0L + override fun isInitialized(index: Int): Boolean = initializationStatus[index] override fun put(index: Int) { - initializationStatus = initializationStatus or initializeMask[index] + initializationStatus[index] = true count++ } } From 306b6d959d4ed2b6400a4d21a314922a88a71d1f Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 29 Mar 2020 01:12:26 +0900 Subject: [PATCH 08/13] =?UTF-8?q?=E7=94=9F=E6=88=90=E9=96=A2=E6=95=B0?= =?UTF-8?q?=E3=82=92=E5=85=A8=E9=9D=A2=E7=9A=84=E3=81=AB=E6=9B=B8=E3=81=8D?= =?UTF-8?q?=E7=9B=B4=E3=81=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mapk/core/BucketGenerator.java | 39 +++++++------------ 1 file changed, 15 insertions(+), 24 deletions(-) diff --git a/src/main/java/com/mapk/core/BucketGenerator.java b/src/main/java/com/mapk/core/BucketGenerator.java index e27edba..43de901 100644 --- a/src/main/java/com/mapk/core/BucketGenerator.java +++ b/src/main/java/com/mapk/core/BucketGenerator.java @@ -10,10 +10,7 @@ import java.util.List; class BucketGenerator { - private final int initializationStatus; - @NotNull - private final List initializeMask; - private final long completionValue; + private final Boolean[] initializationStatus; @NotNull private final List isRequireNonNull; @@ -25,33 +22,27 @@ class BucketGenerator { BucketGenerator(List parameters, @Nullable Pair instancePair) { final int capacity = parameters.size(); - keyArray = new KParameter[capacity]; - valueArray = new Object[capacity]; - - if (instancePair != null) { - initializationStatus = 1; - - keyArray[0] = instancePair.getFirst(); - valueArray[0] = instancePair.getSecond(); - } else { - initializationStatus = 0; - } - isRequireNonNull = new ArrayList<>(capacity); - initializeMask = new ArrayList<>(capacity); - int completionValue = 0; + initializationStatus = new Boolean[capacity]; - long mask = 1; - for (int i = 0; i < capacity; i++, mask <<= 1) { + for (int i = 0; i < capacity; i++) { isRequireNonNull.add( i, parameters.get(i).getAnnotations().stream().anyMatch(it -> it instanceof KParameterRequireNonNull) ); - initializeMask.add(i, mask); - completionValue |= mask; + initializationStatus[i] = false; } - this.completionValue = completionValue; + keyArray = new KParameter[capacity]; + valueArray = new Object[capacity]; + + if (instancePair != null) { + keyArray[0] = instancePair.getFirst(); + valueArray[0] = instancePair.getSecond(); + initializationStatus[0] = true; + } else { + initializationStatus[0] = false; + } } @NotNull @@ -60,7 +51,7 @@ ArgumentBucket generate() { keyArray.clone(), valueArray.clone(), isRequireNonNull, - new BitFlagInitializationStatusManager(initializationStatus, initializeMask, completionValue) + new InitializationStatusManagerImpl(initializationStatus.clone()) ); } } From 5067cd930f866171baf9094a2c5b221d78d34623 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 29 Mar 2020 01:20:36 +0900 Subject: [PATCH 09/13] =?UTF-8?q?=E3=82=B8=E3=82=A7=E3=83=8D=E3=83=AC?= =?UTF-8?q?=E3=83=BC=E3=82=BF=E3=83=BC=E3=82=92Java=E3=81=AB=E3=81=97?= =?UTF-8?q?=E3=81=A6=E3=81=8A=E3=81=8F=E7=90=86=E7=94=B1=E3=81=8C=E8=96=84?= =?UTF-8?q?=E3=81=8F=E3=81=AA=E3=81=A3=E3=81=9F=E3=81=9F=E3=82=81Kotlin?= =?UTF-8?q?=E5=8C=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/mapk/core/BucketGenerator.java | 57 ------------------- .../kotlin/com/mapk/core/BucketGenerator.kt | 42 ++++++++++++++ 2 files changed, 42 insertions(+), 57 deletions(-) delete mode 100644 src/main/java/com/mapk/core/BucketGenerator.java create mode 100644 src/main/kotlin/com/mapk/core/BucketGenerator.kt diff --git a/src/main/java/com/mapk/core/BucketGenerator.java b/src/main/java/com/mapk/core/BucketGenerator.java deleted file mode 100644 index 43de901..0000000 --- a/src/main/java/com/mapk/core/BucketGenerator.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.mapk.core; - -import com.mapk.annotations.KParameterRequireNonNull; -import kotlin.Pair; -import kotlin.reflect.KParameter; -import org.jetbrains.annotations.NotNull; -import org.jetbrains.annotations.Nullable; - -import java.util.ArrayList; -import java.util.List; - -class BucketGenerator { - private final Boolean[] initializationStatus; - - @NotNull - private final List isRequireNonNull; - @NotNull - private final KParameter[] keyArray; - @NotNull - private final Object[] valueArray; - - BucketGenerator(List parameters, @Nullable Pair instancePair) { - final int capacity = parameters.size(); - - isRequireNonNull = new ArrayList<>(capacity); - initializationStatus = new Boolean[capacity]; - - for (int i = 0; i < capacity; i++) { - isRequireNonNull.add( - i, - parameters.get(i).getAnnotations().stream().anyMatch(it -> it instanceof KParameterRequireNonNull) - ); - initializationStatus[i] = false; - } - - keyArray = new KParameter[capacity]; - valueArray = new Object[capacity]; - - if (instancePair != null) { - keyArray[0] = instancePair.getFirst(); - valueArray[0] = instancePair.getSecond(); - initializationStatus[0] = true; - } else { - initializationStatus[0] = false; - } - } - - @NotNull - ArgumentBucket generate() { - return new ArgumentBucket( - keyArray.clone(), - valueArray.clone(), - isRequireNonNull, - new InitializationStatusManagerImpl(initializationStatus.clone()) - ); - } -} diff --git a/src/main/kotlin/com/mapk/core/BucketGenerator.kt b/src/main/kotlin/com/mapk/core/BucketGenerator.kt new file mode 100644 index 0000000..6ecb3d3 --- /dev/null +++ b/src/main/kotlin/com/mapk/core/BucketGenerator.kt @@ -0,0 +1,42 @@ +package com.mapk.core + +import com.mapk.annotations.KParameterRequireNonNull +import kotlin.reflect.KParameter + +internal class BucketGenerator( + parameters: List, + instancePair: Pair? +) { + private val initializationStatus: Array + private val isRequireNonNull: List + private val keyArray: Array + private val valueArray: Array + + init { + val capacity = parameters.size + isRequireNonNull = parameters.map { param -> + param.annotations.stream().anyMatch { it is KParameterRequireNonNull } + } + initializationStatus = Array(capacity) { false } + + keyArray = arrayOfNulls(capacity) + valueArray = arrayOfNulls(capacity) + + if (instancePair != null) { + keyArray[0] = instancePair.first + valueArray[0] = instancePair.second + initializationStatus[0] = true + } else { + initializationStatus[0] = false + } + } + + fun generate(): ArgumentBucket { + return ArgumentBucket( + keyArray.clone(), + valueArray.clone(), + isRequireNonNull, + InitializationStatusManagerImpl(initializationStatus.clone()) + ) + } +} From ab6e0a734d8f09d42e4810b6cd09aceacb0ad811 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 29 Mar 2020 01:21:23 +0900 Subject: [PATCH 10/13] =?UTF-8?q?=E3=83=90=E3=83=BC=E3=82=B8=E3=83=A7?= =?UTF-8?q?=E3=83=B3=E3=82=A2=E3=83=83=E3=83=97?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.gradle.kts b/build.gradle.kts index a393873..399a86a 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -6,7 +6,7 @@ plugins { } group = "com.mapk" -version = "0.8" +version = "0.9" java { sourceCompatibility = JavaVersion.VERSION_1_8 From 5ce140267dfe1148107f134183b7caf33fa4cb84 Mon Sep 17 00:00:00 2001 From: wrongwrong Date: Sun, 29 Mar 2020 01:21:28 +0900 Subject: [PATCH 11/13] =?UTF-8?q?=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .idea/gradle.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 4e3c923..4341407 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,6 +4,8 @@