Source file
src/tawesoft.co.uk/go/operator/int32.go
Documentation:
src/tawesoft.co.uk/go/operator/int32.go
1 package operator
2
3
4
5
6
7
8 type int32Unary struct {
9 Identity func(int32) int32
10 Abs func(int32) int32
11 Negation func(int32) int32
12 Zero func(int32) bool
13 NonZero func(int32) bool
14 Positive func(int32) bool
15 Negative func(int32) bool
16 }
17
18 type int32UnaryChecked struct {
19 Abs func(int32) (int32, error)
20 Negation func(int32) (int32, error)
21 }
22
23 type int32Binary struct {
24 Add func(int32, int32) int32
25 Sub func(int32, int32) int32
26 Mul func(int32, int32) int32
27 Div func(int32, int32) int32
28 Mod func(int32, int32) int32
29
30 Eq func(int32, int32) bool
31 Neq func(int32, int32) bool
32 Lt func(int32, int32) bool
33 Lte func(int32, int32) bool
34 Gt func(int32, int32) bool
35 Gte func(int32, int32) bool
36
37 And func(int32, int32) int32
38 Or func(int32, int32) int32
39 Xor func(int32, int32) int32
40 AndNot func(int32, int32) int32
41
42 Shl func(int32, uint) int32
43 Shr func(int32, uint) int32
44 }
45
46 type int32BinaryChecked struct {
47 Add func(int32, int32) (int32, error)
48 Sub func(int32, int32) (int32, error)
49 Mul func(int32, int32) (int32, error)
50 Div func(int32, int32) (int32, error)
51
52 Shl func(int32, uint) (int32, error)
53 Shr func(int32, uint) (int32, error)
54 }
55
56 type int32Nary struct {
57 Add func(... int32) int32
58 Sub func(... int32) int32
59 Mul func(... int32) int32
60 }
61
62 type int32NaryChecked struct {
63 Add func(... int32) (int32, error)
64 Sub func(... int32) (int32, error)
65 Mul func(... int32) (int32, error)
66 }
67
68
69 var Int32 = struct {
70 Unary int32Unary
71 Binary int32Binary
72 Nary int32Nary
73 Reduce func(operatorIdentity int32, operator func(int32, int32) int32, elements ... int32) int32
74 }{
75 Unary: int32Unary{
76 Identity: func(a int32) int32 { return a },
77 Abs: int32UnaryAbs,
78 Negation: func(a int32) int32 { return -a },
79 Zero: func(a int32) bool { return a == 0 },
80 NonZero: func(a int32) bool { return a != 0 },
81 Positive: int32UnaryPositive,
82 Negative: int32UnaryNegative,
83 },
84
85 Binary: int32Binary{
86 Add: func(a int32, b int32) int32 { return a + b },
87 Sub: func(a int32, b int32) int32 { return a - b },
88 Mul: func(a int32, b int32) int32 { return a * b },
89 Div: func(a int32, b int32) int32 { return a / b },
90
91 Eq: func(a int32, b int32) bool { return a == b },
92 Neq: func(a int32, b int32) bool { return a != b },
93 Lt: func(a int32, b int32) bool { return a < b },
94 Lte: func(a int32, b int32) bool { return a <= b },
95 Gt: func(a int32, b int32) bool { return a > b },
96 Gte: func(a int32, b int32) bool { return a >= b },
97
98 And: func(a int32, b int32) int32 { return a & b },
99 Or: func(a int32, b int32) int32 { return a | b },
100 Xor: func(a int32, b int32) int32 { return a ^ b },
101 AndNot: func(a int32, b int32) int32 { return a &^ b },
102 Mod: func(a int32, b int32) int32 { return a % b },
103
104 Shl: func(a int32, b uint) int32 { return a << b },
105 Shr: func(a int32, b uint) int32 { return a >> b },
106 },
107
108 Nary: int32Nary{
109 Add: int32NaryAdd,
110 Mul: int32NaryMul,
111 },
112
113 Reduce: int32Reduce,
114 }
115
116
117
118 var Int32Checked = struct {
119 Unary int32UnaryChecked
120 Binary int32BinaryChecked
121 Nary int32NaryChecked
122 Reduce func(operatorIdentity int32, operator func(int32, int32) (int32, error), elements ... int32) (int32, error)
123 }{
124 Unary: int32UnaryChecked{
125 Abs: int32UnaryCheckedAbs,
126 Negation: int32UnaryCheckedNegation,
127 },
128
129 Binary: int32BinaryChecked{
130 Add: int32BinaryCheckedAdd,
131 Sub: int32BinaryCheckedSub,
132 Mul: int32BinaryCheckedMul,
133 Div: int32BinaryCheckedDiv,
134 Shl: int32BinaryCheckedShl,
135 },
136
137 Nary: int32NaryChecked{
138 Add: int32NaryCheckedAdd,
139 Mul: int32NaryCheckedMul,
140 },
141
142 Reduce: int32CheckedReduce,
143 }
144
145 func int32UnaryPositive(a int32) bool {
146 return a > 0
147 }
148
149 func int32UnaryNegative(a int32) bool {
150 return a < 0
151 }
152
153 func int32UnaryAbs(a int32) int32 {
154 if a < 0 { return -a }
155 return a
156 }
157
158 func int32UnaryCheckedAbs(a int32) (v int32, err error) {
159 if a == minInt32 { return v, ErrorOverflow }
160 if a < 0 { return -a, nil }
161 return a, nil
162 }
163
164 func int32UnaryCheckedNegation(a int32) (v int32, err error) {
165 if (a == minInt32) { return v, ErrorOverflow }
166 return -a, nil
167 }
168
169 func int32BinaryCheckedAdd(a int32, b int32) (v int32, err error) {
170 if (b > 0) && (a > (maxInt32 - b)) { return v, ErrorOverflow }
171 if (b < 0) && (a < (minInt32 - b)) { return v, ErrorOverflow }
172 return a + b, nil
173 }
174
175 func int32BinaryCheckedSub(a int32, b int32) (v int32, err error) {
176 if (b < 0) && (a > (maxInt32 + b)) { return v, ErrorOverflow }
177 if (b > 0) && (a < (minInt32 + b)) { return v, ErrorOverflow }
178 return a - b, nil
179 }
180
181 func int32BinaryCheckedMul(a int32, b int32) (v int32, err error) {
182 if (a == -1) && (b == minInt32) { return v, ErrorOverflow }
183 if (b == -1) && (a == minInt32) { return v, ErrorOverflow }
184 if (a > (maxInt32 / b)) { return v, ErrorOverflow }
185 if (a < (minInt32 / b)) { return v, ErrorOverflow }
186
187 return a * b, nil
188 }
189
190 func int32BinaryCheckedDiv(a int32, b int32) (v int32, err error) {
191 if (b == -1) && (a == minInt32) { return v, ErrorOverflow }
192 if (b == 0) { return v, ErrorUndefined }
193
194 return a / b, nil
195 }
196
197 func int32BinaryCheckedShl(a int32, b uint) (v int32, err error) {
198 if a < 0 { return v, ErrorUndefined }
199 if b > uint(int32MostSignificantBit(maxInt32)) { return v, ErrorOverflow }
200 return v, err
201 }
202
203 func int32MostSignificantBit(a int32) (result int) {
204 for a > 0 {
205 a >>= 1
206 result++
207 }
208 return result;
209 }
210
211 func int32NaryAdd(xs ... int32) (result int32) {
212 for i := 0; i < len(xs); i++ {
213 result += xs[i]
214 }
215 return result
216 }
217
218 func int32NaryCheckedAdd(xs ... int32) (result int32, err error) {
219 for i := 0; i < len(xs); i++ {
220 result, err = int32BinaryCheckedAdd(result, xs[i])
221 if err != nil { return result, err }
222 }
223 return result, nil
224 }
225
226 func int32NaryMul(xs ... int32) (result int32) {
227 result = 1
228 for i := 0; i < len(xs); i++ {
229 result *= xs[i]
230 }
231 return result
232 }
233
234 func int32NaryCheckedMul(xs ... int32) (result int32, err error) {
235 result = 1
236 for i := 0; i < len(xs); i++ {
237 result, err = int32BinaryCheckedMul(result, xs[i])
238 if err != nil { return result, err }
239 }
240 return result, nil
241 }
242
243 func int32Reduce(operatorIdentity int32, operator func(int32, int32) int32, elements ... int32) (result int32) {
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 int32CheckedReduce(operatorIdentity int32, operator func(int32, int32) (int32, error), elements ... int32) (result int32, 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