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