integer overflow/underflow stuff
This commit is contained in:
@@ -99,3 +99,40 @@ fn Vec2f32 vec2FromHexCube(Vec2 map_center, XYZ cube, f32 size, f32 border_thick
|
||||
};
|
||||
}
|
||||
|
||||
/* from https://graphitemaster.github.io/aau/
|
||||
T midpoint(T x, T y) {
|
||||
// U is the unsigned version of your type T, or same as T if T already unsigned
|
||||
// digits is the number of numeric digits (not including sign) in your type T.
|
||||
// std::numeric_limits<T>::digits in C++ is helpful here.
|
||||
U shift = digits - 1;
|
||||
U difference = (U)x - (U)y;
|
||||
U sign = y < x;
|
||||
U half = (difference / 2) + (sign << shift) + (sign & difference);
|
||||
T mid = (T)(x + half);
|
||||
return mid;
|
||||
}
|
||||
*/
|
||||
|
||||
fn i32 i32Middle(i32 x, i32 y) {
|
||||
u32 shift = 31 - 1;
|
||||
u32 difference = (u32)x - (u32)y;
|
||||
u32 sign = y < x;
|
||||
u32 half = (difference / 2) + (sign << shift) + (sign & difference);
|
||||
i32 mid = (i32)(x + half);
|
||||
return mid;
|
||||
}
|
||||
|
||||
fn u32 u32Middle(u32 x, u32 y) {
|
||||
u32 shift = 32 - 1;
|
||||
u32 difference = (u32)x - (u32)y;
|
||||
u32 sign = y < x;
|
||||
u32 half = (difference / 2) + (sign << shift) + (sign & difference);
|
||||
u32 mid = (u32)(x + half);
|
||||
return mid;
|
||||
}
|
||||
|
||||
fn u64 u64SafeMul(u64 x, u64 y) {
|
||||
assert(!(y && x > MAX_u64/y));
|
||||
return x * y;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user