package math import ( "errors" "math" ) var ErrOverflowInt32 = errors.New("int32 overflow") var ErrOverflowUint8 = errors.New("uint8 overflow") var ErrOverflowInt8 = errors.New("int8 overflow") // SafeAddInt32 adds two int32 integers // If there is an overflow this will panic func SafeAddInt32(a, b int32) int32 { if b > 0 && (a > math.MaxInt32-b) { panic(ErrOverflowInt32) } else if b < 0 && (a < math.MinInt32-b) { panic(ErrOverflowInt32) } return a + b } // SafeSubInt32 subtracts two int32 integers // If there is an overflow this will panic func SafeSubInt32(a, b int32) int32 { if b > 0 && (a < math.MinInt32+b) { panic(ErrOverflowInt32) } else if b < 0 && (a > math.MaxInt32+b) { panic(ErrOverflowInt32) } return a - b } // SafeConvertInt32 takes a int and checks if it overflows // If there is an overflow this will panic func SafeConvertInt32(a int64) int32 { if a > math.MaxInt32 { panic(ErrOverflowInt32) } else if a < math.MinInt32 { panic(ErrOverflowInt32) } return int32(a) } // SafeConvertUint8 takes an int64 and checks if it overflows // If there is an overflow it returns an error func SafeConvertUint8(a int64) (uint8, error) { if a > math.MaxUint8 { return 0, ErrOverflowUint8 } else if a < 0 { return 0, ErrOverflowUint8 } return uint8(a), nil } // SafeConvertInt8 takes an int64 and checks if it overflows // If there is an overflow it returns an error func SafeConvertInt8(a int64) (int8, error) { if a > math.MaxInt8 { return 0, ErrOverflowInt8 } else if a < math.MinInt8 { return 0, ErrOverflowInt8 } return int8(a), nil }