From 1b46d00a91b80b41667a644b632dd1924d661828 Mon Sep 17 00:00:00 2001 From: Alexander Nozik Date: Sun, 29 Nov 2020 10:18:52 +0300 Subject: [PATCH] Changed the logic of `Value::isList` for serialization --- CHANGELOG.md | 3 +++ build.gradle.kts | 2 +- dataforge-meta/api/dataforge-meta.api | 6 ++++-- .../commonMain/kotlin/hep/dataforge/values/Value.kt | 12 +++++++----- .../kotlin/hep/dataforge/values/exoticValues.kt | 10 ++++++---- .../kotlin/hep/dataforge/values/valueExtensions.kt | 5 +++-- 6 files changed, 24 insertions(+), 14 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5018fb97..5904ceae 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,8 @@ ### Added ### Changed +- `ListValue` and `DoubleArrayValue` implement `Iterable`. +- Changed the logic of `Value::isList` to check for type instead of size ### Deprecated @@ -12,6 +14,7 @@ ### Fixed ### Security + ## [0.2.0] ### Added diff --git a/build.gradle.kts b/build.gradle.kts index 7d138083..00f0dd33 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -2,7 +2,7 @@ plugins { id("ru.mipt.npm.project") } -val dataforgeVersion by extra("0.2.0") +val dataforgeVersion by extra("0.2.1-dev-1") val bintrayRepo by extra("dataforge") val githubProject by extra("dataforge-core") diff --git a/dataforge-meta/api/dataforge-meta.api b/dataforge-meta/api/dataforge-meta.api index f4b8d3ed..4100ccb7 100644 --- a/dataforge-meta/api/dataforge-meta.api +++ b/dataforge-meta/api/dataforge-meta.api @@ -813,7 +813,7 @@ public final class hep/dataforge/names/NameTokenKt { public static final fun withIndex (Lhep/dataforge/names/NameToken;Ljava/lang/String;)Lhep/dataforge/names/NameToken; } -public final class hep/dataforge/values/DoubleArrayValue : hep/dataforge/values/Value { +public final class hep/dataforge/values/DoubleArrayValue : hep/dataforge/values/Value, java/lang/Iterable, kotlin/jvm/internal/markers/KMappedMarker { public fun ([D)V public fun equals (Ljava/lang/Object;)Z public fun getList ()Ljava/util/List; @@ -824,6 +824,7 @@ public final class hep/dataforge/values/DoubleArrayValue : hep/dataforge/values/ public synthetic fun getValue ()Ljava/lang/Object; public fun getValue ()[D public fun hashCode ()I + public fun iterator ()Ljava/util/Iterator; public fun toString ()Ljava/lang/String; } @@ -869,7 +870,7 @@ public final class hep/dataforge/values/LazyParsedValue : hep/dataforge/values/V public fun toString ()Ljava/lang/String; } -public final class hep/dataforge/values/ListValue : hep/dataforge/values/Value { +public final class hep/dataforge/values/ListValue : hep/dataforge/values/Value, java/lang/Iterable, kotlin/jvm/internal/markers/KMappedMarker { public fun (Ljava/util/List;)V public fun equals (Ljava/lang/Object;)Z public fun getList ()Ljava/util/List; @@ -879,6 +880,7 @@ public final class hep/dataforge/values/ListValue : hep/dataforge/values/Value { public synthetic fun getValue ()Ljava/lang/Object; public fun getValue ()Ljava/util/List; public fun hashCode ()I + public fun iterator ()Ljava/util/Iterator; public fun toString ()Ljava/lang/String; } diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/values/Value.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/values/Value.kt index ca78f0ae..c81651df 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/values/Value.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/values/Value.kt @@ -105,7 +105,7 @@ public object Null : Value { * Singleton true value */ public object True : Value { - override val value: Any? get() = true + override val value: Any get() = true override val type: ValueType get() = ValueType.BOOLEAN override val number: Number get() = 1.0 override val string: String get() = "true" @@ -120,7 +120,7 @@ public object True : Value { * Singleton false value */ public object False : Value { - override val value: Any? get() = false + override val value: Any get() = false override val type: ValueType get() = ValueType.BOOLEAN override val number: Number get() = -1.0 override val string: String get() = "false" @@ -132,7 +132,7 @@ public object False : Value { } public class NumberValue(override val number: Number) : Value { - override val value: Any? get() = number + override val value: Any get() = number override val type: ValueType get() = ValueType.NUMBER override val string: String get() = number.toString() @@ -155,7 +155,7 @@ public class NumberValue(override val number: Number) : Value { } public class StringValue(override val string: String) : Value { - override val value: Any? get() = string + override val value: Any get() = string override val type: ValueType get() = ValueType.STRING override val number: Number get() = string.toDouble() @@ -182,7 +182,7 @@ public class EnumValue>(override val value: E) : Value { override fun toString(): String = value.toString() } -public class ListValue(override val list: List) : Value { +public class ListValue(override val list: List) : Value, Iterable { init { require(list.isNotEmpty()) { "Can't create list value from empty list" } } @@ -194,6 +194,8 @@ public class ListValue(override val list: List) : Value { override fun toString(): String = list.joinToString(prefix = "[", postfix = "]") + override fun iterator(): Iterator = list.iterator() + override fun equals(other: Any?): Boolean { if (this === other) return true if (other !is Value) return false diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/values/exoticValues.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/values/exoticValues.kt index 4b04a036..d961b4a9 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/values/exoticValues.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/values/exoticValues.kt @@ -15,7 +15,7 @@ public class LazyParsedValue(override val string: String) : Value { override fun equals(other: Any?): Boolean = other is Value && this.parsedValue == other - override fun hashCode(): Int = string.hashCode() + override fun hashCode(): Int = string.hashCode() } public fun String.lazyParseValue(): LazyParsedValue = LazyParsedValue(this) @@ -23,7 +23,7 @@ public fun String.lazyParseValue(): LazyParsedValue = LazyParsedValue(this) /** * A performance optimized version of list value for doubles */ -public class DoubleArrayValue(override val value: DoubleArray) : Value { +public class DoubleArrayValue(override val value: DoubleArray) : Value, Iterable { override val type: ValueType get() = ValueType.NUMBER override val number: Double get() = value.first() override val string: String get() = value.first().toString() @@ -43,7 +43,9 @@ public class DoubleArrayValue(override val value: DoubleArray) : Value { return value.contentHashCode() } - override fun toString(): String = list.joinToString (prefix = "[", postfix = "]") + override fun toString(): String = list.joinToString(prefix = "[", postfix = "]") + + override fun iterator(): Iterator = value.iterator() } -public fun DoubleArray.asValue(): Value = if(isEmpty()) Null else DoubleArrayValue(this) +public fun DoubleArray.asValue(): Value = if (isEmpty()) Null else DoubleArrayValue(this) diff --git a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/values/valueExtensions.kt b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/values/valueExtensions.kt index 2171c4ea..50b15aed 100644 --- a/dataforge-meta/src/commonMain/kotlin/hep/dataforge/values/valueExtensions.kt +++ b/dataforge-meta/src/commonMain/kotlin/hep/dataforge/values/valueExtensions.kt @@ -9,9 +9,10 @@ import hep.dataforge.meta.MetaBuilder public fun Value.isNull(): Boolean = this == Null /** - * Check if value is list + * Check if value is list. This method checks the type of the value, not the number of the elements. + * So it will return `true` for empty lists and lists of one elements. */ -public fun Value.isList(): Boolean = this.list.size > 1 +public fun Value.isList(): Boolean = this is Iterable<*> public val Value.boolean: Boolean get() = this == True