Int variables

This commit is contained in:
Andrew Golovashevich 2024-11-10 20:59:28 +03:00
parent 7307ffb322
commit 4db4a3f667
2 changed files with 287 additions and 20 deletions

View File

@ -106,6 +106,147 @@ public inline fun Int.extendToLong(): Long = this.toLong()
@JvmName("extendToULong")
public inline fun UInt.extendToULong(): ULong = this.toULong()
/******************** force trims *******************************/
/**
* Converts this [Short] value to [Byte].
*
* If this value is in [Byte.MIN_VALUE]..[Byte.MAX_VALUE], the resulting [Byte] value represents
* the same numerical value as this [Short].
*
* The resulting [Byte] value is represented by the least significant 8 bits of this [Short] value.
*/
@JvmName("trimToByte")
public inline fun Short.trimToByte(): Byte = this.toByte()
/**
* Converts this [UShort] value to [UByte].
*
* If this value is in 0..[UByte.MAX_VALUE], the resulting [UByte] value represents
* the same numerical value as this [UShort].
*
* The resulting [UByte] value is represented by the least significant 8 bits of this [UShort] value.
*/
@JvmName("trimToUByte")
public inline fun UShort.trimToUByte(): UByte = this.toUByte()
/**
* Converts this [Int] value to [Byte].
*
* If this value is in [Byte.MIN_VALUE]..[Byte.MAX_VALUE], the resulting [Byte] value represents
* the same numerical value as this [Int].
*
* The resulting [Byte] value is represented by the least significant 8 bits of this [Int] value.
*/
@JvmName("trimToByte")
public inline fun Int.trimToByte(): Byte = this.toByte()
/**
* Converts this [Int] value to [Short].
*
* If this value is in [Short.MIN_VALUE]..[Short.MAX_VALUE], the resulting [Short] value represents
* the same numerical value as this [Int].
*
* The resulting [Short] value is represented by the least significant 16 bits of this [Int] value.
*/
@JvmName("trimToShort")
public inline fun Int.trimToShort(): Short = this.toShort()
/**
* Converts this [UInt] value to [UByte].
*
* If this value is in 0..[UByte.MAX_VALUE], the resulting [UByte] value represents
* the same numerical value as this [UInt].
*
* The resulting [UByte] value is represented by the least significant 8 bits of this [UInt] value.
*/
@JvmName("trimToUByte")
public inline fun UInt.trimToUByte(): UByte = this.toUByte()
/**
* Converts this [Int] value to [Short].
*
* If this value is in 0..[UShort.MAX_VALUE], the resulting [Short] value represents
* the same numerical value as this [Int].
*
* The resulting [UShort] value is represented by the least significant 16 bits of this [UInt] value.
*/
@JvmName("trimToUShort")
public inline fun UInt.trimToUShort(): UShort = this.toUShort()
/**
* Converts this [Long] value to [Byte].
*
* If this value is in [Byte.MIN_VALUE]..[Byte.MAX_VALUE], the resulting [Byte] value represents
* the same numerical value as this [Long].
*
* The resulting [Byte] value is represented by the least significant 8 bits of this [Long] value.
*/
@JvmName("trimToByte")
public inline fun Long.trimToByte(): Byte = this.toByte()
/**
* Converts this [Long] value to [Short].
*
* If this value is in [Short.MIN_VALUE]..[Short.MAX_VALUE], the resulting [Short] value represents
* the same numerical value as this [Long].
*
* The resulting [Short] value is represented by the least significant 16 bits of this [Long] value.
*/
@JvmName("trimToShort")
public inline fun Long.trimToShort(): Short = this.toShort()
/**
* Converts this [Long] value to [Int].
*
* If this value is in [Int.MIN_VALUE]..[Int.MAX_VALUE], the resulting [Int] value represents
* the same numerical value as this [Long].
*
* The resulting [Int] value is represented by the least significant 32 bits of this [Long] value.
*/
@JvmName("trimToInt")
public inline fun Long.trimToInt(): Int = this.toInt()
/**
* Converts this [ULong] value to [UByte].
*
* If this value is in 0..[UByte.MAX_VALUE], the resulting [UByte] value represents
* the same numerical value as this [ULong].
*
* The resulting [UByte] value is represented by the least significant 8 bits of this [ULong] value.
*/
@JvmName("trimToUByte")
public inline fun ULong.trimToUByte(): UByte =this.toUByte()
/**
* Converts this [ULong] value to [UShort].
*
* If this value is in 0..[UShort.MAX_VALUE], the resulting [UShort] value represents
* the same numerical value as this [ULong].
*
* The resulting [UShort] value is represented by the least significant 16 bits of this [ULong] value.
*/
@JvmName("trimToUShort")
public inline fun ULong.trimToUShort(): UShort = this.toUShort()
/**
* Converts this [ULong] value to [UInt].
*
* If this value is in 0..[UInt.MAX_VALUE], the resulting [UInt] value represents
* the same numerical value as this [ULong].
*
* The resulting [UInt] value is represented by the least significant 32 bits of this [ULong] value.
*/
@JvmName("trimToUInt")
public inline fun ULong.trimToUInt(): UInt = this.toUInt()
/******************************** trims (or null) ****************************/
@ -118,7 +259,7 @@ public inline fun UInt.extendToULong(): ULong = this.toULong()
* Otherwise `null` returned.
*/
@JvmName("toByteOrNull")
public inline fun Short.toByteOrNull(): Byte? = if (this in (Byte.MIN_VALUE.extendToShort())..(Byte.MAX_VALUE.extendToShort())) this.toByte() else null
public inline fun Short.toByteOrNull(): Byte? = if (this in (Byte.MIN_VALUE.extendToShort())..(Byte.MAX_VALUE.extendToShort())) this.trimToByte() else null
/**
@ -129,7 +270,7 @@ public inline fun Short.toByteOrNull(): Byte? = if (this in (Byte.MIN_VALUE.exte
* Otherwise `null` returned.
*/
@JvmName("toUByteOrNull")
public inline fun UShort.toUByteOrNull(): UByte? = if (this <= UByte.MAX_VALUE.extendToUShort()) this.toUByte() else null
public inline fun UShort.toUByteOrNull(): UByte? = if (this <= UByte.MAX_VALUE.extendToUShort()) this.trimToUByte() else null
/**
@ -140,7 +281,7 @@ public inline fun UShort.toUByteOrNull(): UByte? = if (this <= UByte.MAX_VALUE.e
* Otherwise `null` returned.
*/
@JvmName("toByteOrNull")
public inline fun Int.toByteOrNull(): Byte? = if (this in (Byte.MIN_VALUE.extendToInt())..(Byte.MAX_VALUE.extendToInt())) this.toByte() else null
public inline fun Int.toByteOrNull(): Byte? = if (this in (Byte.MIN_VALUE.extendToInt())..(Byte.MAX_VALUE.extendToInt())) this.trimToByte() else null
/**
* Converts this [Int] value to [Short].
@ -150,28 +291,28 @@ public inline fun Int.toByteOrNull(): Byte? = if (this in (Byte.MIN_VALUE.extend
* Otherwise `null` returned.
*/
@JvmName("toShortOrNull")
public inline fun Int.toShortOrNull(): Short? = if (this in (Short.MIN_VALUE.extendToInt())..(Short.MAX_VALUE.extendToInt())) this.toShort() else null
public inline fun Int.toShortOrNull(): Short? = if (this in (Short.MIN_VALUE.extendToInt())..(Short.MAX_VALUE.extendToInt())) this.trimToShort() else null
/**
* Converts this [UInt] value to [UByte].
*
* If this value is in [UByte.MIN_VALUE]..[UByte.MAX_VALUE], the resulting [UByte] value represents
* If this value is in 0..[UByte.MAX_VALUE], the resulting [UByte] value represents
* the same numerical value as this [UInt].
* Otherwise `null` returned.
*/
@JvmName("toUByteOrNull")
public inline fun UInt.toUByteOrNull(): UByte? = if (this <= UByte.MAX_VALUE.extendToUInt()) this.toUByte() else null
public inline fun UInt.toUByteOrNull(): UByte? = if (this <= UByte.MAX_VALUE.extendToUInt()) this.trimToUByte() else null
/**
* Converts this [Int] value to [Short].
* Converts this [UInt] value to [Short].
*
* If this value is in [Short.MIN_VALUE]..[Short.MAX_VALUE], the resulting [Short] value represents
* the same numerical value as this [Int].
* If this value is in 0..[UShort.MAX_VALUE], the resulting [UShort] value represents
* the same numerical value as this [UInt].
* Otherwise `null` returned.
*/
@JvmName("toUShortOrNull")
public inline fun UInt.toUShortOrNull(): UShort? = if (this <= UShort.MAX_VALUE.extendToUInt()) this.toUShort() else null
public inline fun UInt.toUShortOrNull(): UShort? = if (this <= UShort.MAX_VALUE.extendToUInt()) this.trimToUShort() else null
/**
@ -182,7 +323,7 @@ public inline fun UInt.toUShortOrNull(): UShort? = if (this <= UShort.MAX_VALUE.
* Otherwise `null` returned.
*/
@JvmName("toByteOrNull")
public inline fun Long.toByteOrNull(): Byte? = if (this in (Byte.MIN_VALUE.extendToLong())..(Byte.MAX_VALUE.extendToLong())) this.toByte() else null
public inline fun Long.toByteOrNull(): Byte? = if (this in (Byte.MIN_VALUE.extendToLong())..(Byte.MAX_VALUE.extendToLong())) this.trimToByte() else null
/**
* Converts this [Long] value to [Short].
@ -192,50 +333,50 @@ public inline fun Long.toByteOrNull(): Byte? = if (this in (Byte.MIN_VALUE.exten
* Otherwise `null` returned.
*/
@JvmName("toShortOrNull")
public inline fun Long.toShortOrNull(): Short? = if (this in (Short.MIN_VALUE.extendToLong())..(Short.MAX_VALUE.extendToLong())) this.toShort() else null
public inline fun Long.toShortOrNull(): Short? = if (this in (Short.MIN_VALUE.extendToLong())..(Short.MAX_VALUE.extendToLong())) this.trimToShort() else null
/**
* Converts this [Long] value to [Int].
*
* If this value is in [Short.MIN_VALUE]..[Short.MAX_VALUE], the resulting [Int] value represents
* If this value is in [Int.MIN_VALUE]..[Int.MAX_VALUE], the resulting [Int] value represents
* the same numerical value as this [Long].
* Otherwise `null` returned.
*/
@JvmName("toIntOrNull")
public inline fun Long.toIntOrNull(): Int? = if (this in (Int.MIN_VALUE.extendToLong())..(Int.MAX_VALUE.extendToLong())) this.toInt() else null
public inline fun Long.toIntOrNull(): Int? = if (this in (Int.MIN_VALUE.extendToLong())..(Int.MAX_VALUE.extendToLong())) this.trimToInt() else null
/**
* Converts this [ULong] value to [UByte].
*
* If this value is in [UByte.MIN_VALUE]..[UByte.MAX_VALUE], the resulting [UByte] value represents
* If this value is in 0..[UByte.MAX_VALUE], the resulting [UByte] value represents
* the same numerical value as this [ULong].
* Otherwise `null` returned.
*/
@JvmName("toUByteOrNull")
public inline fun ULong.toUByteOrNull(): UByte? = if (this in (UByte.MIN_VALUE.extendToULong())..(UByte.MAX_VALUE.extendToULong())) this.toUByte() else null
public inline fun ULong.toUByteOrNull(): UByte? = if (this in (UByte.MIN_VALUE.extendToULong())..(UByte.MAX_VALUE.extendToULong())) this.trimToUByte() else null
/**
* Converts this [ULong] value to [UShort].
*
* If this value is in [UShort.MIN_VALUE]..[UShort.MAX_VALUE], the resulting [UShort] value represents
* If this value is in 0..[UShort.MAX_VALUE], the resulting [UShort] value represents
* the same numerical value as this [ULong].
* Otherwise `null` returned.
*/
@JvmName("toUShortOrNull")
public inline fun ULong.toUShortOrNull(): UShort? = if (this in (UShort.MIN_VALUE.extendToULong())..(UShort.MAX_VALUE.extendToULong())) this.toUShort() else null
public inline fun ULong.toUShortOrNull(): UShort? = if (this in (UShort.MIN_VALUE.extendToULong())..(UShort.MAX_VALUE.extendToULong())) this.trimToUShort() else null
/**
* Converts this [ULong] value to [UInt].
*
* If this value is in [UShort.MIN_VALUE]..[UShort.MAX_VALUE], the resulting [UInt] value represents
* If this value is in 0..[UInt.MAX_VALUE], the resulting [UInt] value represents
* the same numerical value as this [ULong].
* Otherwise `null` returned.
*/
@JvmName("toUIntOrNull")
public inline fun ULong.toUIntOrNull(): UInt? = if (this in (UInt.MIN_VALUE.extendToULong())..(UInt.MAX_VALUE.extendToULong())) this.toUInt() else null
public inline fun ULong.toUIntOrNull(): UInt? = if (this in (UInt.MIN_VALUE.extendToULong())..(UInt.MAX_VALUE.extendToULong())) this.trimToUInt() else null
/********************************************* Conversion error formatters ****************************************/

