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