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