github.com/tawesoft/golib/v2@v2.10.0/legacy/operator/int64.go (about) 1 package operator 2 3 // Code generated by (tawesoft.co.uk/go/operator) template-numbers.py: DO NOT EDIT. 4 5 // Some overflow checks with reference to stackoverflow.com/a/1514309/5654201 6 7 type int64Unary struct { 8 Identity func(int64) int64 9 Abs func(int64) int64 10 Negation func(int64) int64 11 Zero func(int64) bool 12 NonZero func(int64) bool 13 Positive func(int64) bool 14 Negative func(int64) bool 15 } 16 17 type int64UnaryChecked struct { 18 Abs func(int64) (int64, error) 19 Negation func(int64) (int64, error) 20 } 21 22 type int64Binary struct { 23 Add func(int64, int64) int64 24 Sub func(int64, int64) int64 25 Mul func(int64, int64) int64 26 Div func(int64, int64) int64 27 Mod func(int64, int64) int64 28 29 Eq func(int64, int64) bool 30 Neq func(int64, int64) bool 31 Lt func(int64, int64) bool 32 Lte func(int64, int64) bool 33 Gt func(int64, int64) bool 34 Gte func(int64, int64) bool 35 36 And func(int64, int64) int64 37 Or func(int64, int64) int64 38 Xor func(int64, int64) int64 39 AndNot func(int64, int64) int64 40 41 Shl func(int64, uint) int64 42 Shr func(int64, uint) int64 43 } 44 45 type int64BinaryChecked struct { 46 Add func(int64, int64) (int64, error) 47 Sub func(int64, int64) (int64, error) 48 Mul func(int64, int64) (int64, error) 49 Div func(int64, int64) (int64, error) 50 51 Shl func(int64, uint) (int64, error) 52 Shr func(int64, uint) (int64, error) 53 } 54 55 type int64Nary struct { 56 Add func(... int64) int64 57 Sub func(... int64) int64 58 Mul func(... int64) int64 59 } 60 61 type int64NaryChecked struct { 62 Add func(... int64) (int64, error) 63 Sub func(... int64) (int64, error) 64 Mul func(... int64) (int64, error) 65 } 66 67 // Int64 implements operations on one (unary), two (binary), or many (nary) arguments of type int64. 68 var Int64 = struct { 69 Unary int64Unary 70 Binary int64Binary 71 Nary int64Nary 72 Reduce func(operatorIdentity int64, operator func(int64, int64) int64, elements ... int64) int64 73 }{ 74 Unary: int64Unary{ 75 Identity: func(a int64) int64 { return a }, 76 Abs: int64UnaryAbs, 77 Negation: func(a int64) int64 { return -a }, 78 Zero: func(a int64) bool { return a == 0 }, 79 NonZero: func(a int64) bool { return a != 0 }, 80 Positive: int64UnaryPositive, 81 Negative: int64UnaryNegative, 82 }, 83 84 Binary: int64Binary{ 85 Add: func(a int64, b int64) int64 { return a + b }, 86 Sub: func(a int64, b int64) int64 { return a - b }, 87 Mul: func(a int64, b int64) int64 { return a * b }, 88 Div: func(a int64, b int64) int64 { return a / b }, 89 90 Eq: func(a int64, b int64) bool { return a == b }, 91 Neq: func(a int64, b int64) bool { return a != b }, 92 Lt: func(a int64, b int64) bool { return a < b }, 93 Lte: func(a int64, b int64) bool { return a <= b }, 94 Gt: func(a int64, b int64) bool { return a > b }, 95 Gte: func(a int64, b int64) bool { return a >= b }, 96 97 And: func(a int64, b int64) int64 { return a & b }, 98 Or: func(a int64, b int64) int64 { return a | b }, 99 Xor: func(a int64, b int64) int64 { return a ^ b }, 100 AndNot: func(a int64, b int64) int64 { return a &^ b }, 101 Mod: func(a int64, b int64) int64 { return a % b }, 102 103 Shl: func(a int64, b uint) int64 { return a << b }, 104 Shr: func(a int64, b uint) int64 { return a >> b }, 105 }, 106 107 Nary: int64Nary{ 108 Add: int64NaryAdd, 109 Mul: int64NaryMul, 110 }, 111 112 Reduce: int64Reduce, 113 } 114 115 // Int64Checked implements operations on one (unary), two (binary), or many (nary) arguments of type int64, returning an 116 // error in cases such as overflow or an undefined operation. 117 var Int64Checked = struct { 118 Unary int64UnaryChecked 119 Binary int64BinaryChecked 120 Nary int64NaryChecked 121 Reduce func(operatorIdentity int64, operator func(int64, int64) (int64, error), elements ... int64) (int64, error) 122 }{ 123 Unary: int64UnaryChecked{ 124 Abs: int64UnaryCheckedAbs, 125 Negation: int64UnaryCheckedNegation, 126 }, 127 128 Binary: int64BinaryChecked{ 129 Add: int64BinaryCheckedAdd, 130 Sub: int64BinaryCheckedSub, 131 Mul: int64BinaryCheckedMul, 132 Div: int64BinaryCheckedDiv, 133 Shl: int64BinaryCheckedShl, 134 }, 135 136 Nary: int64NaryChecked{ 137 Add: int64NaryCheckedAdd, 138 Mul: int64NaryCheckedMul, 139 }, 140 141 Reduce: int64CheckedReduce, 142 } 143 144 func int64UnaryPositive(a int64) bool { 145 return a > 0 146 } 147 148 func int64UnaryNegative(a int64) bool { 149 return a < 0 150 } 151 152 func int64UnaryAbs(a int64) int64 { 153 if a < 0 { return -a } 154 return a 155 } 156 157 func int64UnaryCheckedAbs(a int64) (v int64, err error) { 158 if a == minInt64 { return v, ErrorOverflow } 159 if a < 0 { return -a, nil } 160 return a, nil 161 } 162 163 func int64UnaryCheckedNegation(a int64) (v int64, err error) { 164 if (a == minInt64) { return v, ErrorOverflow } 165 return -a, nil 166 } 167 168 func int64BinaryCheckedAdd(a int64, b int64) (v int64, err error) { 169 if (b > 0) && (a > (maxInt64 - b)) { return v, ErrorOverflow } 170 if (b < 0) && (a < (minInt64 - b)) { return v, ErrorOverflow } 171 return a + b, nil 172 } 173 174 func int64BinaryCheckedSub(a int64, b int64) (v int64, err error) { 175 if (b < 0) && (a > (maxInt64 + b)) { return v, ErrorOverflow } 176 if (b > 0) && (a < (minInt64 + b)) { return v, ErrorOverflow } 177 return a - b, nil 178 } 179 180 func int64BinaryCheckedMul(a int64, b int64) (v int64, err error) { 181 if (a == -1) && (b == minInt64) { return v, ErrorOverflow } 182 if (b == -1) && (a == minInt64) { return v, ErrorOverflow } 183 if (a > (maxInt64 / b)) { return v, ErrorOverflow } 184 if (a < (minInt64 / b)) { return v, ErrorOverflow } 185 186 return a * b, nil 187 } 188 189 func int64BinaryCheckedDiv(a int64, b int64) (v int64, err error) { 190 if (b == -1) && (a == minInt64) { return v, ErrorOverflow } 191 if (b == 0) { return v, ErrorUndefined } 192 193 return a / b, nil 194 } 195 196 func int64BinaryCheckedShl(a int64, b uint) (v int64, err error) { 197 if a < 0 { return v, ErrorUndefined } 198 if b > uint(int64MostSignificantBit(maxInt64)) { return v, ErrorOverflow } 199 return v, err 200 } 201 202 func int64MostSignificantBit(a int64) (result int) { 203 for a > 0 { 204 a >>= 1 205 result++ 206 } 207 return result; 208 } 209 210 func int64NaryAdd(xs ... int64) (result int64) { 211 for i := 0; i < len(xs); i++ { 212 result += xs[i] 213 } 214 return result 215 } 216 217 func int64NaryCheckedAdd(xs ... int64) (result int64, err error) { 218 for i := 0; i < len(xs); i++ { 219 result, err = int64BinaryCheckedAdd(result, xs[i]) 220 if err != nil { return result, err } 221 } 222 return result, nil 223 } 224 225 func int64NaryMul(xs ... int64) (result int64) { 226 result = 1 227 for i := 0; i < len(xs); i++ { 228 result *= xs[i] 229 } 230 return result 231 } 232 233 func int64NaryCheckedMul(xs ... int64) (result int64, err error) { 234 result = 1 235 for i := 0; i < len(xs); i++ { 236 result, err = int64BinaryCheckedMul(result, xs[i]) 237 if err != nil { return result, err } 238 } 239 return result, nil 240 } 241 242 func int64Reduce(operatorIdentity int64, operator func(int64, int64) int64, elements ... int64) (result int64) { 243 result = operatorIdentity 244 for i := 0; i < len(elements); i++ { 245 result = operator(result, elements[i]) 246 } 247 return result 248 } 249 250 func int64CheckedReduce(operatorIdentity int64, operator func(int64, int64) (int64, error), elements ... int64) (result int64, err error) { 251 result = operatorIdentity 252 for i := 0; i < len(elements); i++ { 253 result, err = operator(result, elements[i]) 254 if err != nil { return result, err } 255 } 256 return result, err 257 } 258