diff --git a/generators/builtins/unsignedTypes.kt b/generators/builtins/unsignedTypes.kt index 42f3a4ead02..a8dcb204e87 100644 --- a/generators/builtins/unsignedTypes.kt +++ b/generators/builtins/unsignedTypes.kt @@ -69,6 +69,8 @@ class UnsignedTypeGenerator(val type: UnsignedType, out: PrintWriter) : BuiltIns generateMemberConversions() + generateToStringHashCode() + out.println("}") out.println() @@ -203,6 +205,20 @@ class UnsignedTypeGenerator(val type: UnsignedType, out: PrintWriter) : BuiltIns } + private fun generateToStringHashCode() { + + out.print(" public override fun toString(): String = ") + when (type) { + UnsignedType.UBYTE, UnsignedType.USHORT -> out.println("toInt().toString()") + UnsignedType.UINT -> out.println("toLong().toString()") + UnsignedType.ULONG -> out.println("ulongToString(data)") + else -> error(type) + } + + out.println() + } + + private fun maxByDomainCapacity(type1: UnsignedType, type2: UnsignedType): UnsignedType = if (type1.ordinal > type2.ordinal) type1 else type2 diff --git a/libraries/stdlib/unsigned/src/kotlin/UByte.kt b/libraries/stdlib/unsigned/src/kotlin/UByte.kt index 237d4f1deef..1f466993a92 100644 --- a/libraries/stdlib/unsigned/src/kotlin/UByte.kt +++ b/libraries/stdlib/unsigned/src/kotlin/UByte.kt @@ -123,6 +123,8 @@ public inline class UByte internal constructor(private val data: Byte) : Compara public fun toUInt(): UInt = data.toUInt() public fun toULong(): ULong = data.toULong() + public override fun toString(): String = toInt().toString() + } public fun Byte.toUByte(): UByte = UByte(this) diff --git a/libraries/stdlib/unsigned/src/kotlin/UInt.kt b/libraries/stdlib/unsigned/src/kotlin/UInt.kt index 0cbf400b3c9..bb423b57996 100644 --- a/libraries/stdlib/unsigned/src/kotlin/UInt.kt +++ b/libraries/stdlib/unsigned/src/kotlin/UInt.kt @@ -127,6 +127,8 @@ public inline class UInt internal constructor(private val data: Int) : Comparabl public fun toUInt(): UInt = this public fun toULong(): ULong = data.toULong() + public override fun toString(): String = toLong().toString() + } public fun Byte.toUInt(): UInt = UInt(this.toInt() and 0xFF) diff --git a/libraries/stdlib/unsigned/src/kotlin/ULong.kt b/libraries/stdlib/unsigned/src/kotlin/ULong.kt index 612b46a56bc..6b7b0c3fa0f 100644 --- a/libraries/stdlib/unsigned/src/kotlin/ULong.kt +++ b/libraries/stdlib/unsigned/src/kotlin/ULong.kt @@ -127,6 +127,8 @@ public inline class ULong internal constructor(private val data: Long) : Compara public fun toUInt(): UInt = data.toUInt() public fun toULong(): ULong = this + public override fun toString(): String = ulongToString(data) + } public fun Byte.toULong(): ULong = ULong(this.toLong() and 0xFF) diff --git a/libraries/stdlib/unsigned/src/kotlin/UShort.kt b/libraries/stdlib/unsigned/src/kotlin/UShort.kt index 59819cfd327..be63b42cc43 100644 --- a/libraries/stdlib/unsigned/src/kotlin/UShort.kt +++ b/libraries/stdlib/unsigned/src/kotlin/UShort.kt @@ -123,6 +123,8 @@ public inline class UShort internal constructor(private val data: Short) : Compa public fun toUInt(): UInt = data.toUInt() public fun toULong(): ULong = data.toULong() + public override fun toString(): String = toInt().toString() + } public fun Byte.toUShort(): UShort = UShort(this.toShort() and 0xFF) diff --git a/libraries/stdlib/unsigned/src/kotlin/UnsignedUtils.kt b/libraries/stdlib/unsigned/src/kotlin/UnsignedUtils.kt index 46a152016ce..198ee51e78f 100644 --- a/libraries/stdlib/unsigned/src/kotlin/UnsignedUtils.kt +++ b/libraries/stdlib/unsigned/src/kotlin/UnsignedUtils.kt @@ -51,4 +51,21 @@ internal fun ulongRemainder(v1: ULong, v2: ULong): ULong { val quotient = ((dividend ushr 1) / divisor) shl 1 val rem = dividend - quotient * divisor return ULong(rem - if (ULong(rem) >= ULong(divisor)) divisor else 0) -} \ No newline at end of file +} + + +internal fun ulongToString(v: Long): String = ulongToString(v, 10) + +internal fun ulongToString(v: Long, base: Int): String { + require(base == 10) // TODO: toString(base) support in common + if (v >= 0) return v.toString(/* base */) + + var quotient = ((v ushr 1) / base) shl 1 + var rem = v - quotient * base + if (rem >= base) { + rem -= base + quotient += 1 + } + return quotient.toString(/* base */) + rem.toString(/* base */) +} +