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
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
|
package main
// clampMin ensures value is at least min (saturate at minimum).
func clampMin(value, min int) int {
if value < min {
return min
}
return value
}
// clampMax ensures value is at most max (saturate at maximum).
func clampMax(value, max int) int {
if value > max {
return max
}
return value
}
// clampRange ensures value is within [min, max] (inclusive).
func clampRange(value, min, max int) int {
if value < min {
return min
}
if value > max {
return max
}
return value
}
// clampIndex clamps index to valid slice bounds [0, count-1].
// Returns 0 if count is 0 (empty slice).
func clampIndex(index, count int) int {
if count == 0 {
return 0
}
if index < 0 {
return 0
}
if index >= count {
return count - 1
}
return index
}
// saturatingDec decrements value by 1, but doesn't go below min.
func saturatingDec(value, min int) int {
if value > min {
return value - 1
}
return min
}
// saturatingInc increments value by 1, but doesn't go above max.
func saturatingInc(value, max int) int {
if value < max {
return value + 1
}
return max
}
// saturatingAdd adds delta to value, but doesn't exceed max.
func saturatingAdd(value, delta, max int) int {
result := value + delta
if result > max {
return max
}
return result
}
// saturatingSub subtracts delta from value, but doesn't go below min.
func saturatingSub(value, delta, min int) int {
result := value - delta
if result < min {
return min
}
return result
}
|