diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/JsIrTestRuntime.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/JsIrTestRuntime.kt index d3e32c1df71..c18e0bf7a03 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/JsIrTestRuntime.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/JsIrTestRuntime.kt @@ -121,6 +121,7 @@ val reducedRuntimeSources = fullRuntimeSources - listOfKtFilesFrom( "libraries/stdlib/unsigned", "libraries/stdlib/common/src/generated/_Arrays.kt", "libraries/stdlib/common/src/generated/_Collections.kt", + "libraries/stdlib/common/src/generated/_Comparisons.kt", "libraries/stdlib/common/src/generated/_Maps.kt", "libraries/stdlib/common/src/generated/_Sequences.kt", "libraries/stdlib/common/src/generated/_Sets.kt", @@ -128,9 +129,11 @@ val reducedRuntimeSources = fullRuntimeSources - listOfKtFilesFrom( "libraries/stdlib/common/src/generated/_UArrays.kt", "libraries/stdlib/common/src/generated/_URanges.kt", "libraries/stdlib/common/src/generated/_UCollections.kt", + "libraries/stdlib/common/src/generated/_UComparisons.kt", "libraries/stdlib/common/src/generated/_USequences.kt", "libraries/stdlib/common/src/kotlin/SequencesH.kt", "libraries/stdlib/common/src/kotlin/TextH.kt", + "libraries/stdlib/common/src/kotlin/UMath.kt", "libraries/stdlib/common/src/kotlin/collections/", "libraries/stdlib/common/src/kotlin/ioH.kt", "libraries/stdlib/js/irRuntime/collectionsHacks.kt", @@ -158,8 +161,7 @@ val reducedRuntimeSources = fullRuntimeSources - listOfKtFilesFrom( "libraries/stdlib/src/kotlin/random/URandom.kt", "libraries/stdlib/src/kotlin/text/", "libraries/stdlib/src/kotlin/util/KotlinVersion.kt", - "libraries/stdlib/src/kotlin/util/Tuples.kt", - "libraries/stdlib/common/src/generated/_Comparisons.kt" + "libraries/stdlib/src/kotlin/util/Tuples.kt" ) + listOfKtFilesFrom( "libraries/stdlib/js/irRuntime/smallRuntimeMissingDeclarations.kt" ) diff --git a/libraries/stdlib/common/src/generated/_UComparisons.kt b/libraries/stdlib/common/src/generated/_UComparisons.kt new file mode 100644 index 00000000000..1bdec76a6e5 --- /dev/null +++ b/libraries/stdlib/common/src/generated/_UComparisons.kt @@ -0,0 +1,169 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +@file:kotlin.jvm.JvmMultifileClass +@file:kotlin.jvm.JvmName("UComparisonsKt") + +package kotlin.comparisons + +// +// NOTE: THIS FILE IS AUTO-GENERATED by the GenerateStandardLib.kt +// See: https://github.com/JetBrains/kotlin/tree/master/libraries/stdlib +// + +import kotlin.random.* + +/** + * Returns the greater of two values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +public fun maxOf(a: UInt, b: UInt): UInt { + return if (a >= b) a else b +} + +/** + * Returns the greater of two values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +public fun maxOf(a: ULong, b: ULong): ULong { + return if (a >= b) a else b +} + +/** + * Returns the greater of two values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +public fun maxOf(a: UByte, b: UByte): UByte { + return if (a >= b) a else b +} + +/** + * Returns the greater of two values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +public fun maxOf(a: UShort, b: UShort): UShort { + return if (a >= b) a else b +} + +/** + * Returns the greater of three values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +@kotlin.internal.InlineOnly +public inline fun maxOf(a: UInt, b: UInt, c: UInt): UInt { + return maxOf(a, maxOf(b, c)) +} + +/** + * Returns the greater of three values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +@kotlin.internal.InlineOnly +public inline fun maxOf(a: ULong, b: ULong, c: ULong): ULong { + return maxOf(a, maxOf(b, c)) +} + +/** + * Returns the greater of three values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +@kotlin.internal.InlineOnly +public inline fun maxOf(a: UByte, b: UByte, c: UByte): UByte { + return maxOf(a, maxOf(b, c)) +} + +/** + * Returns the greater of three values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +@kotlin.internal.InlineOnly +public inline fun maxOf(a: UShort, b: UShort, c: UShort): UShort { + return maxOf(a, maxOf(b, c)) +} + +/** + * Returns the smaller of two values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +public fun minOf(a: UInt, b: UInt): UInt { + return if (a <= b) a else b +} + +/** + * Returns the smaller of two values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +public fun minOf(a: ULong, b: ULong): ULong { + return if (a <= b) a else b +} + +/** + * Returns the smaller of two values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +public fun minOf(a: UByte, b: UByte): UByte { + return if (a <= b) a else b +} + +/** + * Returns the smaller of two values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +public fun minOf(a: UShort, b: UShort): UShort { + return if (a <= b) a else b +} + +/** + * Returns the smaller of three values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +@kotlin.internal.InlineOnly +public inline fun minOf(a: UInt, b: UInt, c: UInt): UInt { + return minOf(a, minOf(b, c)) +} + +/** + * Returns the smaller of three values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +@kotlin.internal.InlineOnly +public inline fun minOf(a: ULong, b: ULong, c: ULong): ULong { + return minOf(a, minOf(b, c)) +} + +/** + * Returns the smaller of three values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +@kotlin.internal.InlineOnly +public inline fun minOf(a: UByte, b: UByte, c: UByte): UByte { + return minOf(a, minOf(b, c)) +} + +/** + * Returns the smaller of three values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +@kotlin.internal.InlineOnly +public inline fun minOf(a: UShort, b: UShort, c: UShort): UShort { + return minOf(a, minOf(b, c)) +} + diff --git a/libraries/stdlib/test/unsigned/UComparisonsTest.kt b/libraries/stdlib/test/unsigned/UComparisonsTest.kt new file mode 100644 index 00000000000..1fa651fcc3d --- /dev/null +++ b/libraries/stdlib/test/unsigned/UComparisonsTest.kt @@ -0,0 +1,44 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package unsigned + +import kotlin.test.Test +import kotlin.test.expect + +class UComparisonsTest { + + @Test + fun minOf_2() { + expect(1.toUByte()) { minOf(2.toUByte(), 1.toUByte()) } + expect(58.toUShort()) { minOf(58.toUShort(), 32768.toUShort()) } + expect(UInt.MIN_VALUE) { minOf(UInt.MIN_VALUE, UInt.MAX_VALUE) } + expect(42312uL) { minOf(42312uL, 42312uL) } + } + + @Test + fun minOf_3() { + expect(1.toUByte()) { minOf(2.toUByte(), 1.toUByte(), 3.toUByte()) } + expect(55.toUShort()) { minOf(58.toUShort(), 32768.toUShort(), 55.toUShort()) } + expect(UInt.MIN_VALUE) { minOf(UInt.MIN_VALUE, UInt.MAX_VALUE, 0u) } + expect(42312uL) { minOf(42312uL, 42312uL, 42312uL) } + } + + @Test + fun maxOf_2() { + expect(2.toUByte()) { maxOf(2.toUByte(), 1.toUByte()) } + expect(32768.toUShort()) { maxOf(58.toUShort(), 32768.toUShort()) } + expect(UInt.MAX_VALUE) { maxOf(UInt.MIN_VALUE, UInt.MAX_VALUE) } + expect(42312uL) { maxOf(42312uL, 42312uL) } + } + + @Test + fun maxOf_3() { + expect(3.toUByte()) { maxOf(2.toUByte(), 1.toUByte(), 3.toUByte()) } + expect(32768.toUShort()) { maxOf(58.toUShort(), 32768.toUShort(), 55.toUShort()) } + expect(UInt.MAX_VALUE) { maxOf(UInt.MIN_VALUE, UInt.MAX_VALUE, 0u) } + expect(42312uL) { maxOf(42312uL, 42312uL, 42312uL) } + } +} \ No newline at end of file diff --git a/libraries/stdlib/test/unsigned/UMathTest.kt b/libraries/stdlib/test/unsigned/UMathTest.kt new file mode 100644 index 00000000000..6eb3aa0d098 --- /dev/null +++ b/libraries/stdlib/test/unsigned/UMathTest.kt @@ -0,0 +1,30 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package test.unsigned + +import kotlin.math.max +import kotlin.math.min +import kotlin.test.Test +import kotlin.test.expect + +class UMathTest { + + @Test + fun min() { + expect(1uL) { min(2uL, 1uL) } + expect(ULong.MIN_VALUE) { min(ULong.MIN_VALUE, ULong.MAX_VALUE) } + expect(58u) { min(58u, 1u shl 31) } + expect(42312u) { min(42312u, 42312u) } + } + + @Test + fun max() { + expect(2u) { max(2u, 1u) } + expect(UInt.MAX_VALUE) { maxOf(UInt.MIN_VALUE, UInt.MAX_VALUE) } + expect(1uL shl 63) { max(58uL, 1uL shl 63) } + expect(42312uL) { maxOf(42312uL, 42312uL) } + } +} diff --git a/libraries/stdlib/unsigned/src/kotlin/UMath.kt b/libraries/stdlib/unsigned/src/kotlin/UMath.kt new file mode 100644 index 00000000000..8928f8d4d70 --- /dev/null +++ b/libraries/stdlib/unsigned/src/kotlin/UMath.kt @@ -0,0 +1,46 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license + * that can be found in the license/LICENSE.txt file. + */ + +package kotlin.math + +/** + * Returns the smaller of two values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +@kotlin.internal.InlineOnly +public inline fun min(a: UInt, b: UInt): UInt { + return minOf(a, b) +} + +/** + * Returns the smaller of two values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +@kotlin.internal.InlineOnly +public inline fun min(a: ULong, b: ULong): ULong { + return minOf(a, b) +} + +/** + * Returns the greater of two values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +@kotlin.internal.InlineOnly +public inline fun max(a: UInt, b: UInt): UInt { + return maxOf(a, b) +} + +/** + * Returns the greater of two values. + */ +@SinceKotlin("1.3") +@ExperimentalUnsignedTypes +@kotlin.internal.InlineOnly +public inline fun max(a: ULong, b: ULong): ULong { + return maxOf(a, b) +} \ No newline at end of file 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 023b5ca58ce..acf1c674e0b 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 @@ -2521,6 +2521,17 @@ public final class kotlin/comparisons/ComparisonsKt { public static final fun thenDescending (Ljava/util/Comparator;Ljava/util/Comparator;)Ljava/util/Comparator; } +public final class kotlin/comparisons/UComparisonsKt { + public static final fun maxOf-5PvTz6A (SS)S + public static final fun maxOf-J1ME1BU (II)I + public static final fun maxOf-Kr8caGY (BB)B + public static final fun maxOf-eb3DHEI (JJ)J + public static final fun minOf-5PvTz6A (SS)S + public static final fun minOf-J1ME1BU (II)I + public static final fun minOf-Kr8caGY (BB)B + public static final fun minOf-eb3DHEI (JJ)J +} + public final class kotlin/concurrent/ThreadsKt { public static final fun thread (ZZLjava/lang/ClassLoader;Ljava/lang/String;ILkotlin/jvm/functions/Function0;)Ljava/lang/Thread; public static synthetic fun thread$default (ZZLjava/lang/ClassLoader;Ljava/lang/String;ILkotlin/jvm/functions/Function0;ILjava/lang/Object;)Ljava/lang/Thread; diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/Comparables.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/Comparables.kt index 096f7fa3e0f..d72dd8f17b1 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/Comparables.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/Comparables.kt @@ -9,6 +9,16 @@ import templates.Family.* object ComparableOps : TemplateGroupBase() { + init { + defaultBuilder { + specialFor(Unsigned) { + since("1.3") + annotation("@ExperimentalUnsignedTypes") + sourceFile(SourceFile.UComparisons) + } + } + } + private val numericPrimitives = PrimitiveType.numericPrimitives.sortedBy { it.capacity }.toSet() private val intPrimitives = setOf(PrimitiveType.Int, PrimitiveType.Long) private val shortIntPrimitives = setOf(PrimitiveType.Byte, PrimitiveType.Short) @@ -133,6 +143,7 @@ object ComparableOps : TemplateGroupBase() { val f_minOf_2 = fn("minOf(a: T, b: T)") { include(Generic) include(Primitives, numericPrimitives) + include(Unsigned) } builder { sourceFile(SourceFile.Comparisons) since("1.1") @@ -146,18 +157,19 @@ object ComparableOps : TemplateGroupBase() { """ } val defaultImpl = "if (a <= b) a else b" + body { "return $defaultImpl" } + + specialFor(Primitives, Unsigned) { + doc { "Returns the smaller of two values." } + } // TODO: Add a note about NaN propagation for floats. specialFor(Primitives) { inlineOnly() - doc { - """Returns the smaller of two values.""" - } var convertBack = "to$primitive()" on(Platform.JS) { suppress("DEPRECATION_ERROR") convertBack = "unsafeCast<$primitive>()" } - body { "return $defaultImpl" } on(Platform.JVM) { body { "return Math.min(a, b)" } } @@ -188,22 +200,22 @@ object ComparableOps : TemplateGroupBase() { } } } - on(Platform.JS) { /* just to make expect, KT-22520 */ } - body(Generic) { - "return $defaultImpl" + specialFor(Generic) { + on(Platform.JS) { /* just to make expect, KT-22520 */ } } } val f_minOf_3 = fn("minOf(a: T, b: T, c: T)") { include(Generic) include(Primitives, numericPrimitives) + include(Unsigned) } builder { sourceFile(SourceFile.Comparisons) since("1.1") typeParam("T : Comparable") returns("T") receiver("") - specialFor(Primitives) { inlineOnly() } + specialFor(Primitives, Unsigned) { inlineOnly() } // TODO: Add a note about NaN propagation for floats. doc { """ @@ -213,7 +225,9 @@ object ComparableOps : TemplateGroupBase() { body { "return minOf(a, minOf(b, c))" } - on(Platform.JS) { /* just to make expect, KT-22520 */ } + specialFor(Primitives, Generic) { + on(Platform.JS) { /* just to make expect, KT-22520 */ } + } specialFor(Primitives) { if (primitive in shortIntPrimitives) { body { "return minOf(a.toInt(), minOf(b.toInt(), c.toInt())).to$primitive()" } @@ -272,6 +286,7 @@ object ComparableOps : TemplateGroupBase() { val f_maxOf_2 = fn("maxOf(a: T, b: T)") { include(Generic) include(Primitives, numericPrimitives) + include(Unsigned) } builder { sourceFile(SourceFile.Comparisons) since("1.1") @@ -285,18 +300,19 @@ object ComparableOps : TemplateGroupBase() { """ } val defaultImpl = "if (a >= b) a else b" + body { "return $defaultImpl" } + + specialFor(Primitives, Unsigned) { + doc { "Returns the greater of two values." } + } // TODO: Add a note about NaN propagation for floats. specialFor(Primitives) { inlineOnly() - doc { - """Returns the greater of two values.""" - } var convertBack = "to$primitive()" on(Platform.JS) { suppress("DEPRECATION_ERROR") convertBack = "unsafeCast<$primitive>()" } - body { "return $defaultImpl" } on(Platform.JVM) { body { "return Math.max(a, b)" } } @@ -323,22 +339,22 @@ object ComparableOps : TemplateGroupBase() { } } } - on(Platform.JS) { /* just to make expect, KT-22520 */ } - body(Generic) { - "return $defaultImpl" + specialFor(Generic) { + on(Platform.JS) { /* just to make expect, KT-22520 */ } } } val f_maxOf_3 = fn("maxOf(a: T, b: T, c: T)") { include(Generic) include(Primitives, numericPrimitives) + include(Unsigned) } builder { sourceFile(SourceFile.Comparisons) since("1.1") typeParam("T : Comparable") returns("T") receiver("") - specialFor(Primitives) { inlineOnly() } + specialFor(Primitives, Unsigned) { inlineOnly() } // TODO: Add a note about NaN propagation for floats. doc { """ @@ -348,7 +364,9 @@ object ComparableOps : TemplateGroupBase() { body { "return maxOf(a, maxOf(b, c))" } - on(Platform.JS) { /* just to make expect, KT-22520 */ } + specialFor(Primitives, Generic) { + on(Platform.JS) { /* just to make expect, KT-22520 */ } + } specialFor(Primitives) { if (primitive in shortIntPrimitives) { body { "return maxOf(a.toInt(), maxOf(b.toInt(), c.toInt())).to$primitive()" } diff --git a/libraries/tools/kotlin-stdlib-gen/src/templates/dsl/SourceFile.kt b/libraries/tools/kotlin-stdlib-gen/src/templates/dsl/SourceFile.kt index 5610edcb82b..216a9ac5613 100644 --- a/libraries/tools/kotlin-stdlib-gen/src/templates/dsl/SourceFile.kt +++ b/libraries/tools/kotlin-stdlib-gen/src/templates/dsl/SourceFile.kt @@ -18,6 +18,7 @@ enum class SourceFile(jvmClassName: String? = null, val multifile: Boolean = tru Ranges(packageName = "kotlin.ranges"), URanges(packageName = "kotlin.ranges"), Comparisons(packageName = "kotlin.comparisons"), + UComparisons(packageName = "kotlin.comparisons"), Strings(packageName = "kotlin.text"), Misc(), ;