github.com/tawesoft/golib/v2@v2.10.0/legacy/operator/int32.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 int32Unary struct { 9 Identity func(int32) int32 10 Abs func(int32) int32 11 Negation func(int32) int32 12 Zero func(int32) bool 13 NonZero func(int32) bool 14 Positive func(int32) bool 15 Negative func(int32) bool 16 } 17 18 type int32UnaryChecked struct { 19 Abs func(int32) (int32, error) 20 Negation func(int32) (int32, error) 21 } 22 23 type int32Binary struct { 24 Add func(int32, int32) int32 25 Sub func(int32, int32) int32 26 Mul func(int32, int32) int32 27 Div func(int32, int32) int32 28 Mod func(int32, int32) int32 29 30 Eq func(int32, int32) bool 31 Neq func(int32, int32) bool 32 Lt func(int32, int32) bool 33 Lte func(int32, int32) bool 34 Gt func(int32, int32) bool 35 Gte func(int32, int32) bool 36 37 And func(int32, int32) int32 38 Or func(int32, int32) int32 39 Xor func(int32, int32) int32 40 AndNot func(int32, int32) int32 41 42 Shl func(int32, uint) int32 43 Shr func(int32, uint) int32 44 } 45 46 type int32BinaryChecked struct { 47 Add func(int32, int32) (int32, error) 48 Sub func(int32, int32) (int32, error) 49 Mul func(int32, int32) (int32, error) 50 Div func(int32, int32) (int32, error) 51 52 Shl func(int32, uint) (int32, error) 53 Shr func(int32, uint) (int32, error) 54 } 55 56 type int32Nary struct { 57 Add func(... int32) int32 58 Sub func(... int32) int32 59 Mul func(... int32) int32 60 } 61 62 type int32NaryChecked struct { 63 Add func(... int32) (int32, error) 64 Sub func(... int32) (int32, error) 65 Mul func(... int32) (int32, error) 66 } 67 68 // Int32 implements operations on one (unary), two (binary), or many (nary) arguments of type int32. 69 var Int32 = struct { 70 Unary int32Unary 71 Binary int32Binary 72 Nary int32Nary 73 Reduce func(operatorIdentity int32, operator func(int32, int32) int32, elements ... int32) int32 74 }{ 75 Unary: int32Unary{ 76 Identity: func(a int32) int32 { return a }, 77 Abs: int32UnaryAbs, 78 Negation: func(a int32) int32 { return -a }, 79 Zero: func(a int32) bool { return a == 0 }, 80 NonZero: func(a int32) bool { return a != 0 }, 81 Positive: int32UnaryPositive, 82 Negative: int32UnaryNegative, 83 }, 84 85 Binary: int32Binary{ 86 Add: func(a int32, b int32) int32 { return a + b }, 87 Sub: func(a int32, b int32) int32 { return a - b }, 88 Mul: func(a int32, b int32) int32 { return a * b }, 89 Div: func(a int32, b int32) int32 { return a / b }, 90 91 Eq: func(a int32, b int32) bool { return a == b }, 92 Neq: func(a int32, b int32) bool { return a != b }, 93 Lt: func(a int32, b int32) bool { return a < b }, 94 Lte: func(a int32, b int32) bool { return a <= b }, 95 Gt: func(a int32, b int32) bool { return a > b }, 96 Gte: func(a int32, b int32) bool { return a >= b }, 97 98 And: func(a int32, b int32) int32 { return a & b }, 99 Or: func(a int32, b int32) int32 { return a | b }, 100 Xor: func(a int32, b int32) int32 { return a ^ b }, 101 AndNot: func(a int32, b int32) int32 { return a &^ b }, 102 Mod: func(a int32, b int32) int32 { return a % b }, 103 104 Shl: func(a int32, b uint) int32 { return a << b }, 105 Shr: func(a int32, b uint) int32 { return a >> b }, 106 }, 107 108 Nary: int32Nary{ 109 Add: int32NaryAdd, 110 Mul: int32NaryMul, 111 }, 112 113 Reduce: int32Reduce, 114 } 115 116 // Int32Checked implements operations on one (unary), two (binary), or many (nary) arguments of type int32, returning an 117 // error in cases such as overflow or an undefined operation. 118 var Int32Checked = struct { 119 Unary int32UnaryChecked 120 Binary int32BinaryChecked 121 Nary int32NaryChecked 122 Reduce func(operatorIdentity int32, operator func(int32, int32) (int32, error), elements ... int32) (int32, error) 123 }{ 124 Unary: int32UnaryChecked{ 125 Abs: int32UnaryCheckedAbs, 126 Negation: int32UnaryCheckedNegation, 127 }, 128 129 Binary: int32BinaryChecked{ 130 Add: int32BinaryCheckedAdd, 131 Sub: int32BinaryCheckedSub, 132 Mul: int32BinaryCheckedMul, 133 Div: int32BinaryCheckedDiv, 134 Shl: int32BinaryCheckedShl, 135 }, 136 137 Nary: int32NaryChecked{ 138 Add: int32NaryCheckedAdd, 139 Mul: int32NaryCheckedMul, 140 }, 141 142 Reduce: int32CheckedReduce, 143 } 144 145 func int32UnaryPositive(a int32) bool { 146 return a > 0 147 } 148 149 func int32UnaryNegative(a int32) bool { 150 return a < 0 151 } 152 153 func int32UnaryAbs(a int32) int32 { 154 if a < 0 { return -a } 155 return a 156 } 157 158 func int32UnaryCheckedAbs(a int32) (v int32, err error) { 159 if a == minInt32 { return v, ErrorOverflow } 160 if a < 0 { return -a, nil } 161 return a, nil 162 } 163 164 func int32UnaryCheckedNegation(a int32) (v int32, err error) { 165 if (a == minInt32) { return v, ErrorOverflow } 166 return -a, nil 167 } 168 169 func int32BinaryCheckedAdd(a int32, b int32) (v int32, err error) { 170 if (b > 0) && (a > (maxInt32 - b)) { return v, ErrorOverflow } 171 if (b < 0) && (a < (minInt32 - b)) { return v, ErrorOverflow } 172 return a + b, nil 173 } 174 175 func int32BinaryCheckedSub(a int32, b int32) (v int32, err error) { 176 if (b < 0) && (a > (maxInt32 + b)) { return v, ErrorOverflow } 177 if (b > 0) && (a < (minInt32 + b)) { return v, ErrorOverflow } 178 return a - b, nil 179 } 180 181 func int32BinaryCheckedMul(a int32, b int32) (v int32, err error) { 182 if (a == -1) && (b == minInt32) { return v, ErrorOverflow } 183 if (b == -1) && (a == minInt32) { return v, ErrorOverflow } 184 if (a > (maxInt32 / b)) { return v, ErrorOverflow } 185 if (a < (minInt32 / b)) { return v, ErrorOverflow } 186 187 return a * b, nil 188 } 189 190 func int32BinaryCheckedDiv(a int32, b int32) (v int32, err error) { 191 if (b == -1) && (a == minInt32) { return v, ErrorOverflow } 192 if (b == 0) { return v, ErrorUndefined } 193 194 return a / b, nil 195 } 196 197 func int32BinaryCheckedShl(a int32, b uint) (v int32, err error) { 198 if a < 0 { return v, ErrorUndefined } 199 if b > uint(int32MostSignificantBit(maxInt32)) { return v, ErrorOverflow } 200 return v, err 201 } 202 203 func int32MostSignificantBit(a int32) (result int) { 204 for a > 0 { 205 a >>= 1 206 result++ 207 } 208 return result; 209 } 210 211 func int32NaryAdd(xs ... int32) (result int32) { 212 for i := 0; i < len(xs); i++ { 213 result += xs[i] 214 } 215 return result 216 } 217 218 func int32NaryCheckedAdd(xs ... int32) (result int32, err error) { 219 for i := 0; i < len(xs); i++ { 220 result, err = int32BinaryCheckedAdd(result, xs[i]) 221 if err != nil { return result, err } 222 } 223 return result, nil 224 } 225 226 func int32NaryMul(xs ... int32) (result int32) { 227 result = 1 228 for i := 0; i < len(xs); i++ { 229 result *= xs[i] 230 } 231 return result 232 } 233 234 func int32NaryCheckedMul(xs ... int32) (result int32, err error) { 235 result = 1 236 for i := 0; i < len(xs); i++ { 237 result, err = int32BinaryCheckedMul(result, xs[i]) 238 if err != nil { return result, err } 239 } 240 return result, nil 241 } 242 243 func int32Reduce(operatorIdentity int32, operator func(int32, int32) int32, elements ... int32) (result int32) { 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 int32CheckedReduce(operatorIdentity int32, operator func(int32, int32) (int32, error), elements ... int32) (result int32, 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