From 1792a77a470c8a1bd657f750b5260102acabbeff Mon Sep 17 00:00:00 2001 From: Ilya Gorbunov Date: Wed, 18 Jul 2018 14:38:45 +0300 Subject: [PATCH] Generate hashCode and equals for unsigned types --- generators/builtins/unsignedTypes.kt | 11 +++++++++++ libraries/stdlib/unsigned/src/kotlin/UByte.kt | 5 +++++ libraries/stdlib/unsigned/src/kotlin/UInt.kt | 5 +++++ libraries/stdlib/unsigned/src/kotlin/ULong.kt | 5 +++++ libraries/stdlib/unsigned/src/kotlin/UShort.kt | 5 +++++ .../kotlin-stdlib-runtime-merged.txt | 16 ++++++++++++++++ 6 files changed, 47 insertions(+) diff --git a/generators/builtins/unsignedTypes.kt b/generators/builtins/unsignedTypes.kt index 57ecb11c328..57b70e3706a 100644 --- a/generators/builtins/unsignedTypes.kt +++ b/generators/builtins/unsignedTypes.kt @@ -229,6 +229,17 @@ class UnsignedTypeGenerator(val type: UnsignedType, out: PrintWriter) : BuiltIns UnsignedType.ULONG -> out.println("ulongToString(data)") else -> error(type) } + out.println() + + out.print(" public override fun hashCode(): Int = ") + when (type) { + UnsignedType.UBYTE, UnsignedType.USHORT, UnsignedType.UINT -> out.println("toInt()") + UnsignedType.ULONG -> out.println("((this shr 32).toInt() xor this.toInt())") + } + out.println() + + out.println(" public override fun equals(other: Any?): Boolean =") + out.println(" other is ${type.capitalized} && this.data == other.data") out.println() } diff --git a/libraries/stdlib/unsigned/src/kotlin/UByte.kt b/libraries/stdlib/unsigned/src/kotlin/UByte.kt index 4ed06b39565..962da20ba85 100644 --- a/libraries/stdlib/unsigned/src/kotlin/UByte.kt +++ b/libraries/stdlib/unsigned/src/kotlin/UByte.kt @@ -138,6 +138,11 @@ public inline class UByte internal constructor(private val data: Byte) : Compara public override fun toString(): String = toInt().toString() + public override fun hashCode(): Int = toInt() + + public override fun equals(other: Any?): Boolean = + other is UByte && this.data == other.data + } @SinceKotlin("1.3") diff --git a/libraries/stdlib/unsigned/src/kotlin/UInt.kt b/libraries/stdlib/unsigned/src/kotlin/UInt.kt index bf6560144cc..e42a22bb114 100644 --- a/libraries/stdlib/unsigned/src/kotlin/UInt.kt +++ b/libraries/stdlib/unsigned/src/kotlin/UInt.kt @@ -142,6 +142,11 @@ public inline class UInt internal constructor(private val data: Int) : Comparabl public override fun toString(): String = toLong().toString() + public override fun hashCode(): Int = toInt() + + public override fun equals(other: Any?): Boolean = + other is UInt && this.data == other.data + } @SinceKotlin("1.3") diff --git a/libraries/stdlib/unsigned/src/kotlin/ULong.kt b/libraries/stdlib/unsigned/src/kotlin/ULong.kt index 3cf24982049..8b6efb7c27d 100644 --- a/libraries/stdlib/unsigned/src/kotlin/ULong.kt +++ b/libraries/stdlib/unsigned/src/kotlin/ULong.kt @@ -142,6 +142,11 @@ public inline class ULong internal constructor(private val data: Long) : Compara public override fun toString(): String = ulongToString(data) + public override fun hashCode(): Int = ((this shr 32).toInt() xor this.toInt()) + + public override fun equals(other: Any?): Boolean = + other is ULong && this.data == other.data + } @SinceKotlin("1.3") diff --git a/libraries/stdlib/unsigned/src/kotlin/UShort.kt b/libraries/stdlib/unsigned/src/kotlin/UShort.kt index 57b64e0a202..fc1f5488183 100644 --- a/libraries/stdlib/unsigned/src/kotlin/UShort.kt +++ b/libraries/stdlib/unsigned/src/kotlin/UShort.kt @@ -138,6 +138,11 @@ public inline class UShort internal constructor(private val data: Short) : Compa public override fun toString(): String = toInt().toString() + public override fun hashCode(): Int = toInt() + + public override fun equals(other: Any?): Boolean = + other is UShort && this.data == other.data + } @SinceKotlin("1.3") diff --git a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt index 6071f6bf21d..c927d711813 100644 --- a/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt +++ b/libraries/tools/binary-compatibility-validator/reference-public-api/kotlin-stdlib-runtime-merged.txt @@ -229,6 +229,8 @@ public final class kotlin/UByte : java/lang/Comparable { public final fun div (I)I public final fun div (J)J public final fun div (S)I + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I public final fun inc ()B public final fun inv ()B public final fun minus (B)I @@ -277,6 +279,8 @@ public final class kotlin/UByte$Erased { public static final fun div (BI)I public static final fun div (BJ)J public static final fun div (BS)I + public static fun equals (BLjava/lang/Object;)Z + public static fun hashCode (B)I public static final fun inc (B)B public static final fun inv (B)B public static final fun minus (BB)I @@ -373,6 +377,8 @@ public final class kotlin/UInt : java/lang/Comparable { public final fun div (I)I public final fun div (J)J public final fun div (S)I + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I public final fun inc ()I public final fun inv ()I public final fun minus (B)I @@ -423,6 +429,8 @@ public final class kotlin/UInt$Erased { public static final fun div (II)I public static final fun div (IJ)J public static final fun div (IS)I + public static fun equals (ILjava/lang/Object;)Z + public static fun hashCode (I)I public static final fun inc (I)I public static final fun inv (I)I public static final fun minus (IB)I @@ -521,6 +529,8 @@ public final class kotlin/ULong : java/lang/Comparable { public final fun div (I)J public final fun div (J)J public final fun div (S)J + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I public final fun inc ()J public final fun inv ()J public final fun minus (B)J @@ -571,6 +581,8 @@ public final class kotlin/ULong$Erased { public static final fun div (JI)J public static final fun div (JJ)J public static final fun div (JS)J + public static fun equals (JLjava/lang/Object;)Z + public static fun hashCode (J)I public static final fun inc (J)J public static final fun inv (J)J public static final fun minus (JB)J @@ -669,6 +681,8 @@ public final class kotlin/UShort : java/lang/Comparable { public final fun div (I)I public final fun div (J)J public final fun div (S)I + public fun equals (Ljava/lang/Object;)Z + public fun hashCode ()I public final fun inc ()S public final fun inv ()S public final fun minus (B)I @@ -717,6 +731,8 @@ public final class kotlin/UShort$Erased { public static final fun div (SI)I public static final fun div (SJ)J public static final fun div (SS)I + public static fun equals (SLjava/lang/Object;)Z + public static fun hashCode (S)I public static final fun inc (S)S public static final fun inv (S)S public static final fun minus (SB)I