2017-01-04 19:17:24 +00:00
|
|
|
package math
|
|
|
|
|
|
|
|
import gmath "math"
|
|
|
|
|
|
|
|
/*
|
|
|
|
* NOTE: The following methods need to be optimised using either bit checking or asm
|
|
|
|
*/
|
|
|
|
|
|
|
|
// SafeSub returns subtraction result and whether overflow occurred.
|
|
|
|
func SafeSub(x, y uint64) (uint64, bool) {
|
|
|
|
return x - y, x < y
|
|
|
|
}
|
|
|
|
|
|
|
|
// SafeAdd returns the result and whether overflow occurred.
|
|
|
|
func SafeAdd(x, y uint64) (uint64, bool) {
|
|
|
|
return x + y, y > gmath.MaxUint64-x
|
|
|
|
}
|
|
|
|
|
|
|
|
// SafeMul returns multiplication result and whether overflow occurred.
|
|
|
|
func SafeMul(x, y uint64) (uint64, bool) {
|
2017-02-17 17:39:43 +00:00
|
|
|
if x == 0 || y == 0 {
|
2017-01-04 19:17:24 +00:00
|
|
|
return 0, false
|
|
|
|
}
|
2017-02-17 17:39:43 +00:00
|
|
|
return x * y, y > gmath.MaxUint64/x
|
2017-01-04 19:17:24 +00:00
|
|
|
}
|