Source file
src/tawesoft.co.uk/go/operator/uint8.go
Documentation:
src/tawesoft.co.uk/go/operator/uint8.go
1 package operator
2
3
4
5
6
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
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
113
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
237
View as plain text