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