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