Search Apps Documentation Source Content File Folder Download Copy Actions Download

utils.gno

1.44 Kb ยท 58 lines
 1package v1
 2
 3import "math"
 4
 5// safeAddInt64 performs safe addition of int64 values, panicking on overflow or underflow
 6func safeAddInt64(a, b int64) int64 {
 7	if a > 0 && b > math.MaxInt64-a {
 8		panic("int64 addition overflow")
 9	}
10
11	if a < 0 && b < math.MinInt64-a {
12		panic("int64 addition underflow")
13	}
14
15	return a + b
16}
17
18// safeSubInt64 performs safe subtraction of int64 values, panicking on overflow or underflow
19func safeSubInt64(a, b int64) int64 {
20	if b > 0 && a < math.MinInt64+b {
21		panic("int64 subtraction underflow")
22	}
23
24	if b < 0 && a > math.MaxInt64+b {
25		panic("int64 subtraction overflow")
26	}
27
28	return a - b
29}
30
31// safeMulDiv performs safe multiplication and division: (a * b) / c
32// Prevents overflow in multiplication step by checking bounds
33func safeMulDiv(a, b, c int64) int64 {
34	if c == 0 {
35		panic("division by zero in safeMulDiv")
36	}
37
38	// Check for multiplication overflow
39	// If a * b would overflow, we need to be careful
40	if a != 0 && b != 0 {
41		// Check if multiplication would overflow
42		if a > 0 && b > 0 && a > math.MaxInt64/b {
43			panic("int64 multiplication overflow in safeMulDiv")
44		}
45		if a > 0 && b < 0 && b < math.MinInt64/a {
46			panic("int64 multiplication underflow in safeMulDiv")
47		}
48		if a < 0 && b > 0 && a < math.MinInt64/b {
49			panic("int64 multiplication underflow in safeMulDiv")
50		}
51		if a < 0 && b < 0 && a < math.MaxInt64/b {
52			panic("int64 multiplication overflow in safeMulDiv")
53		}
54	}
55
56	result := (a * b) / c
57	return result
58}