blob: e1738de723f46d94459d7bdd9fa0f809b2591292 [file] [log] [blame]
/*
* Copyright 2010-2021 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:Suppress("NOTHING_TO_INLINE")
package kotlin
/**
* Represents a 64-bit signed integer.
*/
public class Long internal constructor(
internal val low: Int,
internal val high: Int
) : Number(), Comparable<Long> {
companion object {
/**
* A constant holding the minimum value an instance of Long can have.
*/
public const val MIN_VALUE: Long = -9223372036854775807L - 1L
/**
* A constant holding the maximum value an instance of Long can have.
*/
public const val MAX_VALUE: Long = 9223372036854775807L
/**
* The number of bytes used to represent an instance of Long in a binary form.
*/
@SinceKotlin("1.3")
public const val SIZE_BYTES: Int = 8
/**
* The number of bits used to represent an instance of Long in a binary form.
*/
@SinceKotlin("1.3")
public const val SIZE_BITS: Int = 64
}
/**
* Compares this value with the specified value for order.
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
* or a positive number if it's greater than other.
*/
public inline operator fun compareTo(other: Byte): Int = compareTo(other.toLong())
/**
* Compares this value with the specified value for order.
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
* or a positive number if it's greater than other.
*/
public inline operator fun compareTo(other: Short): Int = compareTo(other.toLong())
/**
* Compares this value with the specified value for order.
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
* or a positive number if it's greater than other.
*/
public inline operator fun compareTo(other: Int): Int = compareTo(other.toLong())
/**
* Compares this value with the specified value for order.
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
* or a positive number if it's greater than other.
*/
public override operator fun compareTo(other: Long): Int = compare(other)
/**
* Compares this value with the specified value for order.
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
* or a positive number if it's greater than other.
*/
public inline operator fun compareTo(other: Float): Int = toFloat().compareTo(other)
/**
* Compares this value with the specified value for order.
* Returns zero if this value is equal to the specified other value, a negative number if it's less than other,
* or a positive number if it's greater than other.
*/
public inline operator fun compareTo(other: Double): Int = toDouble().compareTo(other)
/** Adds the other value to this value. */
public inline operator fun plus(other: Byte): Long = plus(other.toLong())
/** Adds the other value to this value. */
public inline operator fun plus(other: Short): Long = plus(other.toLong())
/** Adds the other value to this value. */
public inline operator fun plus(other: Int): Long = plus(other.toLong())
/** Adds the other value to this value. */
public operator fun plus(other: Long): Long = add(other)
/** Adds the other value to this value. */
public inline operator fun plus(other: Float): Float = toFloat() + other
/** Adds the other value to this value. */
public inline operator fun plus(other: Double): Double = toDouble() + other
/** Subtracts the other value from this value. */
public inline operator fun minus(other: Byte): Long = minus(other.toLong())
/** Subtracts the other value from this value. */
public inline operator fun minus(other: Short): Long = minus(other.toLong())
/** Subtracts the other value from this value. */
public inline operator fun minus(other: Int): Long = minus(other.toLong())
/** Subtracts the other value from this value. */
public operator fun minus(other: Long): Long = subtract(other)
/** Subtracts the other value from this value. */
public inline operator fun minus(other: Float): Float = toFloat() - other
/** Subtracts the other value from this value. */
public inline operator fun minus(other: Double): Double = toDouble() - other
/** Multiplies this value by the other value. */
public inline operator fun times(other: Byte): Long = times(other.toLong())
/** Multiplies this value by the other value. */
public inline operator fun times(other: Short): Long = times(other.toLong())
/** Multiplies this value by the other value. */
public inline operator fun times(other: Int): Long = times(other.toLong())
/** Multiplies this value by the other value. */
public operator fun times(other: Long): Long = multiply(other)
/** Multiplies this value by the other value. */
public inline operator fun times(other: Float): Float = toFloat() * other
/** Multiplies this value by the other value. */
public inline operator fun times(other: Double): Double = toDouble() * other
/** Divides this value by the other value, truncating the result to an integer that is closer to zero. */
public inline operator fun div(other: Byte): Long = div(other.toLong())
/** Divides this value by the other value, truncating the result to an integer that is closer to zero. */
public inline operator fun div(other: Short): Long = div(other.toLong())
/** Divides this value by the other value, truncating the result to an integer that is closer to zero. */
public inline operator fun div(other: Int): Long = div(other.toLong())
/** Divides this value by the other value, truncating the result to an integer that is closer to zero. */
public operator fun div(other: Long): Long = divide(other)
/** Divides this value by the other value. */
public inline operator fun div(other: Float): Float = toFloat() / other
/** Divides this value by the other value. */
public inline operator fun div(other: Double): Double = toDouble() / other
/**
* Calculates the remainder of truncating division of this value by the other value.
*
* The result is either zero or has the same sign as the _dividend_ and has the absolute value less than the absolute value of the divisor.
*/
@SinceKotlin("1.1")
public inline operator fun rem(other: Byte): Long = rem(other.toLong())
/**
* Calculates the remainder of truncating division of this value by the other value.
*
* The result is either zero or has the same sign as the _dividend_ and has the absolute value less than the absolute value of the divisor.
*/
@SinceKotlin("1.1")
public inline operator fun rem(other: Short): Long = rem(other.toLong())
/**
* Calculates the remainder of truncating division of this value by the other value.
*
* The result is either zero or has the same sign as the _dividend_ and has the absolute value less than the absolute value of the divisor.
*/
@SinceKotlin("1.1")
public inline operator fun rem(other: Int): Long = rem(other.toLong())
/**
* Calculates the remainder of truncating division of this value by the other value.
*
* The result is either zero or has the same sign as the _dividend_ and has the absolute value less than the absolute value of the divisor.
*/
@SinceKotlin("1.1")
public operator fun rem(other: Long): Long = modulo(other)
/**
* Calculates the remainder of truncating division of this value by the other value.
*
* The result is either zero or has the same sign as the _dividend_ and has the absolute value less than the absolute value of the divisor.
*/
@SinceKotlin("1.1")
public inline operator fun rem(other: Float): Float = toFloat() % other
/**
* Calculates the remainder of truncating division of this value by the other value.
*
* The result is either zero or has the same sign as the _dividend_ and has the absolute value less than the absolute value of the divisor.
*/
@SinceKotlin("1.1")
public inline operator fun rem(other: Double): Double = toDouble() % other
/**
* Returns this value incremented by one.
*
* @sample samples.misc.Builtins.inc
*/
public operator fun inc(): Long = this + 1L
/**
* Returns this value decremented by one.
*
* @sample samples.misc.Builtins.dec
*/
public operator fun dec(): Long = this - 1L
/** Returns this value. */
public inline operator fun unaryPlus(): Long = this
/** Returns the negative of this value. */
public operator fun unaryMinus(): Long = inv() + 1L
/** Creates a range from this value to the specified [other] value. */
public operator fun rangeTo(other: Byte): LongRange = rangeTo(other.toLong())
/** Creates a range from this value to the specified [other] value. */
public operator fun rangeTo(other: Short): LongRange = rangeTo(other.toLong())
/** Creates a range from this value to the specified [other] value. */
public operator fun rangeTo(other: Int): LongRange = rangeTo(other.toLong())
/** Creates a range from this value to the specified [other] value. */
public operator fun rangeTo(other: Long): LongRange = LongRange(this, other)
/**
* Shifts this value left by the [bitCount] number of bits.
*
* Note that only the six lowest-order bits of the [bitCount] are used as the shift distance.
* The shift distance actually used is therefore always in the range `0..63`.
*/
public infix fun shl(bitCount: Int): Long = shiftLeft(bitCount)
/**
* Shifts this value right by the [bitCount] number of bits, filling the leftmost bits with copies of the sign bit.
*
* Note that only the six lowest-order bits of the [bitCount] are used as the shift distance.
* The shift distance actually used is therefore always in the range `0..63`.
*/
public infix fun shr(bitCount: Int): Long = shiftRight(bitCount)
/**
* Shifts this value right by the [bitCount] number of bits, filling the leftmost bits with zeros.
*
* Note that only the six lowest-order bits of the [bitCount] are used as the shift distance.
* The shift distance actually used is therefore always in the range `0..63`.
*/
public infix fun ushr(bitCount: Int): Long = shiftRightUnsigned(bitCount)
/** Performs a bitwise AND operation between the two values. */
public infix fun and(other: Long): Long = Long(low and other.low, high and other.high)
/** Performs a bitwise OR operation between the two values. */
public infix fun or(other: Long): Long = Long(low or other.low, high or other.high)
/** Performs a bitwise XOR operation between the two values. */
public infix fun xor(other: Long): Long = Long(low xor other.low, high xor other.high)
/** Inverts the bits in this value. */
public fun inv(): Long = Long(low.inv(), high.inv())
public override fun toByte(): Byte = low.toByte()
@Deprecated("Direct conversion to Char is deprecated. Use toInt().toChar() or Char constructor instead.", ReplaceWith("this.toInt().toChar()"))
@DeprecatedSinceKotlin(warningSince = "1.5")
public override fun toChar(): Char = low.toChar()
public override fun toShort(): Short = low.toShort()
public override fun toInt(): Int = low
public override fun toLong(): Long = this
public override fun toFloat(): Float = toDouble().toFloat()
public override fun toDouble(): Double = toNumber()
// This method is used by `toString()`
@JsName("valueOf")
internal fun valueOf() = toDouble()
override fun equals(other: Any?): Boolean = other is Long && equalsLong(other)
override fun hashCode(): Int = hashCode(this)
override fun toString(): String = this.toStringImpl(radix = 10)
}