Simplify min/max implementation
This commit is contained in:
@@ -13084,11 +13084,9 @@ public inline fun CharArray.forEachIndexed(action: (index: Int, Char) -> Unit):
|
|||||||
public fun Array<out Double>.max(): Double? {
|
public fun Array<out Double>.max(): Double? {
|
||||||
if (isEmpty()) return null
|
if (isEmpty()) return null
|
||||||
var max = this[0]
|
var max = this[0]
|
||||||
if (max.isNaN()) return max
|
|
||||||
for (i in 1..lastIndex) {
|
for (i in 1..lastIndex) {
|
||||||
val e = this[i]
|
val e = this[i]
|
||||||
if (e.isNaN()) return e
|
max = maxOf(max, e)
|
||||||
if (max < e) max = e
|
|
||||||
}
|
}
|
||||||
return max
|
return max
|
||||||
}
|
}
|
||||||
@@ -13102,11 +13100,9 @@ public fun Array<out Double>.max(): Double? {
|
|||||||
public fun Array<out Float>.max(): Float? {
|
public fun Array<out Float>.max(): Float? {
|
||||||
if (isEmpty()) return null
|
if (isEmpty()) return null
|
||||||
var max = this[0]
|
var max = this[0]
|
||||||
if (max.isNaN()) return max
|
|
||||||
for (i in 1..lastIndex) {
|
for (i in 1..lastIndex) {
|
||||||
val e = this[i]
|
val e = this[i]
|
||||||
if (e.isNaN()) return e
|
max = maxOf(max, e)
|
||||||
if (max < e) max = e
|
|
||||||
}
|
}
|
||||||
return max
|
return max
|
||||||
}
|
}
|
||||||
@@ -13184,11 +13180,9 @@ public fun LongArray.max(): Long? {
|
|||||||
public fun FloatArray.max(): Float? {
|
public fun FloatArray.max(): Float? {
|
||||||
if (isEmpty()) return null
|
if (isEmpty()) return null
|
||||||
var max = this[0]
|
var max = this[0]
|
||||||
if (max.isNaN()) return max
|
|
||||||
for (i in 1..lastIndex) {
|
for (i in 1..lastIndex) {
|
||||||
val e = this[i]
|
val e = this[i]
|
||||||
if (e.isNaN()) return e
|
max = maxOf(max, e)
|
||||||
if (max < e) max = e
|
|
||||||
}
|
}
|
||||||
return max
|
return max
|
||||||
}
|
}
|
||||||
@@ -13201,11 +13195,9 @@ public fun FloatArray.max(): Float? {
|
|||||||
public fun DoubleArray.max(): Double? {
|
public fun DoubleArray.max(): Double? {
|
||||||
if (isEmpty()) return null
|
if (isEmpty()) return null
|
||||||
var max = this[0]
|
var max = this[0]
|
||||||
if (max.isNaN()) return max
|
|
||||||
for (i in 1..lastIndex) {
|
for (i in 1..lastIndex) {
|
||||||
val e = this[i]
|
val e = this[i]
|
||||||
if (e.isNaN()) return e
|
max = maxOf(max, e)
|
||||||
if (max < e) max = e
|
|
||||||
}
|
}
|
||||||
return max
|
return max
|
||||||
}
|
}
|
||||||
@@ -15059,11 +15051,9 @@ public fun CharArray.maxWith(comparator: Comparator<in Char>): Char? {
|
|||||||
public fun Array<out Double>.min(): Double? {
|
public fun Array<out Double>.min(): Double? {
|
||||||
if (isEmpty()) return null
|
if (isEmpty()) return null
|
||||||
var min = this[0]
|
var min = this[0]
|
||||||
if (min.isNaN()) return min
|
|
||||||
for (i in 1..lastIndex) {
|
for (i in 1..lastIndex) {
|
||||||
val e = this[i]
|
val e = this[i]
|
||||||
if (e.isNaN()) return e
|
min = minOf(min, e)
|
||||||
if (min > e) min = e
|
|
||||||
}
|
}
|
||||||
return min
|
return min
|
||||||
}
|
}
|
||||||
@@ -15077,11 +15067,9 @@ public fun Array<out Double>.min(): Double? {
|
|||||||
public fun Array<out Float>.min(): Float? {
|
public fun Array<out Float>.min(): Float? {
|
||||||
if (isEmpty()) return null
|
if (isEmpty()) return null
|
||||||
var min = this[0]
|
var min = this[0]
|
||||||
if (min.isNaN()) return min
|
|
||||||
for (i in 1..lastIndex) {
|
for (i in 1..lastIndex) {
|
||||||
val e = this[i]
|
val e = this[i]
|
||||||
if (e.isNaN()) return e
|
min = minOf(min, e)
|
||||||
if (min > e) min = e
|
|
||||||
}
|
}
|
||||||
return min
|
return min
|
||||||
}
|
}
|
||||||
@@ -15159,11 +15147,9 @@ public fun LongArray.min(): Long? {
|
|||||||
public fun FloatArray.min(): Float? {
|
public fun FloatArray.min(): Float? {
|
||||||
if (isEmpty()) return null
|
if (isEmpty()) return null
|
||||||
var min = this[0]
|
var min = this[0]
|
||||||
if (min.isNaN()) return min
|
|
||||||
for (i in 1..lastIndex) {
|
for (i in 1..lastIndex) {
|
||||||
val e = this[i]
|
val e = this[i]
|
||||||
if (e.isNaN()) return e
|
min = minOf(min, e)
|
||||||
if (min > e) min = e
|
|
||||||
}
|
}
|
||||||
return min
|
return min
|
||||||
}
|
}
|
||||||
@@ -15176,11 +15162,9 @@ public fun FloatArray.min(): Float? {
|
|||||||
public fun DoubleArray.min(): Double? {
|
public fun DoubleArray.min(): Double? {
|
||||||
if (isEmpty()) return null
|
if (isEmpty()) return null
|
||||||
var min = this[0]
|
var min = this[0]
|
||||||
if (min.isNaN()) return min
|
|
||||||
for (i in 1..lastIndex) {
|
for (i in 1..lastIndex) {
|
||||||
val e = this[i]
|
val e = this[i]
|
||||||
if (e.isNaN()) return e
|
min = minOf(min, e)
|
||||||
if (min > e) min = e
|
|
||||||
}
|
}
|
||||||
return min
|
return min
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1729,11 +1729,9 @@ public fun Iterable<Double>.max(): Double? {
|
|||||||
val iterator = iterator()
|
val iterator = iterator()
|
||||||
if (!iterator.hasNext()) return null
|
if (!iterator.hasNext()) return null
|
||||||
var max = iterator.next()
|
var max = iterator.next()
|
||||||
if (max.isNaN()) return max
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
val e = iterator.next()
|
val e = iterator.next()
|
||||||
if (e.isNaN()) return e
|
max = maxOf(max, e)
|
||||||
if (max < e) max = e
|
|
||||||
}
|
}
|
||||||
return max
|
return max
|
||||||
}
|
}
|
||||||
@@ -1748,11 +1746,9 @@ public fun Iterable<Float>.max(): Float? {
|
|||||||
val iterator = iterator()
|
val iterator = iterator()
|
||||||
if (!iterator.hasNext()) return null
|
if (!iterator.hasNext()) return null
|
||||||
var max = iterator.next()
|
var max = iterator.next()
|
||||||
if (max.isNaN()) return max
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
val e = iterator.next()
|
val e = iterator.next()
|
||||||
if (e.isNaN()) return e
|
max = maxOf(max, e)
|
||||||
if (max < e) max = e
|
|
||||||
}
|
}
|
||||||
return max
|
return max
|
||||||
}
|
}
|
||||||
@@ -1993,11 +1989,9 @@ public fun Iterable<Double>.min(): Double? {
|
|||||||
val iterator = iterator()
|
val iterator = iterator()
|
||||||
if (!iterator.hasNext()) return null
|
if (!iterator.hasNext()) return null
|
||||||
var min = iterator.next()
|
var min = iterator.next()
|
||||||
if (min.isNaN()) return min
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
val e = iterator.next()
|
val e = iterator.next()
|
||||||
if (e.isNaN()) return e
|
min = minOf(min, e)
|
||||||
if (min > e) min = e
|
|
||||||
}
|
}
|
||||||
return min
|
return min
|
||||||
}
|
}
|
||||||
@@ -2012,11 +2006,9 @@ public fun Iterable<Float>.min(): Float? {
|
|||||||
val iterator = iterator()
|
val iterator = iterator()
|
||||||
if (!iterator.hasNext()) return null
|
if (!iterator.hasNext()) return null
|
||||||
var min = iterator.next()
|
var min = iterator.next()
|
||||||
if (min.isNaN()) return min
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
val e = iterator.next()
|
val e = iterator.next()
|
||||||
if (e.isNaN()) return e
|
min = minOf(min, e)
|
||||||
if (min > e) min = e
|
|
||||||
}
|
}
|
||||||
return min
|
return min
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1178,11 +1178,9 @@ public fun Sequence<Double>.max(): Double? {
|
|||||||
val iterator = iterator()
|
val iterator = iterator()
|
||||||
if (!iterator.hasNext()) return null
|
if (!iterator.hasNext()) return null
|
||||||
var max = iterator.next()
|
var max = iterator.next()
|
||||||
if (max.isNaN()) return max
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
val e = iterator.next()
|
val e = iterator.next()
|
||||||
if (e.isNaN()) return e
|
max = maxOf(max, e)
|
||||||
if (max < e) max = e
|
|
||||||
}
|
}
|
||||||
return max
|
return max
|
||||||
}
|
}
|
||||||
@@ -1199,11 +1197,9 @@ public fun Sequence<Float>.max(): Float? {
|
|||||||
val iterator = iterator()
|
val iterator = iterator()
|
||||||
if (!iterator.hasNext()) return null
|
if (!iterator.hasNext()) return null
|
||||||
var max = iterator.next()
|
var max = iterator.next()
|
||||||
if (max.isNaN()) return max
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
val e = iterator.next()
|
val e = iterator.next()
|
||||||
if (e.isNaN()) return e
|
max = maxOf(max, e)
|
||||||
if (max < e) max = e
|
|
||||||
}
|
}
|
||||||
return max
|
return max
|
||||||
}
|
}
|
||||||
@@ -1468,11 +1464,9 @@ public fun Sequence<Double>.min(): Double? {
|
|||||||
val iterator = iterator()
|
val iterator = iterator()
|
||||||
if (!iterator.hasNext()) return null
|
if (!iterator.hasNext()) return null
|
||||||
var min = iterator.next()
|
var min = iterator.next()
|
||||||
if (min.isNaN()) return min
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
val e = iterator.next()
|
val e = iterator.next()
|
||||||
if (e.isNaN()) return e
|
min = minOf(min, e)
|
||||||
if (min > e) min = e
|
|
||||||
}
|
}
|
||||||
return min
|
return min
|
||||||
}
|
}
|
||||||
@@ -1489,11 +1483,9 @@ public fun Sequence<Float>.min(): Float? {
|
|||||||
val iterator = iterator()
|
val iterator = iterator()
|
||||||
if (!iterator.hasNext()) return null
|
if (!iterator.hasNext()) return null
|
||||||
var min = iterator.next()
|
var min = iterator.next()
|
||||||
if (min.isNaN()) return min
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
val e = iterator.next()
|
val e = iterator.next()
|
||||||
if (e.isNaN()) return e
|
min = minOf(min, e)
|
||||||
if (min > e) min = e
|
|
||||||
}
|
}
|
||||||
return min
|
return min
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -832,6 +832,9 @@ class CollectionTest {
|
|||||||
expect("a", { listOf("a", "b").min() })
|
expect("a", { listOf("a", "b").min() })
|
||||||
expect(null, { listOf<Int>().asSequence().min() })
|
expect(null, { listOf<Int>().asSequence().min() })
|
||||||
expect(2, { listOf(2, 3).asSequence().min() })
|
expect(2, { listOf(2, 3).asSequence().min() })
|
||||||
|
|
||||||
|
assertIsNegativeZero(listOf(0.0, -0.0).shuffled().min()!!)
|
||||||
|
assertIsNegativeZero(listOf(0.0F, -0.0F).shuffled().min()!!.toDouble())
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test fun max() {
|
@Test fun max() {
|
||||||
@@ -843,6 +846,9 @@ class CollectionTest {
|
|||||||
expect("b", { listOf("a", "b").max() })
|
expect("b", { listOf("a", "b").max() })
|
||||||
expect(null, { listOf<Int>().asSequence().max() })
|
expect(null, { listOf<Int>().asSequence().max() })
|
||||||
expect(3, { listOf(2, 3).asSequence().max() })
|
expect(3, { listOf(2, 3).asSequence().max() })
|
||||||
|
|
||||||
|
assertIsPositiveZero(listOf(0.0, -0.0).shuffled().max()!!)
|
||||||
|
assertIsPositiveZero(listOf(0.0F, -0.0F).shuffled().max()!!.toDouble())
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test fun minWith() {
|
@Test fun minWith() {
|
||||||
|
|||||||
@@ -329,38 +329,34 @@ object Aggregates : TemplateGroupBase() {
|
|||||||
}
|
}
|
||||||
returns("T?")
|
returns("T?")
|
||||||
|
|
||||||
|
val acc = op
|
||||||
|
val cmpBlock = if (isFloat)
|
||||||
|
"""$acc = ${op}Of($acc, e)"""
|
||||||
|
else
|
||||||
|
"""if ($acc ${if (op == "max") "<" else ">"} e) $acc = e"""
|
||||||
body {
|
body {
|
||||||
"""
|
"""
|
||||||
val iterator = iterator()
|
val iterator = iterator()
|
||||||
if (!iterator.hasNext()) return null
|
if (!iterator.hasNext()) return null
|
||||||
var $op = iterator.next()
|
var $acc = iterator.next()
|
||||||
${if (isFloat) "if ($op.isNaN()) return $op" else "\\"}
|
|
||||||
|
|
||||||
while (iterator.hasNext()) {
|
while (iterator.hasNext()) {
|
||||||
val e = iterator.next()
|
val e = iterator.next()
|
||||||
${if (isFloat) "if (e.isNaN()) return e" else "\\"}
|
$cmpBlock
|
||||||
if ($op ${if (op == "max") "<" else ">"} e) $op = e
|
|
||||||
}
|
}
|
||||||
return $op
|
return $acc
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
body(ArraysOfObjects, ArraysOfPrimitives, CharSequences, ArraysOfUnsigned) {
|
body(ArraysOfObjects, ArraysOfPrimitives, CharSequences, ArraysOfUnsigned) {
|
||||||
"""
|
"""
|
||||||
if (isEmpty()) return null
|
if (isEmpty()) return null
|
||||||
var $op = this[0]
|
var $acc = this[0]
|
||||||
${if (isFloat) "if ($op.isNaN()) return $op" else "\\"}
|
|
||||||
|
|
||||||
for (i in 1..lastIndex) {
|
for (i in 1..lastIndex) {
|
||||||
val e = this[i]
|
val e = this[i]
|
||||||
${if (isFloat) "if (e.isNaN()) return e" else "\\"}
|
$cmpBlock
|
||||||
if ($op ${if (op == "max") "<" else ">"} e) $op = e
|
|
||||||
}
|
}
|
||||||
return $op
|
return $acc
|
||||||
"""
|
"""
|
||||||
}
|
}
|
||||||
body {
|
|
||||||
body!!.replace(Regex("""^\s+\\\n""", RegexOption.MULTILINE), "") // remove empty lines ending with \
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user