Commonize Float.rangeTo(Float) #KT-35299
This commit is contained in:
@@ -1,11 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* 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.ranges
|
|
||||||
|
|
||||||
@SinceKotlin("1.1")
|
|
||||||
@kotlin.internal.InlineOnly
|
|
||||||
public inline operator fun Float.rangeTo(that: Float): ClosedFloatingPointRange<Float> =
|
|
||||||
this.toDouble().rangeTo(that.toDouble()).unsafeCast<ClosedFloatingPointRange<Float>>()
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors.
|
|
||||||
* 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("RangesKt")
|
|
||||||
|
|
||||||
package kotlin.ranges
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A closed range of values of type `Float`.
|
|
||||||
*
|
|
||||||
* Numbers are compared with the ends of this range according to IEEE-754.
|
|
||||||
*/
|
|
||||||
private class ClosedFloatRange(
|
|
||||||
start: Float,
|
|
||||||
endInclusive: Float
|
|
||||||
) : ClosedFloatingPointRange<Float> {
|
|
||||||
private val _start = start
|
|
||||||
private val _endInclusive = endInclusive
|
|
||||||
override val start: Float get() = _start
|
|
||||||
override val endInclusive: Float get() = _endInclusive
|
|
||||||
|
|
||||||
override fun lessThanOrEquals(a: Float, b: Float): Boolean = a <= b
|
|
||||||
|
|
||||||
override fun contains(value: Float): Boolean = value >= _start && value <= _endInclusive
|
|
||||||
override fun isEmpty(): Boolean = !(_start <= _endInclusive)
|
|
||||||
|
|
||||||
override fun equals(other: Any?): Boolean {
|
|
||||||
return other is ClosedFloatRange && (isEmpty() && other.isEmpty() ||
|
|
||||||
_start == other._start && _endInclusive == other._endInclusive)
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun hashCode(): Int {
|
|
||||||
return if (isEmpty()) -1 else 31 * _start.hashCode() + _endInclusive.hashCode()
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun toString(): String = "$_start..$_endInclusive"
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a range from this [Float] value to the specified [that] value.
|
|
||||||
*
|
|
||||||
* Numbers are compared with the ends of this range according to IEEE-754.
|
|
||||||
* @sample samples.ranges.Ranges.rangeFromFloat
|
|
||||||
*/
|
|
||||||
@SinceKotlin("1.1")
|
|
||||||
public operator fun Float.rangeTo(that: Float): ClosedFloatingPointRange<Float> = ClosedFloatRange(this, that)
|
|
||||||
|
|
||||||
@@ -8,24 +8,6 @@
|
|||||||
|
|
||||||
package kotlin.ranges
|
package kotlin.ranges
|
||||||
|
|
||||||
/**
|
|
||||||
* Represents a range of floating point numbers.
|
|
||||||
* Extends [ClosedRange] interface providing custom operation [lessThanOrEquals] for comparing values of range domain type.
|
|
||||||
*
|
|
||||||
* This interface is implemented by floating point ranges returned by [Float.rangeTo] and [Double.rangeTo] operators to
|
|
||||||
* achieve IEEE-754 comparison order instead of total order of floating point numbers.
|
|
||||||
*/
|
|
||||||
@SinceKotlin("1.1")
|
|
||||||
public interface ClosedFloatingPointRange<T : Comparable<T>> : ClosedRange<T> {
|
|
||||||
override fun contains(value: T): Boolean = lessThanOrEquals(start, value) && lessThanOrEquals(value, endInclusive)
|
|
||||||
override fun isEmpty(): Boolean = !lessThanOrEquals(start, endInclusive)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Compares two values of range domain type and returns true if first is less than or equal to second.
|
|
||||||
*/
|
|
||||||
fun lessThanOrEquals(a: T, b: T): Boolean
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a range of [Comparable] values.
|
* Represents a range of [Comparable] values.
|
||||||
*/
|
*/
|
||||||
@@ -46,6 +28,34 @@ private open class ComparableRange<T : Comparable<T>>(
|
|||||||
override fun toString(): String = "$start..$endInclusive"
|
override fun toString(): String = "$start..$endInclusive"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a range from this [Comparable] value to the specified [that] value.
|
||||||
|
*
|
||||||
|
* This value needs to be smaller than [that] value, otherwise the returned range will be empty.
|
||||||
|
* @sample samples.ranges.Ranges.rangeFromComparable
|
||||||
|
*/
|
||||||
|
public operator fun <T : Comparable<T>> T.rangeTo(that: T): ClosedRange<T> = ComparableRange(this, that)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Represents a range of floating point numbers.
|
||||||
|
* Extends [ClosedRange] interface providing custom operation [lessThanOrEquals] for comparing values of range domain type.
|
||||||
|
*
|
||||||
|
* This interface is implemented by floating point ranges returned by [Float.rangeTo] and [Double.rangeTo] operators to
|
||||||
|
* achieve IEEE-754 comparison order instead of total order of floating point numbers.
|
||||||
|
*/
|
||||||
|
@SinceKotlin("1.1")
|
||||||
|
public interface ClosedFloatingPointRange<T : Comparable<T>> : ClosedRange<T> {
|
||||||
|
override fun contains(value: T): Boolean = lessThanOrEquals(start, value) && lessThanOrEquals(value, endInclusive)
|
||||||
|
override fun isEmpty(): Boolean = !lessThanOrEquals(start, endInclusive)
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Compares two values of range domain type and returns true if first is less than or equal to second.
|
||||||
|
*/
|
||||||
|
fun lessThanOrEquals(a: T, b: T): Boolean
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A closed range of values of type `Double`.
|
* A closed range of values of type `Double`.
|
||||||
*
|
*
|
||||||
@@ -77,15 +87,6 @@ private class ClosedDoubleRange(
|
|||||||
override fun toString(): String = "$_start..$_endInclusive"
|
override fun toString(): String = "$_start..$_endInclusive"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a range from this [Comparable] value to the specified [that] value.
|
|
||||||
*
|
|
||||||
* This value needs to be smaller than [that] value, otherwise the returned range will be empty.
|
|
||||||
* @sample samples.ranges.Ranges.rangeFromComparable
|
|
||||||
*/
|
|
||||||
public operator fun <T : Comparable<T>> T.rangeTo(that: T): ClosedRange<T> = ComparableRange(this, that)
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a range from this [Double] value to the specified [that] value.
|
* Creates a range from this [Double] value to the specified [that] value.
|
||||||
*
|
*
|
||||||
@@ -96,6 +97,47 @@ public operator fun <T : Comparable<T>> T.rangeTo(that: T): ClosedRange<T> = Com
|
|||||||
public operator fun Double.rangeTo(that: Double): ClosedFloatingPointRange<Double> = ClosedDoubleRange(this, that)
|
public operator fun Double.rangeTo(that: Double): ClosedFloatingPointRange<Double> = ClosedDoubleRange(this, that)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A closed range of values of type `Float`.
|
||||||
|
*
|
||||||
|
* Numbers are compared with the ends of this range according to IEEE-754.
|
||||||
|
*/
|
||||||
|
private class ClosedFloatRange(
|
||||||
|
start: Float,
|
||||||
|
endInclusive: Float
|
||||||
|
) : ClosedFloatingPointRange<Float> {
|
||||||
|
private val _start = start
|
||||||
|
private val _endInclusive = endInclusive
|
||||||
|
override val start: Float get() = _start
|
||||||
|
override val endInclusive: Float get() = _endInclusive
|
||||||
|
|
||||||
|
override fun lessThanOrEquals(a: Float, b: Float): Boolean = a <= b
|
||||||
|
|
||||||
|
override fun contains(value: Float): Boolean = value >= _start && value <= _endInclusive
|
||||||
|
override fun isEmpty(): Boolean = !(_start <= _endInclusive)
|
||||||
|
|
||||||
|
override fun equals(other: Any?): Boolean {
|
||||||
|
return other is ClosedFloatRange && (isEmpty() && other.isEmpty() ||
|
||||||
|
_start == other._start && _endInclusive == other._endInclusive)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun hashCode(): Int {
|
||||||
|
return if (isEmpty()) -1 else 31 * _start.hashCode() + _endInclusive.hashCode()
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun toString(): String = "$_start..$_endInclusive"
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a range from this [Float] value to the specified [that] value.
|
||||||
|
*
|
||||||
|
* Numbers are compared with the ends of this range according to IEEE-754.
|
||||||
|
* @sample samples.ranges.Ranges.rangeFromFloat
|
||||||
|
*/
|
||||||
|
@SinceKotlin("1.1")
|
||||||
|
public operator fun Float.rangeTo(that: Float): ClosedFloatingPointRange<Float> = ClosedFloatRange(this, that)
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns `true` if this iterable range contains the specified [element].
|
* Returns `true` if this iterable range contains the specified [element].
|
||||||
*
|
*
|
||||||
|
|||||||
Reference in New Issue
Block a user