From a51c9002716f57474aee05ad4a24b563a651d074 Mon Sep 17 00:00:00 2001 From: Nikolay Igotti Date: Mon, 27 Feb 2017 12:01:04 +0300 Subject: [PATCH] Add equals() to basic value types. (#271) --- runtime/src/main/kotlin/kotlin/Boolean.kt | 5 +++ runtime/src/main/kotlin/kotlin/Char.kt | 5 +++ runtime/src/main/kotlin/kotlin/Primitives.kt | 36 ++++++++++++++++++++ 3 files changed, 46 insertions(+) diff --git a/runtime/src/main/kotlin/kotlin/Boolean.kt b/runtime/src/main/kotlin/kotlin/Boolean.kt index 41f76c900f2..df6a7456091 100644 --- a/runtime/src/main/kotlin/kotlin/Boolean.kt +++ b/runtime/src/main/kotlin/kotlin/Boolean.kt @@ -33,6 +33,11 @@ public final class Boolean : Comparable { external public override fun compareTo(other: Boolean): Int // Konan-specific. + public fun equals(other: Boolean): Boolean = konan.internal.areEqualByValue(this, other) + + public override fun equals(other: Any?): Boolean = + other is Boolean && konan.internal.areEqualByValue(this, other) + @SymbolName("Kotlin_Boolean_toString") external public override fun toString(): String diff --git a/runtime/src/main/kotlin/kotlin/Char.kt b/runtime/src/main/kotlin/kotlin/Char.kt index 49a1af31824..03d42e3465f 100644 --- a/runtime/src/main/kotlin/kotlin/Char.kt +++ b/runtime/src/main/kotlin/kotlin/Char.kt @@ -92,6 +92,11 @@ public final class Char : Comparable { } // Konan-specific. + public fun equals(other: Char): Boolean = konan.internal.areEqualByValue(this, other) + + public override fun equals(other: Any?): Boolean = + other is Char && konan.internal.areEqualByValue(this, other) + @SymbolName("Kotlin_Char_toString") external public override fun toString(): String diff --git a/runtime/src/main/kotlin/kotlin/Primitives.kt b/runtime/src/main/kotlin/kotlin/Primitives.kt index f4d11b7f18f..1467ccb46ec 100644 --- a/runtime/src/main/kotlin/kotlin/Primitives.kt +++ b/runtime/src/main/kotlin/kotlin/Primitives.kt @@ -214,6 +214,11 @@ public final class Byte : Number(), Comparable { } // Konan-specific. + public fun equals(other: Byte): Boolean = konan.internal.areEqualByValue(this, other) + + public override fun equals(other: Any?): Boolean = + other is Byte && konan.internal.areEqualByValue(this, other) + @SymbolName("Kotlin_Byte_toString") external public override fun toString(): String @@ -436,6 +441,11 @@ public final class Short : Number(), Comparable { external public override fun toDouble(): Double // Konan-specific. + public fun equals(other: Short): Boolean = konan.internal.areEqualByValue(this, other) + + public override fun equals(other: Any?): Boolean = + other is Short && konan.internal.areEqualByValue(this, other) + @SymbolName("Kotlin_Short_toString") external public override fun toString(): String @@ -667,6 +677,11 @@ public final class Int : Number(), Comparable { external public override fun toDouble(): Double // Konan-specific. + public fun equals(other: Int): Boolean = konan.internal.areEqualByValue(this, other) + + public override fun equals(other: Any?): Boolean = + other is Int && konan.internal.areEqualByValue(this, other) + @SymbolName("Kotlin_Int_toString") external public override fun toString(): String @@ -674,6 +689,7 @@ public final class Int : Number(), Comparable { return this } + // TODO: make extensions. fun highestOneBit() : Int { var index = 31 @@ -924,6 +940,11 @@ public final class Long : Number(), Comparable { external public override fun toDouble(): Double // Konan-specific. + public fun equals(other: Long): Boolean = konan.internal.areEqualByValue(this, other) + + public override fun equals(other: Any?): Boolean = + other is Long && konan.internal.areEqualByValue(this, other) + @SymbolName("Kotlin_Long_toString") external public override fun toString(): String @@ -1130,6 +1151,14 @@ public final class Float : Number(), Comparable { external public override fun toDouble(): Double // Konan-specific. + // We intentionally provide this overload to equals() to avoid artifical boxing. + // Note that here we intentionally deviate from JVM Kotlin, where this method would be + // this.bits() == other.bits(). + public fun equals(other: Float): Boolean = konan.internal.areEqualByValue(this, other) + + public override fun equals(other: Any?): Boolean = + other is Float && konan.internal.areEqualByValue(this, other) + @SymbolName("Kotlin_Float_toString") external public override fun toString(): String @@ -1340,6 +1369,13 @@ public final class Double : Number(), Comparable { external public override fun toDouble(): Double // Konan-specific. + // Note that here we intentionally deviate from JVM Kotlin, where this method would be + // this.bits() == other.bits(). + public fun equals(other: Double): Boolean = konan.internal.areEqualByValue(this, other) + + public override fun equals(other: Any?): Boolean = + other is Double && konan.internal.areEqualByValue(this, other) + @SymbolName("Kotlin_Double_toString") external public override fun toString(): String