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