View File

@ -0,0 +1,126 @@
package ru.landrafhomyak.kotlin.utilities
import kotlin.jvm.JvmField
public class ByteVariable(
@Suppress("MemberVisibilityCanBePrivate")
@JvmField
public var value: Byte
) {
@Suppress("MemberVisibilityCanBePrivate")
public fun getAndSet(newValue: Byte): Byte {
val oldValue = this.value
this.value = newValue
return oldValue
}
public fun getAndAdd(d: Byte): Byte = this.getAndSet((this.value + d).trimToByte())
public fun getAndSub(d: Byte): Byte = this.getAndSet((this.value - d).trimToByte())
}
public class UByteVariable(
@Suppress("MemberVisibilityCanBePrivate")
public var value: UByte
) {
@Suppress("MemberVisibilityCanBePrivate")
public fun getAndSet(newValue: UByte): UByte {
val oldValue = this.value
this.value = newValue
return oldValue
}
public fun getAndAdd(d: UByte): UByte = this.getAndSet((this.value + d).trimToUByte())
public fun getAndSub(d: UByte): UByte = this.getAndSet((this.value - d).trimToUByte())
}
public class ShortVariable(
@Suppress("MemberVisibilityCanBePrivate")
@JvmField
public var value: Short
) {
@Suppress("MemberVisibilityCanBePrivate")
public fun getAndSet(newValue: Short): Short {
val oldValue = this.value
this.value = newValue
return oldValue
}
public fun getAndAdd(d: Short): Short = this.getAndSet((this.value + d).trimToShort())
public fun getAndSub(d: Short): Short = this.getAndSet((this.value - d).trimToShort())
}
public class UShortVariable(
@Suppress("MemberVisibilityCanBePrivate")
public var value: UShort
) {
@Suppress("MemberVisibilityCanBePrivate")
public fun getAndSet(newValue: UShort): UShort {
val oldValue = this.value
this.value = newValue
return oldValue
}
public fun getAndAdd(d: UShort): UShort = this.getAndSet((this.value + d).trimToUShort())
public fun getAndSub(d: UShort): UShort = this.getAndSet((this.value - d).trimToUShort())
}
public class IntVariable(
@Suppress("MemberVisibilityCanBePrivate")
@JvmField public var value: Int
) {
@Suppress("MemberVisibilityCanBePrivate")
public fun getAndSet(newValue: Int): Int {
val oldValue = this.value
this.value = newValue
return oldValue
}
public fun getAndAdd(d: Int): Int = this.getAndSet(this.value + d)
public fun getAndSub(d: Int): Int = this.getAndSet(this.value - d)
}
public class UIntVariable(
@Suppress("MemberVisibilityCanBePrivate")
public var value: UInt
) {
@Suppress("MemberVisibilityCanBePrivate")
public fun getAndSet(newValue: UInt): UInt {
val oldValue = this.value
this.value = newValue
return oldValue
}
public fun getAndAdd(d: UInt): UInt = this.getAndSet(this.value + d)
public fun getAndSub(d: UInt): UInt = this.getAndSet(this.value - d)
}
public class LongVariable(
@Suppress("MemberVisibilityCanBePrivate")
@JvmField
public var value: Long
) {
@Suppress("MemberVisibilityCanBePrivate")
public fun getAndSet(newValue: Long): Long {
val oldValue = this.value
this.value = newValue
return oldValue
}
public fun getAndAdd(d: Long): Long = this.getAndSet(this.value + d)
public fun getAndSub(d: Long): Long = this.getAndSet(this.value - d)
}
public class ULongVariable(
@Suppress("MemberVisibilityCanBePrivate")
public var value: ULong
) {
@Suppress("MemberVisibilityCanBePrivate")
public fun getAndSet(newValue: ULong): ULong {
val oldValue = this.value
this.value = newValue
return oldValue
}
public fun getAndAdd(d: ULong): ULong = this.getAndSet(this.value + d)
public fun getAndSub(d: ULong): ULong = this.getAndSet(this.value - d)
}