summaryrefslogtreecommitdiff
path: root/src/main/kotlin/io/dico/parcels2/util/math/Math.kt
blob: 12c3e9fc389bf808d92ae7bd81be289a86543ddc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
package io.dico.parcels2.util.math

fun Double.floor(): Int {
    val down = toInt()
    if (down.toDouble() != this && (java.lang.Double.doubleToRawLongBits(this).ushr(63).toInt()) == 1) {
        return down - 1
    }
    return down
}

infix fun Int.umod(divisor: Int): Int {
    val out = this % divisor
    if (out < 0) {
        return out + divisor
    }
    return out
}

val Int.even: Boolean get() = and(1) == 0

fun IntRange.clamp(min: Int, max: Int): IntRange {
    if (first < min) {
        if (last > max) {
            return IntRange(min, max)
        }
        return IntRange(min, last)
    }
    if (last > max) {
        return IntRange(first, max)
    }
    return this
}

// the name coerceAtMost is bad
fun Int.clampMax(max: Int) = coerceAtMost(max)
fun Double.clampMin(min: Double) = coerceAtLeast(min)
fun Double.clampMax(max: Double) = coerceAtMost(max)

// Why does this not exist?
infix fun Int.ceilDiv(divisor: Int): Int {
    return -Math.floorDiv(-this, divisor)
}