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