Line data Source code
1 : /*
2 : * SPDX-License-Identifier: MPL-2.0
3 : *
4 : * This Source Code Form is subject to the terms of the Mozilla Public
5 : * License, v. 2.0. If a copy of the MPL was not distributed with this
6 : * file, You can obtain one at http://mozilla.org/MPL/2.0/.
7 : *
8 : * Copyright 2024 MonetDB Foundation;
9 : * Copyright August 2008 - 2023 MonetDB B.V.;
10 : * Copyright 1997 - July 2008 CWI.
11 : */
12 :
13 : #include "monetdb_config.h"
14 : #include "gdk.h"
15 : #include "gdk_private.h"
16 : #include "gdk_calc_private.h"
17 :
18 : /* ---------------------------------------------------------------------- */
19 : /* addition (any numeric type) */
20 :
21 : #define ADD_3TYPE(TYPE1, TYPE2, TYPE3, IF) \
22 : static BUN \
23 : add_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1, \
24 : const TYPE2 *rgt, bool incr2, \
25 : TYPE3 *restrict dst, TYPE3 max, \
26 : struct canditer *restrict ci1, \
27 : struct canditer *restrict ci2, \
28 : oid candoff1, oid candoff2) \
29 : { \
30 : BUN nils = 0; \
31 : BUN i = 0, j = 0, ncand = ci1->ncand; \
32 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
33 : \
34 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
35 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
36 : if (incr1) \
37 : i = canditer_next_dense(ci1) - candoff1; \
38 : if (incr2) \
39 : j = canditer_next_dense(ci2) - candoff2; \
40 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
41 : dst[k] = TYPE3##_nil; \
42 : nils++; \
43 : } else { \
44 : ADD##IF##_WITH_CHECK(lft[i], rgt[j], \
45 : TYPE3, dst[k], \
46 : max, \
47 : ON_OVERFLOW(TYPE1, TYPE2, "+")); \
48 : } \
49 : } \
50 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
51 : } else { \
52 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
53 : if (incr1) \
54 : i = canditer_next(ci1) - candoff1; \
55 : if (incr2) \
56 : j = canditer_next(ci2) - candoff2; \
57 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
58 : dst[k] = TYPE3##_nil; \
59 : nils++; \
60 : } else { \
61 : ADD##IF##_WITH_CHECK(lft[i], rgt[j], \
62 : TYPE3, dst[k], \
63 : max, \
64 : ON_OVERFLOW(TYPE1, TYPE2, "+")); \
65 : } \
66 : } \
67 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
68 : } \
69 : return nils; \
70 : }
71 :
72 : #define ADD_3TYPE_enlarge(TYPE1, TYPE2, TYPE3, IF) \
73 : static BUN \
74 : add_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1, \
75 : const TYPE2 *rgt, bool incr2, \
76 : TYPE3 *restrict dst, TYPE3 max, \
77 : struct canditer *restrict ci1, \
78 : struct canditer *restrict ci2, \
79 : oid candoff1, oid candoff2) \
80 : { \
81 : BUN nils = 0; \
82 : BUN i = 0, j = 0, ncand = ci1->ncand; \
83 : const bool couldoverflow = (max < (TYPE3) GDK_##TYPE1##_max + (TYPE3) GDK_##TYPE2##_max); \
84 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
85 : \
86 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
87 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
88 : if (incr1) \
89 : i = canditer_next_dense(ci1) - candoff1; \
90 : if (incr2) \
91 : j = canditer_next_dense(ci2) - candoff2; \
92 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
93 : dst[k] = TYPE3##_nil; \
94 : nils++; \
95 : } else if (couldoverflow) { \
96 : ADD##IF##_WITH_CHECK(lft[i], rgt[j], \
97 : TYPE3, dst[k], \
98 : max, \
99 : ON_OVERFLOW(TYPE1, TYPE2, "+")); \
100 : } else { \
101 : dst[k] = (TYPE3) lft[i] + rgt[j]; \
102 : } \
103 : } \
104 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
105 : } else { \
106 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
107 : if (incr1) \
108 : i = canditer_next(ci1) - candoff1; \
109 : if (incr2) \
110 : j = canditer_next(ci2) - candoff2; \
111 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
112 : dst[k] = TYPE3##_nil; \
113 : nils++; \
114 : } else if (couldoverflow) { \
115 : ADD##IF##_WITH_CHECK(lft[i], rgt[j], \
116 : TYPE3, dst[k], \
117 : max, \
118 : ON_OVERFLOW(TYPE1, TYPE2, "+")); \
119 : } else { \
120 : dst[k] = (TYPE3) lft[i] + rgt[j]; \
121 : } \
122 : } \
123 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
124 : } \
125 : return nils; \
126 : }
127 :
128 2616 : ADD_3TYPE(bte, bte, bte, I)
129 824 : ADD_3TYPE_enlarge(bte, bte, sht, I)
130 0 : ADD_3TYPE_enlarge(bte, bte, int, I)
131 0 : ADD_3TYPE_enlarge(bte, bte, lng, I)
132 : #ifdef HAVE_HGE
133 0 : ADD_3TYPE_enlarge(bte, bte, hge, I)
134 : #endif
135 0 : ADD_3TYPE_enlarge(bte, bte, flt, F)
136 0 : ADD_3TYPE_enlarge(bte, bte, dbl, F)
137 0 : ADD_3TYPE(bte, sht, sht, I)
138 0 : ADD_3TYPE_enlarge(bte, sht, int, I)
139 0 : ADD_3TYPE_enlarge(bte, sht, lng, I)
140 : #ifdef HAVE_HGE
141 0 : ADD_3TYPE_enlarge(bte, sht, hge, I)
142 : #endif
143 0 : ADD_3TYPE_enlarge(bte, sht, flt, F)
144 0 : ADD_3TYPE_enlarge(bte, sht, dbl, F)
145 0 : ADD_3TYPE(bte, int, int, I)
146 0 : ADD_3TYPE_enlarge(bte, int, lng, I)
147 : #ifdef HAVE_HGE
148 0 : ADD_3TYPE_enlarge(bte, int, hge, I)
149 : #endif
150 0 : ADD_3TYPE_enlarge(bte, int, flt, F)
151 0 : ADD_3TYPE_enlarge(bte, int, dbl, F)
152 0 : ADD_3TYPE(bte, lng, lng, I)
153 : #ifdef HAVE_HGE
154 0 : ADD_3TYPE_enlarge(bte, lng, hge, I)
155 : #endif
156 0 : ADD_3TYPE_enlarge(bte, lng, flt, F)
157 0 : ADD_3TYPE_enlarge(bte, lng, dbl, F)
158 : #ifdef HAVE_HGE
159 0 : ADD_3TYPE(bte, hge, hge, I)
160 0 : ADD_3TYPE_enlarge(bte, hge, flt, F)
161 0 : ADD_3TYPE_enlarge(bte, hge, dbl, F)
162 : #endif
163 0 : ADD_3TYPE(bte, flt, flt, F)
164 0 : ADD_3TYPE_enlarge(bte, flt, dbl, F)
165 0 : ADD_3TYPE(bte, dbl, dbl, F)
166 308 : ADD_3TYPE(sht, bte, sht, I)
167 0 : ADD_3TYPE_enlarge(sht, bte, int, I)
168 0 : ADD_3TYPE_enlarge(sht, bte, lng, I)
169 : #ifdef HAVE_HGE
170 0 : ADD_3TYPE_enlarge(sht, bte, hge, I)
171 : #endif
172 0 : ADD_3TYPE_enlarge(sht, bte, flt, F)
173 0 : ADD_3TYPE_enlarge(sht, bte, dbl, F)
174 100458 : ADD_3TYPE(sht, sht, sht, I)
175 1126463 : ADD_3TYPE_enlarge(sht, sht, int, I)
176 0 : ADD_3TYPE_enlarge(sht, sht, lng, I)
177 : #ifdef HAVE_HGE
178 0 : ADD_3TYPE_enlarge(sht, sht, hge, I)
179 : #endif
180 0 : ADD_3TYPE_enlarge(sht, sht, flt, F)
181 0 : ADD_3TYPE_enlarge(sht, sht, dbl, F)
182 0 : ADD_3TYPE(sht, int, int, I)
183 0 : ADD_3TYPE_enlarge(sht, int, lng, I)
184 : #ifdef HAVE_HGE
185 0 : ADD_3TYPE_enlarge(sht, int, hge, I)
186 : #endif
187 0 : ADD_3TYPE_enlarge(sht, int, flt, F)
188 0 : ADD_3TYPE_enlarge(sht, int, dbl, F)
189 0 : ADD_3TYPE(sht, lng, lng, I)
190 : #ifdef HAVE_HGE
191 0 : ADD_3TYPE_enlarge(sht, lng, hge, I)
192 : #endif
193 0 : ADD_3TYPE_enlarge(sht, lng, flt, F)
194 0 : ADD_3TYPE_enlarge(sht, lng, dbl, F)
195 : #ifdef HAVE_HGE
196 0 : ADD_3TYPE(sht, hge, hge, I)
197 0 : ADD_3TYPE_enlarge(sht, hge, flt, F)
198 0 : ADD_3TYPE_enlarge(sht, hge, dbl, F)
199 : #endif
200 0 : ADD_3TYPE(sht, flt, flt, F)
201 0 : ADD_3TYPE_enlarge(sht, flt, dbl, F)
202 0 : ADD_3TYPE(sht, dbl, dbl, F)
203 67732 : ADD_3TYPE(int, bte, int, I)
204 0 : ADD_3TYPE_enlarge(int, bte, lng, I)
205 : #ifdef HAVE_HGE
206 0 : ADD_3TYPE_enlarge(int, bte, hge, I)
207 : #endif
208 0 : ADD_3TYPE_enlarge(int, bte, flt, F)
209 0 : ADD_3TYPE_enlarge(int, bte, dbl, F)
210 0 : ADD_3TYPE(int, sht, int, I)
211 0 : ADD_3TYPE_enlarge(int, sht, lng, I)
212 : #ifdef HAVE_HGE
213 0 : ADD_3TYPE_enlarge(int, sht, hge, I)
214 : #endif
215 0 : ADD_3TYPE_enlarge(int, sht, flt, F)
216 0 : ADD_3TYPE_enlarge(int, sht, dbl, F)
217 2737208 : ADD_3TYPE(int, int, int, I)
218 10410248 : ADD_3TYPE_enlarge(int, int, lng, I)
219 : #ifdef HAVE_HGE
220 0 : ADD_3TYPE_enlarge(int, int, hge, I)
221 : #endif
222 0 : ADD_3TYPE_enlarge(int, int, flt, F)
223 0 : ADD_3TYPE_enlarge(int, int, dbl, F)
224 0 : ADD_3TYPE(int, lng, lng, I)
225 : #ifdef HAVE_HGE
226 0 : ADD_3TYPE_enlarge(int, lng, hge, I)
227 : #endif
228 0 : ADD_3TYPE_enlarge(int, lng, flt, F)
229 0 : ADD_3TYPE_enlarge(int, lng, dbl, F)
230 : #ifdef HAVE_HGE
231 0 : ADD_3TYPE(int, hge, hge, I)
232 0 : ADD_3TYPE_enlarge(int, hge, flt, F)
233 0 : ADD_3TYPE_enlarge(int, hge, dbl, F)
234 : #endif
235 0 : ADD_3TYPE(int, flt, flt, F)
236 0 : ADD_3TYPE_enlarge(int, flt, dbl, F)
237 0 : ADD_3TYPE(int, dbl, dbl, F)
238 196 : ADD_3TYPE(lng, bte, lng, I)
239 : #ifdef HAVE_HGE
240 0 : ADD_3TYPE_enlarge(lng, bte, hge, I)
241 : #endif
242 0 : ADD_3TYPE_enlarge(lng, bte, flt, F)
243 0 : ADD_3TYPE_enlarge(lng, bte, dbl, F)
244 59331 : ADD_3TYPE(lng, sht, lng, I)
245 : #ifdef HAVE_HGE
246 0 : ADD_3TYPE_enlarge(lng, sht, hge, I)
247 : #endif
248 0 : ADD_3TYPE_enlarge(lng, sht, flt, F)
249 0 : ADD_3TYPE_enlarge(lng, sht, dbl, F)
250 48 : ADD_3TYPE(lng, int, lng, I)
251 : #ifdef HAVE_HGE
252 84 : ADD_3TYPE_enlarge(lng, int, hge, I)
253 : #endif
254 0 : ADD_3TYPE_enlarge(lng, int, flt, F)
255 0 : ADD_3TYPE_enlarge(lng, int, dbl, F)
256 1282602 : ADD_3TYPE(lng, lng, lng, I)
257 : #ifdef HAVE_HGE
258 559 : ADD_3TYPE_enlarge(lng, lng, hge, I)
259 : #endif
260 0 : ADD_3TYPE_enlarge(lng, lng, flt, F)
261 0 : ADD_3TYPE_enlarge(lng, lng, dbl, F)
262 : #ifdef HAVE_HGE
263 0 : ADD_3TYPE(lng, hge, hge, I)
264 0 : ADD_3TYPE_enlarge(lng, hge, flt, F)
265 0 : ADD_3TYPE_enlarge(lng, hge, dbl, F)
266 : #endif
267 0 : ADD_3TYPE(lng, flt, flt, F)
268 0 : ADD_3TYPE_enlarge(lng, flt, dbl, F)
269 0 : ADD_3TYPE(lng, dbl, dbl, F)
270 : #ifdef HAVE_HGE
271 12 : ADD_3TYPE(hge, bte, hge, I)
272 0 : ADD_3TYPE_enlarge(hge, bte, flt, F)
273 0 : ADD_3TYPE_enlarge(hge, bte, dbl, F)
274 0 : ADD_3TYPE(hge, sht, hge, I)
275 0 : ADD_3TYPE_enlarge(hge, sht, flt, F)
276 0 : ADD_3TYPE_enlarge(hge, sht, dbl, F)
277 0 : ADD_3TYPE(hge, int, hge, I)
278 0 : ADD_3TYPE_enlarge(hge, int, flt, F)
279 0 : ADD_3TYPE_enlarge(hge, int, dbl, F)
280 42 : ADD_3TYPE(hge, lng, hge, I)
281 0 : ADD_3TYPE_enlarge(hge, lng, flt, F)
282 0 : ADD_3TYPE_enlarge(hge, lng, dbl, F)
283 1795 : ADD_3TYPE(hge, hge, hge, I)
284 0 : ADD_3TYPE_enlarge(hge, hge, flt, F)
285 0 : ADD_3TYPE_enlarge(hge, hge, dbl, F)
286 0 : ADD_3TYPE(hge, flt, flt, F)
287 0 : ADD_3TYPE_enlarge(hge, flt, dbl, F)
288 0 : ADD_3TYPE(hge, dbl, dbl, F)
289 : #endif
290 0 : ADD_3TYPE(flt, bte, flt, F)
291 0 : ADD_3TYPE_enlarge(flt, bte, dbl, F)
292 0 : ADD_3TYPE(flt, sht, flt, F)
293 0 : ADD_3TYPE_enlarge(flt, sht, dbl, F)
294 4 : ADD_3TYPE(flt, int, flt, F)
295 0 : ADD_3TYPE_enlarge(flt, int, dbl, F)
296 0 : ADD_3TYPE(flt, lng, flt, F)
297 0 : ADD_3TYPE_enlarge(flt, lng, dbl, F)
298 : #ifdef HAVE_HGE
299 0 : ADD_3TYPE(flt, hge, flt, F)
300 0 : ADD_3TYPE_enlarge(flt, hge, dbl, F)
301 : #endif
302 2759172 : ADD_3TYPE(flt, flt, flt, F)
303 0 : ADD_3TYPE_enlarge(flt, flt, dbl, F)
304 0 : ADD_3TYPE(flt, dbl, dbl, F)
305 0 : ADD_3TYPE(dbl, bte, dbl, F)
306 0 : ADD_3TYPE(dbl, sht, dbl, F)
307 0 : ADD_3TYPE(dbl, int, dbl, F)
308 0 : ADD_3TYPE(dbl, lng, dbl, F)
309 : #ifdef HAVE_HGE
310 0 : ADD_3TYPE(dbl, hge, dbl, F)
311 : #endif
312 0 : ADD_3TYPE(dbl, flt, dbl, F)
313 2598 : ADD_3TYPE(dbl, dbl, dbl, F)
314 :
315 : static BUN
316 243057 : add_typeswitchloop(const void *lft, int tp1, bool incr1,
317 : const void *rgt, int tp2, bool incr2,
318 : void *restrict dst, int tp,
319 : struct canditer *restrict ci1, struct canditer *restrict ci2,
320 : oid candoff1, oid candoff2,
321 : const char *func)
322 : {
323 243057 : BUN nils;
324 :
325 243057 : tp1 = ATOMbasetype(tp1);
326 243057 : tp2 = ATOMbasetype(tp2);
327 243057 : tp = ATOMbasetype(tp);
328 243057 : switch (tp1) {
329 732 : case TYPE_bte:
330 732 : switch (tp2) {
331 732 : case TYPE_bte:
332 732 : switch (tp) {
333 661 : case TYPE_bte:
334 661 : nils = add_bte_bte_bte(lft, incr1, rgt, incr2,
335 : dst, GDK_bte_max,
336 : ci1, ci2, candoff1, candoff2);
337 661 : break;
338 71 : case TYPE_sht:
339 71 : nils = add_bte_bte_sht(lft, incr1, rgt, incr2,
340 : dst, GDK_sht_max,
341 : ci1, ci2, candoff1, candoff2);
342 71 : break;
343 0 : case TYPE_int:
344 0 : nils = add_bte_bte_int(lft, incr1, rgt, incr2,
345 : dst, GDK_int_max,
346 : ci1, ci2, candoff1, candoff2);
347 0 : break;
348 0 : case TYPE_lng:
349 0 : nils = add_bte_bte_lng(lft, incr1, rgt, incr2,
350 : dst, GDK_lng_max,
351 : ci1, ci2, candoff1, candoff2);
352 0 : break;
353 : #ifdef HAVE_HGE
354 0 : case TYPE_hge:
355 0 : nils = add_bte_bte_hge(lft, incr1, rgt, incr2,
356 : dst, GDK_hge_max,
357 : ci1, ci2, candoff1, candoff2);
358 0 : break;
359 : #endif
360 0 : case TYPE_flt:
361 0 : nils = add_bte_bte_flt(lft, incr1, rgt, incr2,
362 : dst, GDK_flt_max,
363 : ci1, ci2, candoff1, candoff2);
364 0 : break;
365 0 : case TYPE_dbl:
366 0 : nils = add_bte_bte_dbl(lft, incr1, rgt, incr2,
367 : dst, GDK_dbl_max,
368 : ci1, ci2, candoff1, candoff2);
369 0 : break;
370 0 : default:
371 0 : goto unsupported;
372 : }
373 : break;
374 0 : case TYPE_sht:
375 0 : switch (tp) {
376 0 : case TYPE_sht:
377 0 : nils = add_bte_sht_sht(lft, incr1, rgt, incr2,
378 : dst, GDK_sht_max,
379 : ci1, ci2, candoff1, candoff2);
380 0 : break;
381 0 : case TYPE_int:
382 0 : nils = add_bte_sht_int(lft, incr1, rgt, incr2,
383 : dst, GDK_int_max,
384 : ci1, ci2, candoff1, candoff2);
385 0 : break;
386 0 : case TYPE_lng:
387 0 : nils = add_bte_sht_lng(lft, incr1, rgt, incr2,
388 : dst, GDK_lng_max,
389 : ci1, ci2, candoff1, candoff2);
390 0 : break;
391 : #ifdef HAVE_HGE
392 0 : case TYPE_hge:
393 0 : nils = add_bte_sht_hge(lft, incr1, rgt, incr2,
394 : dst, GDK_hge_max,
395 : ci1, ci2, candoff1, candoff2);
396 0 : break;
397 : #endif
398 0 : case TYPE_flt:
399 0 : nils = add_bte_sht_flt(lft, incr1, rgt, incr2,
400 : dst, GDK_flt_max,
401 : ci1, ci2, candoff1, candoff2);
402 0 : break;
403 0 : case TYPE_dbl:
404 0 : nils = add_bte_sht_dbl(lft, incr1, rgt, incr2,
405 : dst, GDK_dbl_max,
406 : ci1, ci2, candoff1, candoff2);
407 0 : break;
408 0 : default:
409 0 : goto unsupported;
410 : }
411 : break;
412 0 : case TYPE_int:
413 0 : switch (tp) {
414 0 : case TYPE_int:
415 0 : nils = add_bte_int_int(lft, incr1, rgt, incr2,
416 : dst, GDK_int_max,
417 : ci1, ci2, candoff1, candoff2);
418 0 : break;
419 0 : case TYPE_lng:
420 0 : nils = add_bte_int_lng(lft, incr1, rgt, incr2,
421 : dst, GDK_lng_max,
422 : ci1, ci2, candoff1, candoff2);
423 0 : break;
424 : #ifdef HAVE_HGE
425 0 : case TYPE_hge:
426 0 : nils = add_bte_int_hge(lft, incr1, rgt, incr2,
427 : dst, GDK_hge_max,
428 : ci1, ci2, candoff1, candoff2);
429 0 : break;
430 : #endif
431 0 : case TYPE_flt:
432 0 : nils = add_bte_int_flt(lft, incr1, rgt, incr2,
433 : dst, GDK_flt_max,
434 : ci1, ci2, candoff1, candoff2);
435 0 : break;
436 0 : case TYPE_dbl:
437 0 : nils = add_bte_int_dbl(lft, incr1, rgt, incr2,
438 : dst, GDK_dbl_max,
439 : ci1, ci2, candoff1, candoff2);
440 0 : break;
441 0 : default:
442 0 : goto unsupported;
443 : }
444 : break;
445 0 : case TYPE_lng:
446 0 : switch (tp) {
447 0 : case TYPE_lng:
448 0 : nils = add_bte_lng_lng(lft, incr1, rgt, incr2,
449 : dst, GDK_lng_max,
450 : ci1, ci2, candoff1, candoff2);
451 0 : break;
452 : #ifdef HAVE_HGE
453 0 : case TYPE_hge:
454 0 : nils = add_bte_lng_hge(lft, incr1, rgt, incr2,
455 : dst, GDK_hge_max,
456 : ci1, ci2, candoff1, candoff2);
457 0 : break;
458 : #endif
459 0 : case TYPE_flt:
460 0 : nils = add_bte_lng_flt(lft, incr1, rgt, incr2,
461 : dst, GDK_flt_max,
462 : ci1, ci2, candoff1, candoff2);
463 0 : break;
464 0 : case TYPE_dbl:
465 0 : nils = add_bte_lng_dbl(lft, incr1, rgt, incr2,
466 : dst, GDK_dbl_max,
467 : ci1, ci2, candoff1, candoff2);
468 0 : break;
469 0 : default:
470 0 : goto unsupported;
471 : }
472 : break;
473 : #ifdef HAVE_HGE
474 0 : case TYPE_hge:
475 0 : switch (tp) {
476 0 : case TYPE_hge:
477 0 : nils = add_bte_hge_hge(lft, incr1, rgt, incr2,
478 : dst, GDK_hge_max,
479 : ci1, ci2, candoff1, candoff2);
480 0 : break;
481 0 : case TYPE_flt:
482 0 : nils = add_bte_hge_flt(lft, incr1, rgt, incr2,
483 : dst, GDK_flt_max,
484 : ci1, ci2, candoff1, candoff2);
485 0 : break;
486 0 : case TYPE_dbl:
487 0 : nils = add_bte_hge_dbl(lft, incr1, rgt, incr2,
488 : dst, GDK_dbl_max,
489 : ci1, ci2, candoff1, candoff2);
490 0 : break;
491 0 : default:
492 0 : goto unsupported;
493 : }
494 : break;
495 : #endif
496 0 : case TYPE_flt:
497 0 : switch (tp) {
498 0 : case TYPE_flt:
499 0 : nils = add_bte_flt_flt(lft, incr1, rgt, incr2,
500 : dst, GDK_flt_max,
501 : ci1, ci2, candoff1, candoff2);
502 0 : break;
503 0 : case TYPE_dbl:
504 0 : nils = add_bte_flt_dbl(lft, incr1, rgt, incr2,
505 : dst, GDK_dbl_max,
506 : ci1, ci2, candoff1, candoff2);
507 0 : break;
508 0 : default:
509 0 : goto unsupported;
510 : }
511 : break;
512 0 : case TYPE_dbl:
513 0 : switch (tp) {
514 0 : case TYPE_dbl:
515 0 : nils = add_bte_dbl_dbl(lft, incr1, rgt, incr2,
516 : dst, GDK_dbl_max,
517 : ci1, ci2, candoff1, candoff2);
518 0 : break;
519 0 : default:
520 0 : goto unsupported;
521 : }
522 0 : break;
523 0 : default:
524 0 : goto unsupported;
525 : }
526 : break;
527 15856 : case TYPE_sht:
528 15856 : switch (tp2) {
529 77 : case TYPE_bte:
530 77 : switch (tp) {
531 77 : case TYPE_sht:
532 77 : nils = add_sht_bte_sht(lft, incr1, rgt, incr2,
533 : dst, GDK_sht_max,
534 : ci1, ci2, candoff1, candoff2);
535 77 : break;
536 0 : case TYPE_int:
537 0 : nils = add_sht_bte_int(lft, incr1, rgt, incr2,
538 : dst, GDK_int_max,
539 : ci1, ci2, candoff1, candoff2);
540 0 : break;
541 0 : case TYPE_lng:
542 0 : nils = add_sht_bte_lng(lft, incr1, rgt, incr2,
543 : dst, GDK_lng_max,
544 : ci1, ci2, candoff1, candoff2);
545 0 : break;
546 : #ifdef HAVE_HGE
547 0 : case TYPE_hge:
548 0 : nils = add_sht_bte_hge(lft, incr1, rgt, incr2,
549 : dst, GDK_hge_max,
550 : ci1, ci2, candoff1, candoff2);
551 0 : break;
552 : #endif
553 0 : case TYPE_flt:
554 0 : nils = add_sht_bte_flt(lft, incr1, rgt, incr2,
555 : dst, GDK_flt_max,
556 : ci1, ci2, candoff1, candoff2);
557 0 : break;
558 0 : case TYPE_dbl:
559 0 : nils = add_sht_bte_dbl(lft, incr1, rgt, incr2,
560 : dst, GDK_dbl_max,
561 : ci1, ci2, candoff1, candoff2);
562 0 : break;
563 0 : default:
564 0 : goto unsupported;
565 : }
566 : break;
567 15779 : case TYPE_sht:
568 15779 : switch (tp) {
569 15728 : case TYPE_sht:
570 15728 : nils = add_sht_sht_sht(lft, incr1, rgt, incr2,
571 : dst, GDK_sht_max,
572 : ci1, ci2, candoff1, candoff2);
573 15728 : break;
574 51 : case TYPE_int:
575 51 : nils = add_sht_sht_int(lft, incr1, rgt, incr2,
576 : dst, GDK_int_max,
577 : ci1, ci2, candoff1, candoff2);
578 51 : break;
579 0 : case TYPE_lng:
580 0 : nils = add_sht_sht_lng(lft, incr1, rgt, incr2,
581 : dst, GDK_lng_max,
582 : ci1, ci2, candoff1, candoff2);
583 0 : break;
584 : #ifdef HAVE_HGE
585 0 : case TYPE_hge:
586 0 : nils = add_sht_sht_hge(lft, incr1, rgt, incr2,
587 : dst, GDK_hge_max,
588 : ci1, ci2, candoff1, candoff2);
589 0 : break;
590 : #endif
591 0 : case TYPE_flt:
592 0 : nils = add_sht_sht_flt(lft, incr1, rgt, incr2,
593 : dst, GDK_flt_max,
594 : ci1, ci2, candoff1, candoff2);
595 0 : break;
596 0 : case TYPE_dbl:
597 0 : nils = add_sht_sht_dbl(lft, incr1, rgt, incr2,
598 : dst, GDK_dbl_max,
599 : ci1, ci2, candoff1, candoff2);
600 0 : break;
601 0 : default:
602 0 : goto unsupported;
603 : }
604 : break;
605 0 : case TYPE_int:
606 0 : switch (tp) {
607 0 : case TYPE_int:
608 0 : nils = add_sht_int_int(lft, incr1, rgt, incr2,
609 : dst, GDK_int_max,
610 : ci1, ci2, candoff1, candoff2);
611 0 : break;
612 0 : case TYPE_lng:
613 0 : nils = add_sht_int_lng(lft, incr1, rgt, incr2,
614 : dst, GDK_lng_max,
615 : ci1, ci2, candoff1, candoff2);
616 0 : break;
617 : #ifdef HAVE_HGE
618 0 : case TYPE_hge:
619 0 : nils = add_sht_int_hge(lft, incr1, rgt, incr2,
620 : dst, GDK_hge_max,
621 : ci1, ci2, candoff1, candoff2);
622 0 : break;
623 : #endif
624 0 : case TYPE_flt:
625 0 : nils = add_sht_int_flt(lft, incr1, rgt, incr2,
626 : dst, GDK_flt_max,
627 : ci1, ci2, candoff1, candoff2);
628 0 : break;
629 0 : case TYPE_dbl:
630 0 : nils = add_sht_int_dbl(lft, incr1, rgt, incr2,
631 : dst, GDK_dbl_max,
632 : ci1, ci2, candoff1, candoff2);
633 0 : break;
634 0 : default:
635 0 : goto unsupported;
636 : }
637 : break;
638 0 : case TYPE_lng:
639 0 : switch (tp) {
640 0 : case TYPE_lng:
641 0 : nils = add_sht_lng_lng(lft, incr1, rgt, incr2,
642 : dst, GDK_lng_max,
643 : ci1, ci2, candoff1, candoff2);
644 0 : break;
645 : #ifdef HAVE_HGE
646 0 : case TYPE_hge:
647 0 : nils = add_sht_lng_hge(lft, incr1, rgt, incr2,
648 : dst, GDK_hge_max,
649 : ci1, ci2, candoff1, candoff2);
650 0 : break;
651 : #endif
652 0 : case TYPE_flt:
653 0 : nils = add_sht_lng_flt(lft, incr1, rgt, incr2,
654 : dst, GDK_flt_max,
655 : ci1, ci2, candoff1, candoff2);
656 0 : break;
657 0 : case TYPE_dbl:
658 0 : nils = add_sht_lng_dbl(lft, incr1, rgt, incr2,
659 : dst, GDK_dbl_max,
660 : ci1, ci2, candoff1, candoff2);
661 0 : break;
662 0 : default:
663 0 : goto unsupported;
664 : }
665 : break;
666 : #ifdef HAVE_HGE
667 0 : case TYPE_hge:
668 0 : switch (tp) {
669 0 : case TYPE_hge:
670 0 : nils = add_sht_hge_hge(lft, incr1, rgt, incr2,
671 : dst, GDK_hge_max,
672 : ci1, ci2, candoff1, candoff2);
673 0 : break;
674 0 : case TYPE_flt:
675 0 : nils = add_sht_hge_flt(lft, incr1, rgt, incr2,
676 : dst, GDK_flt_max,
677 : ci1, ci2, candoff1, candoff2);
678 0 : break;
679 0 : case TYPE_dbl:
680 0 : nils = add_sht_hge_dbl(lft, incr1, rgt, incr2,
681 : dst, GDK_dbl_max,
682 : ci1, ci2, candoff1, candoff2);
683 0 : break;
684 0 : default:
685 0 : goto unsupported;
686 : }
687 : break;
688 : #endif
689 0 : case TYPE_flt:
690 0 : switch (tp) {
691 0 : case TYPE_flt:
692 0 : nils = add_sht_flt_flt(lft, incr1, rgt, incr2,
693 : dst, GDK_flt_max,
694 : ci1, ci2, candoff1, candoff2);
695 0 : break;
696 0 : case TYPE_dbl:
697 0 : nils = add_sht_flt_dbl(lft, incr1, rgt, incr2,
698 : dst, GDK_dbl_max,
699 : ci1, ci2, candoff1, candoff2);
700 0 : break;
701 0 : default:
702 0 : goto unsupported;
703 : }
704 : break;
705 0 : case TYPE_dbl:
706 0 : switch (tp) {
707 0 : case TYPE_dbl:
708 0 : nils = add_sht_dbl_dbl(lft, incr1, rgt, incr2,
709 : dst, GDK_dbl_max,
710 : ci1, ci2, candoff1, candoff2);
711 0 : break;
712 0 : default:
713 0 : goto unsupported;
714 : }
715 0 : break;
716 0 : default:
717 0 : goto unsupported;
718 : }
719 : break;
720 185710 : case TYPE_int:
721 185710 : switch (tp2) {
722 16933 : case TYPE_bte:
723 16933 : switch (tp) {
724 16933 : case TYPE_int:
725 16933 : nils = add_int_bte_int(lft, incr1, rgt, incr2,
726 : dst, GDK_int_max,
727 : ci1, ci2, candoff1, candoff2);
728 16933 : break;
729 0 : case TYPE_lng:
730 0 : nils = add_int_bte_lng(lft, incr1, rgt, incr2,
731 : dst, GDK_lng_max,
732 : ci1, ci2, candoff1, candoff2);
733 0 : break;
734 : #ifdef HAVE_HGE
735 0 : case TYPE_hge:
736 0 : nils = add_int_bte_hge(lft, incr1, rgt, incr2,
737 : dst, GDK_hge_max,
738 : ci1, ci2, candoff1, candoff2);
739 0 : break;
740 : #endif
741 0 : case TYPE_flt:
742 0 : nils = add_int_bte_flt(lft, incr1, rgt, incr2,
743 : dst, GDK_flt_max,
744 : ci1, ci2, candoff1, candoff2);
745 0 : break;
746 0 : case TYPE_dbl:
747 0 : nils = add_int_bte_dbl(lft, incr1, rgt, incr2,
748 : dst, GDK_dbl_max,
749 : ci1, ci2, candoff1, candoff2);
750 0 : break;
751 0 : default:
752 0 : goto unsupported;
753 : }
754 : break;
755 0 : case TYPE_sht:
756 0 : switch (tp) {
757 0 : case TYPE_int:
758 0 : nils = add_int_sht_int(lft, incr1, rgt, incr2,
759 : dst, GDK_int_max,
760 : ci1, ci2, candoff1, candoff2);
761 0 : break;
762 0 : case TYPE_lng:
763 0 : nils = add_int_sht_lng(lft, incr1, rgt, incr2,
764 : dst, GDK_lng_max,
765 : ci1, ci2, candoff1, candoff2);
766 0 : break;
767 : #ifdef HAVE_HGE
768 0 : case TYPE_hge:
769 0 : nils = add_int_sht_hge(lft, incr1, rgt, incr2,
770 : dst, GDK_hge_max,
771 : ci1, ci2, candoff1, candoff2);
772 0 : break;
773 : #endif
774 0 : case TYPE_flt:
775 0 : nils = add_int_sht_flt(lft, incr1, rgt, incr2,
776 : dst, GDK_flt_max,
777 : ci1, ci2, candoff1, candoff2);
778 0 : break;
779 0 : case TYPE_dbl:
780 0 : nils = add_int_sht_dbl(lft, incr1, rgt, incr2,
781 : dst, GDK_dbl_max,
782 : ci1, ci2, candoff1, candoff2);
783 0 : break;
784 0 : default:
785 0 : goto unsupported;
786 : }
787 : break;
788 168777 : case TYPE_int:
789 168777 : switch (tp) {
790 151588 : case TYPE_int:
791 151588 : nils = add_int_int_int(lft, incr1, rgt, incr2,
792 : dst, GDK_int_max,
793 : ci1, ci2, candoff1, candoff2);
794 151588 : break;
795 17189 : case TYPE_lng:
796 17189 : nils = add_int_int_lng(lft, incr1, rgt, incr2,
797 : dst, GDK_lng_max,
798 : ci1, ci2, candoff1, candoff2);
799 17189 : break;
800 : #ifdef HAVE_HGE
801 0 : case TYPE_hge:
802 0 : nils = add_int_int_hge(lft, incr1, rgt, incr2,
803 : dst, GDK_hge_max,
804 : ci1, ci2, candoff1, candoff2);
805 0 : break;
806 : #endif
807 0 : case TYPE_flt:
808 0 : nils = add_int_int_flt(lft, incr1, rgt, incr2,
809 : dst, GDK_flt_max,
810 : ci1, ci2, candoff1, candoff2);
811 0 : break;
812 0 : case TYPE_dbl:
813 0 : nils = add_int_int_dbl(lft, incr1, rgt, incr2,
814 : dst, GDK_dbl_max,
815 : ci1, ci2, candoff1, candoff2);
816 0 : break;
817 0 : default:
818 0 : goto unsupported;
819 : }
820 : break;
821 0 : case TYPE_lng:
822 0 : switch (tp) {
823 0 : case TYPE_lng:
824 0 : nils = add_int_lng_lng(lft, incr1, rgt, incr2,
825 : dst, GDK_lng_max,
826 : ci1, ci2, candoff1, candoff2);
827 0 : break;
828 : #ifdef HAVE_HGE
829 0 : case TYPE_hge:
830 0 : nils = add_int_lng_hge(lft, incr1, rgt, incr2,
831 : dst, GDK_hge_max,
832 : ci1, ci2, candoff1, candoff2);
833 0 : break;
834 : #endif
835 0 : case TYPE_flt:
836 0 : nils = add_int_lng_flt(lft, incr1, rgt, incr2,
837 : dst, GDK_flt_max,
838 : ci1, ci2, candoff1, candoff2);
839 0 : break;
840 0 : case TYPE_dbl:
841 0 : nils = add_int_lng_dbl(lft, incr1, rgt, incr2,
842 : dst, GDK_dbl_max,
843 : ci1, ci2, candoff1, candoff2);
844 0 : break;
845 0 : default:
846 0 : goto unsupported;
847 : }
848 : break;
849 : #ifdef HAVE_HGE
850 0 : case TYPE_hge:
851 0 : switch (tp) {
852 0 : case TYPE_hge:
853 0 : nils = add_int_hge_hge(lft, incr1, rgt, incr2,
854 : dst, GDK_hge_max,
855 : ci1, ci2, candoff1, candoff2);
856 0 : break;
857 0 : case TYPE_flt:
858 0 : nils = add_int_hge_flt(lft, incr1, rgt, incr2,
859 : dst, GDK_flt_max,
860 : ci1, ci2, candoff1, candoff2);
861 0 : break;
862 0 : case TYPE_dbl:
863 0 : nils = add_int_hge_dbl(lft, incr1, rgt, incr2,
864 : dst, GDK_dbl_max,
865 : ci1, ci2, candoff1, candoff2);
866 0 : break;
867 0 : default:
868 0 : goto unsupported;
869 : }
870 : break;
871 : #endif
872 0 : case TYPE_flt:
873 0 : switch (tp) {
874 0 : case TYPE_flt:
875 0 : nils = add_int_flt_flt(lft, incr1, rgt, incr2,
876 : dst, GDK_flt_max,
877 : ci1, ci2, candoff1, candoff2);
878 0 : break;
879 0 : case TYPE_dbl:
880 0 : nils = add_int_flt_dbl(lft, incr1, rgt, incr2,
881 : dst, GDK_dbl_max,
882 : ci1, ci2, candoff1, candoff2);
883 0 : break;
884 0 : default:
885 0 : goto unsupported;
886 : }
887 : break;
888 0 : case TYPE_dbl:
889 0 : switch (tp) {
890 0 : case TYPE_dbl:
891 0 : nils = add_int_dbl_dbl(lft, incr1, rgt, incr2,
892 : dst, GDK_dbl_max,
893 : ci1, ci2, candoff1, candoff2);
894 0 : break;
895 0 : default:
896 0 : goto unsupported;
897 : }
898 0 : break;
899 0 : default:
900 0 : goto unsupported;
901 : }
902 : break;
903 40341 : case TYPE_lng:
904 40341 : switch (tp2) {
905 49 : case TYPE_bte:
906 49 : switch (tp) {
907 49 : case TYPE_lng:
908 49 : nils = add_lng_bte_lng(lft, incr1, rgt, incr2,
909 : dst, GDK_lng_max,
910 : ci1, ci2, candoff1, candoff2);
911 49 : break;
912 : #ifdef HAVE_HGE
913 0 : case TYPE_hge:
914 0 : nils = add_lng_bte_hge(lft, incr1, rgt, incr2,
915 : dst, GDK_hge_max,
916 : ci1, ci2, candoff1, candoff2);
917 0 : break;
918 : #endif
919 0 : case TYPE_flt:
920 0 : nils = add_lng_bte_flt(lft, incr1, rgt, incr2,
921 : dst, GDK_flt_max,
922 : ci1, ci2, candoff1, candoff2);
923 0 : break;
924 0 : case TYPE_dbl:
925 0 : nils = add_lng_bte_dbl(lft, incr1, rgt, incr2,
926 : dst, GDK_dbl_max,
927 : ci1, ci2, candoff1, candoff2);
928 0 : break;
929 0 : default:
930 0 : goto unsupported;
931 : }
932 : break;
933 8 : case TYPE_sht:
934 8 : switch (tp) {
935 8 : case TYPE_lng:
936 8 : nils = add_lng_sht_lng(lft, incr1, rgt, incr2,
937 : dst, GDK_lng_max,
938 : ci1, ci2, candoff1, candoff2);
939 8 : break;
940 : #ifdef HAVE_HGE
941 0 : case TYPE_hge:
942 0 : nils = add_lng_sht_hge(lft, incr1, rgt, incr2,
943 : dst, GDK_hge_max,
944 : ci1, ci2, candoff1, candoff2);
945 0 : break;
946 : #endif
947 0 : case TYPE_flt:
948 0 : nils = add_lng_sht_flt(lft, incr1, rgt, incr2,
949 : dst, GDK_flt_max,
950 : ci1, ci2, candoff1, candoff2);
951 0 : break;
952 0 : case TYPE_dbl:
953 0 : nils = add_lng_sht_dbl(lft, incr1, rgt, incr2,
954 : dst, GDK_dbl_max,
955 : ci1, ci2, candoff1, candoff2);
956 0 : break;
957 0 : default:
958 0 : goto unsupported;
959 : }
960 : break;
961 16 : case TYPE_int:
962 16 : switch (tp) {
963 12 : case TYPE_lng:
964 12 : nils = add_lng_int_lng(lft, incr1, rgt, incr2,
965 : dst, GDK_lng_max,
966 : ci1, ci2, candoff1, candoff2);
967 12 : break;
968 : #ifdef HAVE_HGE
969 4 : case TYPE_hge:
970 4 : nils = add_lng_int_hge(lft, incr1, rgt, incr2,
971 : dst, GDK_hge_max,
972 : ci1, ci2, candoff1, candoff2);
973 4 : break;
974 : #endif
975 0 : case TYPE_flt:
976 0 : nils = add_lng_int_flt(lft, incr1, rgt, incr2,
977 : dst, GDK_flt_max,
978 : ci1, ci2, candoff1, candoff2);
979 0 : break;
980 0 : case TYPE_dbl:
981 0 : nils = add_lng_int_dbl(lft, incr1, rgt, incr2,
982 : dst, GDK_dbl_max,
983 : ci1, ci2, candoff1, candoff2);
984 0 : break;
985 0 : default:
986 0 : goto unsupported;
987 : }
988 : break;
989 40268 : case TYPE_lng:
990 40268 : switch (tp) {
991 40161 : case TYPE_lng:
992 40161 : nils = add_lng_lng_lng(lft, incr1, rgt, incr2,
993 : dst, GDK_lng_max,
994 : ci1, ci2, candoff1, candoff2);
995 40161 : break;
996 : #ifdef HAVE_HGE
997 107 : case TYPE_hge:
998 107 : nils = add_lng_lng_hge(lft, incr1, rgt, incr2,
999 : dst, GDK_hge_max,
1000 : ci1, ci2, candoff1, candoff2);
1001 107 : break;
1002 : #endif
1003 0 : case TYPE_flt:
1004 0 : nils = add_lng_lng_flt(lft, incr1, rgt, incr2,
1005 : dst, GDK_flt_max,
1006 : ci1, ci2, candoff1, candoff2);
1007 0 : break;
1008 0 : case TYPE_dbl:
1009 0 : nils = add_lng_lng_dbl(lft, incr1, rgt, incr2,
1010 : dst, GDK_dbl_max,
1011 : ci1, ci2, candoff1, candoff2);
1012 0 : break;
1013 0 : default:
1014 0 : goto unsupported;
1015 : }
1016 : break;
1017 : #ifdef HAVE_HGE
1018 0 : case TYPE_hge:
1019 0 : switch (tp) {
1020 0 : case TYPE_hge:
1021 0 : nils = add_lng_hge_hge(lft, incr1, rgt, incr2,
1022 : dst, GDK_hge_max,
1023 : ci1, ci2, candoff1, candoff2);
1024 0 : break;
1025 0 : case TYPE_flt:
1026 0 : nils = add_lng_hge_flt(lft, incr1, rgt, incr2,
1027 : dst, GDK_flt_max,
1028 : ci1, ci2, candoff1, candoff2);
1029 0 : break;
1030 0 : case TYPE_dbl:
1031 0 : nils = add_lng_hge_dbl(lft, incr1, rgt, incr2,
1032 : dst, GDK_dbl_max,
1033 : ci1, ci2, candoff1, candoff2);
1034 0 : break;
1035 0 : default:
1036 0 : goto unsupported;
1037 : }
1038 : break;
1039 : #endif
1040 0 : case TYPE_flt:
1041 0 : switch (tp) {
1042 0 : case TYPE_flt:
1043 0 : nils = add_lng_flt_flt(lft, incr1, rgt, incr2,
1044 : dst, GDK_flt_max,
1045 : ci1, ci2, candoff1, candoff2);
1046 0 : break;
1047 0 : case TYPE_dbl:
1048 0 : nils = add_lng_flt_dbl(lft, incr1, rgt, incr2,
1049 : dst, GDK_dbl_max,
1050 : ci1, ci2, candoff1, candoff2);
1051 0 : break;
1052 0 : default:
1053 0 : goto unsupported;
1054 : }
1055 : break;
1056 0 : case TYPE_dbl:
1057 0 : switch (tp) {
1058 0 : case TYPE_dbl:
1059 0 : nils = add_lng_dbl_dbl(lft, incr1, rgt, incr2,
1060 : dst, GDK_dbl_max,
1061 : ci1, ci2, candoff1, candoff2);
1062 0 : break;
1063 0 : default:
1064 0 : goto unsupported;
1065 : }
1066 0 : break;
1067 0 : default:
1068 0 : goto unsupported;
1069 : }
1070 : break;
1071 : #ifdef HAVE_HGE
1072 238 : case TYPE_hge:
1073 238 : switch (tp2) {
1074 3 : case TYPE_bte:
1075 3 : switch (tp) {
1076 3 : case TYPE_hge:
1077 3 : nils = add_hge_bte_hge(lft, incr1, rgt, incr2,
1078 : dst, GDK_hge_max,
1079 : ci1, ci2, candoff1, candoff2);
1080 3 : break;
1081 0 : case TYPE_flt:
1082 0 : nils = add_hge_bte_flt(lft, incr1, rgt, incr2,
1083 : dst, GDK_flt_max,
1084 : ci1, ci2, candoff1, candoff2);
1085 0 : break;
1086 0 : case TYPE_dbl:
1087 0 : nils = add_hge_bte_dbl(lft, incr1, rgt, incr2,
1088 : dst, GDK_dbl_max,
1089 : ci1, ci2, candoff1, candoff2);
1090 0 : break;
1091 0 : default:
1092 0 : goto unsupported;
1093 : }
1094 : break;
1095 0 : case TYPE_sht:
1096 0 : switch (tp) {
1097 0 : case TYPE_hge:
1098 0 : nils = add_hge_sht_hge(lft, incr1, rgt, incr2,
1099 : dst, GDK_hge_max,
1100 : ci1, ci2, candoff1, candoff2);
1101 0 : break;
1102 0 : case TYPE_flt:
1103 0 : nils = add_hge_sht_flt(lft, incr1, rgt, incr2,
1104 : dst, GDK_flt_max,
1105 : ci1, ci2, candoff1, candoff2);
1106 0 : break;
1107 0 : case TYPE_dbl:
1108 0 : nils = add_hge_sht_dbl(lft, incr1, rgt, incr2,
1109 : dst, GDK_dbl_max,
1110 : ci1, ci2, candoff1, candoff2);
1111 0 : break;
1112 0 : default:
1113 0 : goto unsupported;
1114 : }
1115 : break;
1116 0 : case TYPE_int:
1117 0 : switch (tp) {
1118 0 : case TYPE_hge:
1119 0 : nils = add_hge_int_hge(lft, incr1, rgt, incr2,
1120 : dst, GDK_hge_max,
1121 : ci1, ci2, candoff1, candoff2);
1122 0 : break;
1123 0 : case TYPE_flt:
1124 0 : nils = add_hge_int_flt(lft, incr1, rgt, incr2,
1125 : dst, GDK_flt_max,
1126 : ci1, ci2, candoff1, candoff2);
1127 0 : break;
1128 0 : case TYPE_dbl:
1129 0 : nils = add_hge_int_dbl(lft, incr1, rgt, incr2,
1130 : dst, GDK_dbl_max,
1131 : ci1, ci2, candoff1, candoff2);
1132 0 : break;
1133 0 : default:
1134 0 : goto unsupported;
1135 : }
1136 : break;
1137 2 : case TYPE_lng:
1138 2 : switch (tp) {
1139 2 : case TYPE_hge:
1140 2 : nils = add_hge_lng_hge(lft, incr1, rgt, incr2,
1141 : dst, GDK_hge_max,
1142 : ci1, ci2, candoff1, candoff2);
1143 2 : break;
1144 0 : case TYPE_flt:
1145 0 : nils = add_hge_lng_flt(lft, incr1, rgt, incr2,
1146 : dst, GDK_flt_max,
1147 : ci1, ci2, candoff1, candoff2);
1148 0 : break;
1149 0 : case TYPE_dbl:
1150 0 : nils = add_hge_lng_dbl(lft, incr1, rgt, incr2,
1151 : dst, GDK_dbl_max,
1152 : ci1, ci2, candoff1, candoff2);
1153 0 : break;
1154 0 : default:
1155 0 : goto unsupported;
1156 : }
1157 : break;
1158 233 : case TYPE_hge:
1159 233 : switch (tp) {
1160 233 : case TYPE_hge:
1161 233 : nils = add_hge_hge_hge(lft, incr1, rgt, incr2,
1162 : dst, GDK_hge_max,
1163 : ci1, ci2, candoff1, candoff2);
1164 233 : break;
1165 0 : case TYPE_flt:
1166 0 : nils = add_hge_hge_flt(lft, incr1, rgt, incr2,
1167 : dst, GDK_flt_max,
1168 : ci1, ci2, candoff1, candoff2);
1169 0 : break;
1170 0 : case TYPE_dbl:
1171 0 : nils = add_hge_hge_dbl(lft, incr1, rgt, incr2,
1172 : dst, GDK_dbl_max,
1173 : ci1, ci2, candoff1, candoff2);
1174 0 : break;
1175 0 : default:
1176 0 : goto unsupported;
1177 : }
1178 : break;
1179 0 : case TYPE_flt:
1180 0 : switch (tp) {
1181 0 : case TYPE_flt:
1182 0 : nils = add_hge_flt_flt(lft, incr1, rgt, incr2,
1183 : dst, GDK_flt_max,
1184 : ci1, ci2, candoff1, candoff2);
1185 0 : break;
1186 0 : case TYPE_dbl:
1187 0 : nils = add_hge_flt_dbl(lft, incr1, rgt, incr2,
1188 : dst, GDK_dbl_max,
1189 : ci1, ci2, candoff1, candoff2);
1190 0 : break;
1191 0 : default:
1192 0 : goto unsupported;
1193 : }
1194 : break;
1195 0 : case TYPE_dbl:
1196 0 : switch (tp) {
1197 0 : case TYPE_dbl:
1198 0 : nils = add_hge_dbl_dbl(lft, incr1, rgt, incr2,
1199 : dst, GDK_dbl_max,
1200 : ci1, ci2, candoff1, candoff2);
1201 0 : break;
1202 0 : default:
1203 0 : goto unsupported;
1204 : }
1205 0 : break;
1206 0 : default:
1207 0 : goto unsupported;
1208 : }
1209 : break;
1210 : #endif
1211 56 : case TYPE_flt:
1212 56 : switch (tp2) {
1213 0 : case TYPE_bte:
1214 0 : switch (tp) {
1215 0 : case TYPE_flt:
1216 0 : nils = add_flt_bte_flt(lft, incr1, rgt, incr2,
1217 : dst, GDK_flt_max,
1218 : ci1, ci2, candoff1, candoff2);
1219 0 : break;
1220 0 : case TYPE_dbl:
1221 0 : nils = add_flt_bte_dbl(lft, incr1, rgt, incr2,
1222 : dst, GDK_dbl_max,
1223 : ci1, ci2, candoff1, candoff2);
1224 0 : break;
1225 0 : default:
1226 0 : goto unsupported;
1227 : }
1228 : break;
1229 0 : case TYPE_sht:
1230 0 : switch (tp) {
1231 0 : case TYPE_flt:
1232 0 : nils = add_flt_sht_flt(lft, incr1, rgt, incr2,
1233 : dst, GDK_flt_max,
1234 : ci1, ci2, candoff1, candoff2);
1235 0 : break;
1236 0 : case TYPE_dbl:
1237 0 : nils = add_flt_sht_dbl(lft, incr1, rgt, incr2,
1238 : dst, GDK_dbl_max,
1239 : ci1, ci2, candoff1, candoff2);
1240 0 : break;
1241 0 : default:
1242 0 : goto unsupported;
1243 : }
1244 : break;
1245 1 : case TYPE_int:
1246 1 : switch (tp) {
1247 1 : case TYPE_flt:
1248 1 : nils = add_flt_int_flt(lft, incr1, rgt, incr2,
1249 : dst, GDK_flt_max,
1250 : ci1, ci2, candoff1, candoff2);
1251 1 : break;
1252 0 : case TYPE_dbl:
1253 0 : nils = add_flt_int_dbl(lft, incr1, rgt, incr2,
1254 : dst, GDK_dbl_max,
1255 : ci1, ci2, candoff1, candoff2);
1256 0 : break;
1257 0 : default:
1258 0 : goto unsupported;
1259 : }
1260 : break;
1261 0 : case TYPE_lng:
1262 0 : switch (tp) {
1263 0 : case TYPE_flt:
1264 0 : nils = add_flt_lng_flt(lft, incr1, rgt, incr2,
1265 : dst, GDK_flt_max,
1266 : ci1, ci2, candoff1, candoff2);
1267 0 : break;
1268 0 : case TYPE_dbl:
1269 0 : nils = add_flt_lng_dbl(lft, incr1, rgt, incr2,
1270 : dst, GDK_dbl_max,
1271 : ci1, ci2, candoff1, candoff2);
1272 0 : break;
1273 0 : default:
1274 0 : goto unsupported;
1275 : }
1276 : break;
1277 : #ifdef HAVE_HGE
1278 0 : case TYPE_hge:
1279 0 : switch (tp) {
1280 0 : case TYPE_flt:
1281 0 : nils = add_flt_hge_flt(lft, incr1, rgt, incr2,
1282 : dst, GDK_flt_max,
1283 : ci1, ci2, candoff1, candoff2);
1284 0 : break;
1285 0 : case TYPE_dbl:
1286 0 : nils = add_flt_hge_dbl(lft, incr1, rgt, incr2,
1287 : dst, GDK_dbl_max,
1288 : ci1, ci2, candoff1, candoff2);
1289 0 : break;
1290 0 : default:
1291 0 : goto unsupported;
1292 : }
1293 : break;
1294 : #endif
1295 55 : case TYPE_flt:
1296 55 : switch (tp) {
1297 55 : case TYPE_flt:
1298 55 : nils = add_flt_flt_flt(lft, incr1, rgt, incr2,
1299 : dst, GDK_flt_max,
1300 : ci1, ci2, candoff1, candoff2);
1301 55 : break;
1302 0 : case TYPE_dbl:
1303 0 : nils = add_flt_flt_dbl(lft, incr1, rgt, incr2,
1304 : dst, GDK_dbl_max,
1305 : ci1, ci2, candoff1, candoff2);
1306 0 : break;
1307 0 : default:
1308 0 : goto unsupported;
1309 : }
1310 : break;
1311 0 : case TYPE_dbl:
1312 0 : switch (tp) {
1313 0 : case TYPE_dbl:
1314 0 : nils = add_flt_dbl_dbl(lft, incr1, rgt, incr2,
1315 : dst, GDK_dbl_max,
1316 : ci1, ci2, candoff1, candoff2);
1317 0 : break;
1318 0 : default:
1319 0 : goto unsupported;
1320 : }
1321 0 : break;
1322 0 : default:
1323 0 : goto unsupported;
1324 : }
1325 : break;
1326 124 : case TYPE_dbl:
1327 124 : switch (tp2) {
1328 0 : case TYPE_bte:
1329 0 : switch (tp) {
1330 0 : case TYPE_dbl:
1331 0 : nils = add_dbl_bte_dbl(lft, incr1, rgt, incr2,
1332 : dst, GDK_dbl_max,
1333 : ci1, ci2, candoff1, candoff2);
1334 0 : break;
1335 0 : default:
1336 0 : goto unsupported;
1337 : }
1338 0 : break;
1339 0 : case TYPE_sht:
1340 0 : switch (tp) {
1341 0 : case TYPE_dbl:
1342 0 : nils = add_dbl_sht_dbl(lft, incr1, rgt, incr2,
1343 : dst, GDK_dbl_max,
1344 : ci1, ci2, candoff1, candoff2);
1345 0 : break;
1346 0 : default:
1347 0 : goto unsupported;
1348 : }
1349 0 : break;
1350 0 : case TYPE_int:
1351 0 : switch (tp) {
1352 0 : case TYPE_dbl:
1353 0 : nils = add_dbl_int_dbl(lft, incr1, rgt, incr2,
1354 : dst, GDK_dbl_max,
1355 : ci1, ci2, candoff1, candoff2);
1356 0 : break;
1357 0 : default:
1358 0 : goto unsupported;
1359 : }
1360 0 : break;
1361 0 : case TYPE_lng:
1362 0 : switch (tp) {
1363 0 : case TYPE_dbl:
1364 0 : nils = add_dbl_lng_dbl(lft, incr1, rgt, incr2,
1365 : dst, GDK_dbl_max,
1366 : ci1, ci2, candoff1, candoff2);
1367 0 : break;
1368 0 : default:
1369 0 : goto unsupported;
1370 : }
1371 0 : break;
1372 : #ifdef HAVE_HGE
1373 0 : case TYPE_hge:
1374 0 : switch (tp) {
1375 0 : case TYPE_dbl:
1376 0 : nils = add_dbl_hge_dbl(lft, incr1, rgt, incr2,
1377 : dst, GDK_dbl_max,
1378 : ci1, ci2, candoff1, candoff2);
1379 0 : break;
1380 0 : default:
1381 0 : goto unsupported;
1382 : }
1383 0 : break;
1384 : #endif
1385 0 : case TYPE_flt:
1386 0 : switch (tp) {
1387 0 : case TYPE_dbl:
1388 0 : nils = add_dbl_flt_dbl(lft, incr1, rgt, incr2,
1389 : dst, GDK_dbl_max,
1390 : ci1, ci2, candoff1, candoff2);
1391 0 : break;
1392 0 : default:
1393 0 : goto unsupported;
1394 : }
1395 0 : break;
1396 124 : case TYPE_dbl:
1397 124 : switch (tp) {
1398 124 : case TYPE_dbl:
1399 124 : nils = add_dbl_dbl_dbl(lft, incr1, rgt, incr2,
1400 : dst, GDK_dbl_max,
1401 : ci1, ci2, candoff1, candoff2);
1402 124 : break;
1403 0 : default:
1404 0 : goto unsupported;
1405 : }
1406 124 : break;
1407 0 : default:
1408 0 : goto unsupported;
1409 : }
1410 : break;
1411 0 : default:
1412 0 : goto unsupported;
1413 : }
1414 :
1415 : return nils;
1416 :
1417 0 : unsupported:
1418 0 : GDKerror("%s: type combination (add(%s,%s)->%s) not supported.\n",
1419 : func, ATOMname(tp1), ATOMname(tp2), ATOMname(tp));
1420 0 : return BUN_NONE;
1421 : }
1422 :
1423 : static BUN
1424 1070 : addstr_loop(BAT *b1, const char *l, BAT *b2, const char *r, BAT *bn,
1425 : BATiter *b1i, BATiter *b2i,
1426 : struct canditer *restrict ci1, struct canditer *restrict ci2)
1427 : {
1428 1070 : BUN nils = 0, ncand = ci1->ncand;
1429 1070 : char *s;
1430 1070 : size_t slen, llen, rlen;
1431 1070 : oid candoff1, candoff2;
1432 :
1433 1070 : QryCtx *qry_ctx = MT_thread_get_qry_ctx();
1434 :
1435 1070 : assert(b1 != NULL || b2 != NULL); /* at least one not NULL */
1436 1070 : candoff1 = b1 ? b1->hseqbase : 0;
1437 1070 : candoff2 = b2 ? b2->hseqbase : 0;
1438 1070 : slen = 1024;
1439 1070 : s = GDKmalloc(slen);
1440 1069 : if (s == NULL)
1441 : return BUN_NONE;
1442 11942225 : TIMEOUT_LOOP_IDX_DECL(i, ncand, qry_ctx) {
1443 11938288 : oid x1 = canditer_next(ci1) - candoff1;
1444 11802236 : oid x2 = canditer_next(ci2) - candoff2;
1445 11626837 : if (b1)
1446 4432205 : l = BUNtvar(*b1i, x1);
1447 11681752 : if (b2)
1448 8418036 : r = BUNtvar(*b2i, x2);
1449 23296685 : if (strNil(l) || strNil(r)) {
1450 408 : nils++;
1451 408 : if (tfastins_nocheckVAR(bn, i, str_nil) != GDK_SUCCEED)
1452 0 : goto bailout;
1453 : } else {
1454 11648130 : llen = strlen(l);
1455 11648130 : rlen = strlen(r);
1456 11648130 : if (llen + rlen >= slen) {
1457 0 : slen = llen + rlen + 1024;
1458 0 : GDKfree(s);
1459 0 : s = GDKmalloc(slen);
1460 0 : if (s == NULL)
1461 0 : goto bailout;
1462 : }
1463 11648130 : (void) stpcpy(stpcpy(s, l), r);
1464 11648130 : if (tfastins_nocheckVAR(bn, i, s) != GDK_SUCCEED)
1465 0 : goto bailout;
1466 : }
1467 : }
1468 1070 : TIMEOUT_CHECK(qry_ctx,
1469 : GOTO_LABEL_TIMEOUT_HANDLER(bailout, qry_ctx));
1470 1070 : GDKfree(s);
1471 1070 : bn->theap->dirty = true;
1472 1070 : return nils;
1473 :
1474 0 : bailout:
1475 0 : GDKfree(s);
1476 0 : return BUN_NONE;
1477 : }
1478 :
1479 : BAT *
1480 72013 : BATcalcadd(BAT *b1, BAT *b2, BAT *s1, BAT *s2, int tp)
1481 : {
1482 72013 : lng t0 = 0;
1483 72013 : BAT *bn;
1484 72013 : BUN nils;
1485 72013 : struct canditer ci1, ci2;
1486 :
1487 72013 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
1488 :
1489 72013 : BATcheck(b1, NULL);
1490 72013 : BATcheck(b2, NULL);
1491 :
1492 72013 : canditer_init(&ci1, b1, s1);
1493 72070 : canditer_init(&ci2, b2, s2);
1494 72108 : if (ci1.ncand != ci2.ncand || ci1.hseq != ci2.hseq) {
1495 0 : GDKerror("inputs not the same size.\n");
1496 0 : return NULL;
1497 : }
1498 :
1499 72108 : bn = COLnew(ci1.hseq, tp, ci1.ncand, TRANSIENT);
1500 71958 : if (bn == NULL)
1501 : return NULL;
1502 71958 : if (ci1.ncand == 0)
1503 : return bn;
1504 :
1505 45226 : BATiter b1i = bat_iterator(b1);
1506 45289 : BATiter b2i = bat_iterator(b2);
1507 45277 : if (b1i.type == TYPE_str && b2i.type == TYPE_str && tp == TYPE_str) {
1508 342 : nils = addstr_loop(b1, NULL, b2, NULL, bn, &b1i, &b2i, &ci1, &ci2);
1509 : } else {
1510 44935 : nils = add_typeswitchloop(b1i.base, b1i.type, true,
1511 44935 : b2i.base, b2i.type, true,
1512 44935 : Tloc(bn, 0), tp,
1513 : &ci1, &ci2,
1514 : b1->hseqbase, b2->hseqbase, __func__);
1515 : }
1516 :
1517 45174 : if (nils == BUN_NONE) {
1518 0 : BBPunfix(bn->batCacheid);
1519 0 : bat_iterator_end(&b1i);
1520 0 : bat_iterator_end(&b2i);
1521 0 : return NULL;
1522 : }
1523 :
1524 45174 : BATsetcount(bn, ci1.ncand);
1525 :
1526 : /* if both inputs are sorted the same way, and no overflow
1527 : * occurred, the result is also sorted */
1528 22431 : bn->tsorted = (b1i.sorted && b2i.sorted && nils == 0)
1529 48049 : || ci1.ncand <= 1 || nils == ci1.ncand;
1530 10814 : bn->trevsorted = (b1i.revsorted && b2i.revsorted && nils == 0)
1531 47702 : || ci1.ncand <= 1 || nils == ci1.ncand;
1532 45210 : bn->tkey = ci1.ncand <= 1;
1533 45210 : bn->tnil = nils != 0;
1534 45210 : bn->tnonil = nils == 0;
1535 45210 : bat_iterator_end(&b1i);
1536 45248 : bat_iterator_end(&b2i);
1537 :
1538 45291 : TRC_DEBUG(ALGO, "b1=" ALGOBATFMT ",b2=" ALGOBATFMT
1539 : ",s1=" ALGOOPTBATFMT ",s2=" ALGOOPTBATFMT
1540 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
1541 : ALGOBATPAR(b1), ALGOBATPAR(b2),
1542 : ALGOOPTBATPAR(s1), ALGOOPTBATPAR(s2),
1543 : ALGOOPTBATPAR(bn), GDKusec() - t0);
1544 :
1545 : return bn;
1546 : }
1547 :
1548 : BAT *
1549 52785 : BATcalcaddcst(BAT *b, const ValRecord *v, BAT *s, int tp)
1550 : {
1551 52785 : lng t0 = 0;
1552 52785 : BAT *bn;
1553 52785 : BUN nils;
1554 52785 : struct canditer ci;
1555 :
1556 52785 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
1557 :
1558 52785 : BATcheck(b, NULL);
1559 :
1560 52785 : canditer_init(&ci, b, s);
1561 :
1562 52781 : bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
1563 52816 : if (bn == NULL)
1564 : return NULL;
1565 52816 : if (ci.ncand == 0)
1566 : return bn;
1567 :
1568 29419 : BATiter bi = bat_iterator(b);
1569 29433 : if (bi.type == TYPE_str && v->vtype == TYPE_str && tp == TYPE_str) {
1570 446 : nils = addstr_loop(b, NULL, NULL, v->val.sval, bn, &bi, &(BATiter){0}, &ci, &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand});
1571 : } else {
1572 28933 : nils = add_typeswitchloop(bi.base, bi.type, true,
1573 28987 : VALptr(v), v->vtype, false,
1574 28987 : Tloc(bn, 0), tp,
1575 : &ci,
1576 28987 : &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
1577 : b->hseqbase, 0, __func__);
1578 : }
1579 :
1580 29379 : if (nils == BUN_NONE) {
1581 0 : bat_iterator_end(&bi);
1582 0 : BBPunfix(bn->batCacheid);
1583 0 : return NULL;
1584 : }
1585 :
1586 29379 : BATsetcount(bn, ci.ncand);
1587 :
1588 : /* if the input is sorted, and no overflow occurred, the result
1589 : * is also sorted */
1590 11189 : bn->tsorted = (bi.sorted && nils == 0 && bi.type != TYPE_str) ||
1591 29905 : ci.ncand <= 1 || nils == ci.ncand;
1592 4551 : bn->trevsorted = (bi.revsorted && nils == 0 && bi.type != TYPE_str) ||
1593 29855 : ci.ncand <= 1 || nils == ci.ncand;
1594 29400 : bn->tkey = ci.ncand <= 1;
1595 29400 : bn->tnil = nils != 0;
1596 29400 : bn->tnonil = nils == 0;
1597 29400 : bat_iterator_end(&bi);
1598 :
1599 29423 : TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
1600 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
1601 : ALGOBATPAR(b), ALGOOPTBATPAR(s),
1602 : ALGOOPTBATPAR(bn), GDKusec() - t0);
1603 :
1604 : return bn;
1605 : }
1606 :
1607 : BAT *
1608 607 : BATcalccstadd(const ValRecord *v, BAT *b, BAT *s, int tp)
1609 : {
1610 607 : lng t0 = 0;
1611 607 : BAT *bn;
1612 607 : BUN nils;
1613 607 : struct canditer ci;
1614 :
1615 607 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
1616 :
1617 607 : BATcheck(b, NULL);
1618 :
1619 607 : canditer_init(&ci, b, s);
1620 :
1621 607 : bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
1622 608 : if (bn == NULL)
1623 : return NULL;
1624 608 : if (ci.ncand == 0)
1625 : return bn;
1626 :
1627 288 : BATiter bi = bat_iterator(b);
1628 288 : if (bi.type == TYPE_str && v->vtype == TYPE_str && tp == TYPE_str) {
1629 282 : nils = addstr_loop(NULL, v->val.sval, b, NULL, bn, &(BATiter){0}, &bi, &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand}, &ci);
1630 : } else {
1631 6 : nils = add_typeswitchloop(VALptr(v), v->vtype, false,
1632 6 : bi.base, bi.type, true,
1633 6 : Tloc(bn, 0), tp,
1634 6 : &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
1635 : &ci,
1636 : 0, b->hseqbase, __func__);
1637 : }
1638 :
1639 288 : if (nils == BUN_NONE) {
1640 0 : bat_iterator_end(&bi);
1641 0 : BBPunfix(bn->batCacheid);
1642 0 : return NULL;
1643 : }
1644 :
1645 288 : BATsetcount(bn, ci.ncand);
1646 :
1647 : /* if the input is sorted, and no overflow occurred, the result
1648 : * is also sorted */
1649 87 : bn->tsorted = (bi.sorted && nils == 0) ||
1650 289 : ci.ncand <= 1 || nils == ci.ncand;
1651 75 : bn->trevsorted = (bi.revsorted && nils == 0) ||
1652 289 : ci.ncand <= 1 || nils == ci.ncand;
1653 288 : bn->tkey = ci.ncand <= 1;
1654 288 : bn->tnil = nils != 0;
1655 288 : bn->tnonil = nils == 0;
1656 288 : bat_iterator_end(&bi);
1657 :
1658 288 : TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
1659 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
1660 : ALGOBATPAR(b), ALGOOPTBATPAR(s),
1661 : ALGOOPTBATPAR(bn), GDKusec() - t0);
1662 :
1663 : return bn;
1664 : }
1665 :
1666 : gdk_return
1667 151924 : VARcalcadd(ValPtr ret, const ValRecord *lft, const ValRecord *rgt)
1668 : {
1669 151924 : ret->bat = false;
1670 151929 : if (add_typeswitchloop(VALptr(lft), lft->vtype, false,
1671 151933 : VALptr(rgt), rgt->vtype, false,
1672 151924 : VALget(ret), ret->vtype,
1673 151924 : &(struct canditer){.tpe=cand_dense, .ncand=1},
1674 151924 : &(struct canditer){.tpe=cand_dense, .ncand=1},
1675 : 0, 0, __func__) == BUN_NONE)
1676 30 : return GDK_FAIL;
1677 151899 : return GDK_SUCCEED;
1678 : }
1679 :
1680 : static BAT *
1681 0 : BATcalcincrdecr(BAT *b, BAT *s,
1682 : BUN (*typeswitchloop)(const void *, int, bool,
1683 : const void *, int, bool,
1684 : void *, int,
1685 : struct canditer *restrict,
1686 : struct canditer *restrict,
1687 : oid, oid, const char *),
1688 : const char *func)
1689 : {
1690 0 : lng t0 = 0;
1691 0 : BAT *bn;
1692 0 : BUN nils= 0;
1693 0 : struct canditer ci;
1694 :
1695 0 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
1696 :
1697 0 : BATcheck(b, NULL);
1698 :
1699 0 : canditer_init(&ci, b, s);
1700 :
1701 0 : bn = COLnew(ci.hseq, b->ttype, ci.ncand, TRANSIENT);
1702 0 : if (bn == NULL)
1703 : return NULL;
1704 0 : if (ci.ncand == 0)
1705 : return bn;
1706 :
1707 0 : BATiter bi = bat_iterator(b);
1708 0 : nils = (*typeswitchloop)(bi.base, bi.type, true,
1709 0 : &(bte){1}, TYPE_bte, false,
1710 0 : Tloc(bn, 0), bn->ttype,
1711 0 : &(struct canditer){.tpe=cand_dense, .ncand=1},
1712 : &ci,
1713 : 0, b->hseqbase, func);
1714 :
1715 0 : if (nils == BUN_NONE) {
1716 0 : bat_iterator_end(&bi);
1717 0 : BBPunfix(bn->batCacheid);
1718 0 : return NULL;
1719 : }
1720 :
1721 0 : BATsetcount(bn, ci.ncand);
1722 :
1723 : /* if the input is sorted, and no overflow occurred, the result
1724 : * is also sorted */
1725 0 : bn->tsorted = bi.sorted || ci.ncand <= 1 || nils == ci.ncand;
1726 0 : bn->trevsorted = bi.revsorted || ci.ncand <= 1 || nils == ci.ncand;
1727 0 : bn->tkey = ci.ncand <= 1;
1728 0 : bn->tnil = nils != 0;
1729 0 : bn->tnonil = nils == 0;
1730 0 : bat_iterator_end(&bi);
1731 :
1732 0 : TRC_DEBUG(ALGO, "%s: b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
1733 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
1734 : func, ALGOBATPAR(b), ALGOOPTBATPAR(s),
1735 : ALGOOPTBATPAR(bn), GDKusec() - t0);
1736 :
1737 : return bn;
1738 : }
1739 :
1740 : BAT *
1741 0 : BATcalcincr(BAT *b, BAT *s)
1742 : {
1743 0 : return BATcalcincrdecr(b, s, add_typeswitchloop,
1744 : __func__);
1745 : }
1746 :
1747 : gdk_return
1748 17365 : VARcalcincr(ValPtr ret, const ValRecord *v)
1749 : {
1750 17365 : ret->bat = false;
1751 17365 : if (add_typeswitchloop(VALptr(v), v->vtype, false,
1752 17365 : &(bte){1}, TYPE_bte, false,
1753 17365 : VALget(ret), ret->vtype,
1754 17365 : &(struct canditer){.tpe=cand_dense, .ncand=1},
1755 17365 : &(struct canditer){.tpe=cand_dense, .ncand=1},
1756 : 0, 0, __func__) == BUN_NONE)
1757 0 : return GDK_FAIL;
1758 17365 : return GDK_SUCCEED;
1759 : }
1760 :
1761 : /* ---------------------------------------------------------------------- */
1762 : /* subtraction (any numeric type) */
1763 :
1764 : #define SUB_3TYPE(TYPE1, TYPE2, TYPE3, IF) \
1765 : static BUN \
1766 : sub_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1, \
1767 : const TYPE2 *rgt, bool incr2, \
1768 : TYPE3 *restrict dst, TYPE3 max, \
1769 : struct canditer *restrict ci1, \
1770 : struct canditer *restrict ci2, \
1771 : oid candoff1, oid candoff2) \
1772 : { \
1773 : BUN nils = 0; \
1774 : BUN i = 0, j = 0, ncand = ci1->ncand; \
1775 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
1776 : \
1777 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
1778 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
1779 : if (incr1) \
1780 : i = canditer_next_dense(ci1) - candoff1; \
1781 : if (incr2) \
1782 : j = canditer_next_dense(ci2) - candoff2; \
1783 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
1784 : dst[k] = TYPE3##_nil; \
1785 : nils++; \
1786 : } else { \
1787 : SUB##IF##_WITH_CHECK(lft[i], rgt[j], \
1788 : TYPE3, dst[k], \
1789 : max, \
1790 : ON_OVERFLOW(TYPE1, TYPE2, "-")); \
1791 : } \
1792 : } \
1793 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
1794 : } else { \
1795 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
1796 : if (incr1) \
1797 : i = canditer_next(ci1) - candoff1; \
1798 : if (incr2) \
1799 : j = canditer_next(ci2) - candoff2; \
1800 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
1801 : dst[k] = TYPE3##_nil; \
1802 : nils++; \
1803 : } else { \
1804 : SUB##IF##_WITH_CHECK(lft[i], rgt[j], \
1805 : TYPE3, dst[k], \
1806 : max, \
1807 : ON_OVERFLOW(TYPE1, TYPE2, "-")); \
1808 : } \
1809 : } \
1810 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
1811 : } \
1812 : return nils; \
1813 : }
1814 :
1815 : #define SUB_3TYPE_enlarge(TYPE1, TYPE2, TYPE3, IF) \
1816 : static BUN \
1817 : sub_##TYPE1##_##TYPE2##_##TYPE3(const TYPE1 *lft, bool incr1, \
1818 : const TYPE2 *rgt, bool incr2, \
1819 : TYPE3 *restrict dst, TYPE3 max, \
1820 : struct canditer *restrict ci1, \
1821 : struct canditer *restrict ci2, \
1822 : oid candoff1, oid candoff2) \
1823 : { \
1824 : BUN nils = 0; \
1825 : BUN i = 0, j = 0, ncand = ci1->ncand; \
1826 : const bool couldoverflow = (max < (TYPE3) GDK_##TYPE1##_max + (TYPE3) GDK_##TYPE2##_max); \
1827 : QryCtx *qry_ctx = MT_thread_get_qry_ctx(); \
1828 : \
1829 : if (ci1->tpe == cand_dense && ci2->tpe == cand_dense) { \
1830 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
1831 : if (incr1) \
1832 : i = canditer_next_dense(ci1) - candoff1; \
1833 : if (incr2) \
1834 : j = canditer_next_dense(ci2) - candoff2; \
1835 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
1836 : dst[k] = TYPE3##_nil; \
1837 : nils++; \
1838 : } else if (couldoverflow) { \
1839 : SUB##IF##_WITH_CHECK(lft[i], rgt[j], \
1840 : TYPE3, dst[k], \
1841 : max, \
1842 : ON_OVERFLOW(TYPE1, TYPE2, "-")); \
1843 : } else { \
1844 : dst[k] = (TYPE3) lft[i] - rgt[j]; \
1845 : } \
1846 : } \
1847 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
1848 : } else { \
1849 : TIMEOUT_LOOP_IDX_DECL(k, ncand, qry_ctx) { \
1850 : if (incr1) \
1851 : i = canditer_next(ci1) - candoff1; \
1852 : if (incr2) \
1853 : j = canditer_next(ci2) - candoff2; \
1854 : if (is_##TYPE1##_nil(lft[i]) || is_##TYPE2##_nil(rgt[j])) { \
1855 : dst[k] = TYPE3##_nil; \
1856 : nils++; \
1857 : } else if (couldoverflow) { \
1858 : SUB##IF##_WITH_CHECK(lft[i], rgt[j], \
1859 : TYPE3, dst[k], \
1860 : max, \
1861 : ON_OVERFLOW(TYPE1, TYPE2, "-")); \
1862 : } else { \
1863 : dst[k] = (TYPE3) lft[i] - rgt[j]; \
1864 : } \
1865 : } \
1866 : TIMEOUT_CHECK(qry_ctx, TIMEOUT_HANDLER(BUN_NONE, qry_ctx)); \
1867 : } \
1868 : return nils; \
1869 : }
1870 :
1871 1504 : SUB_3TYPE(bte, bte, bte, I)
1872 64 : SUB_3TYPE_enlarge(bte, bte, sht, I)
1873 0 : SUB_3TYPE_enlarge(bte, bte, int, I)
1874 0 : SUB_3TYPE_enlarge(bte, bte, lng, I)
1875 : #ifdef HAVE_HGE
1876 0 : SUB_3TYPE_enlarge(bte, bte, hge, I)
1877 : #endif
1878 0 : SUB_3TYPE_enlarge(bte, bte, flt, F)
1879 0 : SUB_3TYPE_enlarge(bte, bte, dbl, F)
1880 0 : SUB_3TYPE(bte, sht, sht, I)
1881 0 : SUB_3TYPE_enlarge(bte, sht, int, I)
1882 0 : SUB_3TYPE_enlarge(bte, sht, lng, I)
1883 : #ifdef HAVE_HGE
1884 0 : SUB_3TYPE_enlarge(bte, sht, hge, I)
1885 : #endif
1886 0 : SUB_3TYPE_enlarge(bte, sht, flt, F)
1887 0 : SUB_3TYPE_enlarge(bte, sht, dbl, F)
1888 12 : SUB_3TYPE(bte, int, int, I)
1889 0 : SUB_3TYPE_enlarge(bte, int, lng, I)
1890 : #ifdef HAVE_HGE
1891 0 : SUB_3TYPE_enlarge(bte, int, hge, I)
1892 : #endif
1893 0 : SUB_3TYPE_enlarge(bte, int, flt, F)
1894 0 : SUB_3TYPE_enlarge(bte, int, dbl, F)
1895 0 : SUB_3TYPE(bte, lng, lng, I)
1896 : #ifdef HAVE_HGE
1897 0 : SUB_3TYPE_enlarge(bte, lng, hge, I)
1898 : #endif
1899 0 : SUB_3TYPE_enlarge(bte, lng, flt, F)
1900 0 : SUB_3TYPE_enlarge(bte, lng, dbl, F)
1901 : #ifdef HAVE_HGE
1902 0 : SUB_3TYPE(bte, hge, hge, I)
1903 0 : SUB_3TYPE_enlarge(bte, hge, flt, F)
1904 0 : SUB_3TYPE_enlarge(bte, hge, dbl, F)
1905 : #endif
1906 0 : SUB_3TYPE(bte, flt, flt, F)
1907 0 : SUB_3TYPE_enlarge(bte, flt, dbl, F)
1908 0 : SUB_3TYPE(bte, dbl, dbl, F)
1909 0 : SUB_3TYPE(sht, bte, sht, I)
1910 0 : SUB_3TYPE_enlarge(sht, bte, int, I)
1911 0 : SUB_3TYPE_enlarge(sht, bte, lng, I)
1912 : #ifdef HAVE_HGE
1913 0 : SUB_3TYPE_enlarge(sht, bte, hge, I)
1914 : #endif
1915 0 : SUB_3TYPE_enlarge(sht, bte, flt, F)
1916 0 : SUB_3TYPE_enlarge(sht, bte, dbl, F)
1917 420 : SUB_3TYPE(sht, sht, sht, I)
1918 32 : SUB_3TYPE_enlarge(sht, sht, int, I)
1919 0 : SUB_3TYPE_enlarge(sht, sht, lng, I)
1920 : #ifdef HAVE_HGE
1921 0 : SUB_3TYPE_enlarge(sht, sht, hge, I)
1922 : #endif
1923 0 : SUB_3TYPE_enlarge(sht, sht, flt, F)
1924 0 : SUB_3TYPE_enlarge(sht, sht, dbl, F)
1925 0 : SUB_3TYPE(sht, int, int, I)
1926 0 : SUB_3TYPE_enlarge(sht, int, lng, I)
1927 : #ifdef HAVE_HGE
1928 0 : SUB_3TYPE_enlarge(sht, int, hge, I)
1929 : #endif
1930 0 : SUB_3TYPE_enlarge(sht, int, flt, F)
1931 0 : SUB_3TYPE_enlarge(sht, int, dbl, F)
1932 67686 : SUB_3TYPE(sht, lng, lng, I)
1933 : #ifdef HAVE_HGE
1934 0 : SUB_3TYPE_enlarge(sht, lng, hge, I)
1935 : #endif
1936 0 : SUB_3TYPE_enlarge(sht, lng, flt, F)
1937 0 : SUB_3TYPE_enlarge(sht, lng, dbl, F)
1938 : #ifdef HAVE_HGE
1939 0 : SUB_3TYPE(sht, hge, hge, I)
1940 0 : SUB_3TYPE_enlarge(sht, hge, flt, F)
1941 0 : SUB_3TYPE_enlarge(sht, hge, dbl, F)
1942 : #endif
1943 0 : SUB_3TYPE(sht, flt, flt, F)
1944 0 : SUB_3TYPE_enlarge(sht, flt, dbl, F)
1945 0 : SUB_3TYPE(sht, dbl, dbl, F)
1946 0 : SUB_3TYPE(int, bte, int, I)
1947 0 : SUB_3TYPE_enlarge(int, bte, lng, I)
1948 : #ifdef HAVE_HGE
1949 0 : SUB_3TYPE_enlarge(int, bte, hge, I)
1950 : #endif
1951 0 : SUB_3TYPE_enlarge(int, bte, flt, F)
1952 0 : SUB_3TYPE_enlarge(int, bte, dbl, F)
1953 0 : SUB_3TYPE(int, sht, int, I)
1954 0 : SUB_3TYPE_enlarge(int, sht, lng, I)
1955 : #ifdef HAVE_HGE
1956 0 : SUB_3TYPE_enlarge(int, sht, hge, I)
1957 : #endif
1958 0 : SUB_3TYPE_enlarge(int, sht, flt, F)
1959 0 : SUB_3TYPE_enlarge(int, sht, dbl, F)
1960 11392230 : SUB_3TYPE(int, int, int, I)
1961 1162456 : SUB_3TYPE_enlarge(int, int, lng, I)
1962 : #ifdef HAVE_HGE
1963 0 : SUB_3TYPE_enlarge(int, int, hge, I)
1964 : #endif
1965 0 : SUB_3TYPE_enlarge(int, int, flt, F)
1966 0 : SUB_3TYPE_enlarge(int, int, dbl, F)
1967 0 : SUB_3TYPE(int, lng, lng, I)
1968 : #ifdef HAVE_HGE
1969 0 : SUB_3TYPE_enlarge(int, lng, hge, I)
1970 : #endif
1971 0 : SUB_3TYPE_enlarge(int, lng, flt, F)
1972 0 : SUB_3TYPE_enlarge(int, lng, dbl, F)
1973 : #ifdef HAVE_HGE
1974 0 : SUB_3TYPE(int, hge, hge, I)
1975 0 : SUB_3TYPE_enlarge(int, hge, flt, F)
1976 0 : SUB_3TYPE_enlarge(int, hge, dbl, F)
1977 : #endif
1978 0 : SUB_3TYPE(int, flt, flt, F)
1979 0 : SUB_3TYPE_enlarge(int, flt, dbl, F)
1980 0 : SUB_3TYPE(int, dbl, dbl, F)
1981 0 : SUB_3TYPE(lng, bte, lng, I)
1982 : #ifdef HAVE_HGE
1983 0 : SUB_3TYPE_enlarge(lng, bte, hge, I)
1984 : #endif
1985 0 : SUB_3TYPE_enlarge(lng, bte, flt, F)
1986 0 : SUB_3TYPE_enlarge(lng, bte, dbl, F)
1987 0 : SUB_3TYPE(lng, sht, lng, I)
1988 : #ifdef HAVE_HGE
1989 0 : SUB_3TYPE_enlarge(lng, sht, hge, I)
1990 : #endif
1991 0 : SUB_3TYPE_enlarge(lng, sht, flt, F)
1992 0 : SUB_3TYPE_enlarge(lng, sht, dbl, F)
1993 67372 : SUB_3TYPE(lng, int, lng, I)
1994 : #ifdef HAVE_HGE
1995 0 : SUB_3TYPE_enlarge(lng, int, hge, I)
1996 : #endif
1997 0 : SUB_3TYPE_enlarge(lng, int, flt, F)
1998 0 : SUB_3TYPE_enlarge(lng, int, dbl, F)
1999 186358 : SUB_3TYPE(lng, lng, lng, I)
2000 : #ifdef HAVE_HGE
2001 23796583 : SUB_3TYPE_enlarge(lng, lng, hge, I)
2002 : #endif
2003 0 : SUB_3TYPE_enlarge(lng, lng, flt, F)
2004 0 : SUB_3TYPE_enlarge(lng, lng, dbl, F)
2005 : #ifdef HAVE_HGE
2006 0 : SUB_3TYPE(lng, hge, hge, I)
2007 0 : SUB_3TYPE_enlarge(lng, hge, flt, F)
2008 0 : SUB_3TYPE_enlarge(lng, hge, dbl, F)
2009 : #endif
2010 0 : SUB_3TYPE(lng, flt, flt, F)
2011 0 : SUB_3TYPE_enlarge(lng, flt, dbl, F)
2012 0 : SUB_3TYPE(lng, dbl, dbl, F)
2013 : #ifdef HAVE_HGE
2014 0 : SUB_3TYPE(hge, bte, hge, I)
2015 0 : SUB_3TYPE_enlarge(hge, bte, flt, F)
2016 0 : SUB_3TYPE_enlarge(hge, bte, dbl, F)
2017 0 : SUB_3TYPE(hge, sht, hge, I)
2018 0 : SUB_3TYPE_enlarge(hge, sht, flt, F)
2019 0 : SUB_3TYPE_enlarge(hge, sht, dbl, F)
2020 0 : SUB_3TYPE(hge, int, hge, I)
2021 0 : SUB_3TYPE_enlarge(hge, int, flt, F)
2022 0 : SUB_3TYPE_enlarge(hge, int, dbl, F)
2023 12 : SUB_3TYPE(hge, lng, hge, I)
2024 0 : SUB_3TYPE_enlarge(hge, lng, flt, F)
2025 0 : SUB_3TYPE_enlarge(hge, lng, dbl, F)
2026 1779490 : SUB_3TYPE(hge, hge, hge, I)
2027 0 : SUB_3TYPE_enlarge(hge, hge, flt, F)
2028 0 : SUB_3TYPE_enlarge(hge, hge, dbl, F)
2029 0 : SUB_3TYPE(hge, flt, flt, F)
2030 0 : SUB_3TYPE_enlarge(hge, flt, dbl, F)
2031 0 : SUB_3TYPE(hge, dbl, dbl, F)
2032 : #endif
2033 0 : SUB_3TYPE(flt, bte, flt, F)
2034 0 : SUB_3TYPE_enlarge(flt, bte, dbl, F)
2035 0 : SUB_3TYPE(flt, sht, flt, F)
2036 0 : SUB_3TYPE_enlarge(flt, sht, dbl, F)
2037 0 : SUB_3TYPE(flt, int, flt, F)
2038 0 : SUB_3TYPE_enlarge(flt, int, dbl, F)
2039 0 : SUB_3TYPE(flt, lng, flt, F)
2040 0 : SUB_3TYPE_enlarge(flt, lng, dbl, F)
2041 : #ifdef HAVE_HGE
2042 0 : SUB_3TYPE(flt, hge, flt, F)
2043 0 : SUB_3TYPE_enlarge(flt, hge, dbl, F)
2044 : #endif
2045 72 : SUB_3TYPE(flt, flt, flt, F)
2046 0 : SUB_3TYPE_enlarge(flt, flt, dbl, F)
2047 0 : SUB_3TYPE(flt, dbl, dbl, F)
2048 0 : SUB_3TYPE(dbl, bte, dbl, F)
2049 0 : SUB_3TYPE(dbl, sht, dbl, F)
2050 0 : SUB_3TYPE(dbl, int, dbl, F)
2051 0 : SUB_3TYPE(dbl, lng, dbl, F)
2052 : #ifdef HAVE_HGE
2053 0 : SUB_3TYPE(dbl, hge, dbl, F)
2054 : #endif
2055 0 : SUB_3TYPE(dbl, flt, dbl, F)
2056 6002022 : SUB_3TYPE(dbl, dbl, dbl, F)
2057 :
2058 : static BUN
2059 81423 : sub_typeswitchloop(const void *lft, int tp1, bool incr1,
2060 : const void *rgt, int tp2, bool incr2,
2061 : void *restrict dst, int tp,
2062 : struct canditer *restrict ci1, struct canditer *restrict ci2,
2063 : oid candoff1, oid candoff2, const char *func)
2064 : {
2065 81423 : BUN nils;
2066 :
2067 81423 : tp1 = ATOMbasetype(tp1);
2068 81423 : tp2 = ATOMbasetype(tp2);
2069 81423 : tp = ATOMbasetype(tp);
2070 81423 : switch (tp1) {
2071 394 : case TYPE_bte:
2072 394 : switch (tp2) {
2073 391 : case TYPE_bte:
2074 391 : switch (tp) {
2075 376 : case TYPE_bte:
2076 376 : nils = sub_bte_bte_bte(lft, incr1, rgt, incr2,
2077 : dst, GDK_bte_max,
2078 : ci1, ci2, candoff1, candoff2);
2079 376 : break;
2080 15 : case TYPE_sht:
2081 15 : nils = sub_bte_bte_sht(lft, incr1, rgt, incr2,
2082 : dst, GDK_sht_max,
2083 : ci1, ci2, candoff1, candoff2);
2084 15 : break;
2085 0 : case TYPE_int:
2086 0 : nils = sub_bte_bte_int(lft, incr1, rgt, incr2,
2087 : dst, GDK_int_max,
2088 : ci1, ci2, candoff1, candoff2);
2089 0 : break;
2090 0 : case TYPE_lng:
2091 0 : nils = sub_bte_bte_lng(lft, incr1, rgt, incr2,
2092 : dst, GDK_lng_max,
2093 : ci1, ci2, candoff1, candoff2);
2094 0 : break;
2095 : #ifdef HAVE_HGE
2096 0 : case TYPE_hge:
2097 0 : nils = sub_bte_bte_hge(lft, incr1, rgt, incr2,
2098 : dst, GDK_hge_max,
2099 : ci1, ci2, candoff1, candoff2);
2100 0 : break;
2101 : #endif
2102 0 : case TYPE_flt:
2103 0 : nils = sub_bte_bte_flt(lft, incr1, rgt, incr2,
2104 : dst, GDK_flt_max,
2105 : ci1, ci2, candoff1, candoff2);
2106 0 : break;
2107 0 : case TYPE_dbl:
2108 0 : nils = sub_bte_bte_dbl(lft, incr1, rgt, incr2,
2109 : dst, GDK_dbl_max,
2110 : ci1, ci2, candoff1, candoff2);
2111 0 : break;
2112 0 : default:
2113 0 : goto unsupported;
2114 : }
2115 : break;
2116 0 : case TYPE_sht:
2117 0 : switch (tp) {
2118 0 : case TYPE_sht:
2119 0 : nils = sub_bte_sht_sht(lft, incr1, rgt, incr2,
2120 : dst, GDK_sht_max,
2121 : ci1, ci2, candoff1, candoff2);
2122 0 : break;
2123 0 : case TYPE_int:
2124 0 : nils = sub_bte_sht_int(lft, incr1, rgt, incr2,
2125 : dst, GDK_int_max,
2126 : ci1, ci2, candoff1, candoff2);
2127 0 : break;
2128 0 : case TYPE_lng:
2129 0 : nils = sub_bte_sht_lng(lft, incr1, rgt, incr2,
2130 : dst, GDK_lng_max,
2131 : ci1, ci2, candoff1, candoff2);
2132 0 : break;
2133 : #ifdef HAVE_HGE
2134 0 : case TYPE_hge:
2135 0 : nils = sub_bte_sht_hge(lft, incr1, rgt, incr2,
2136 : dst, GDK_hge_max,
2137 : ci1, ci2, candoff1, candoff2);
2138 0 : break;
2139 : #endif
2140 0 : case TYPE_flt:
2141 0 : nils = sub_bte_sht_flt(lft, incr1, rgt, incr2,
2142 : dst, GDK_flt_max,
2143 : ci1, ci2, candoff1, candoff2);
2144 0 : break;
2145 0 : case TYPE_dbl:
2146 0 : nils = sub_bte_sht_dbl(lft, incr1, rgt, incr2,
2147 : dst, GDK_dbl_max,
2148 : ci1, ci2, candoff1, candoff2);
2149 0 : break;
2150 0 : default:
2151 0 : goto unsupported;
2152 : }
2153 : break;
2154 3 : case TYPE_int:
2155 3 : switch (tp) {
2156 3 : case TYPE_int:
2157 3 : nils = sub_bte_int_int(lft, incr1, rgt, incr2,
2158 : dst, GDK_int_max,
2159 : ci1, ci2, candoff1, candoff2);
2160 3 : break;
2161 0 : case TYPE_lng:
2162 0 : nils = sub_bte_int_lng(lft, incr1, rgt, incr2,
2163 : dst, GDK_lng_max,
2164 : ci1, ci2, candoff1, candoff2);
2165 0 : break;
2166 : #ifdef HAVE_HGE
2167 0 : case TYPE_hge:
2168 0 : nils = sub_bte_int_hge(lft, incr1, rgt, incr2,
2169 : dst, GDK_hge_max,
2170 : ci1, ci2, candoff1, candoff2);
2171 0 : break;
2172 : #endif
2173 0 : case TYPE_flt:
2174 0 : nils = sub_bte_int_flt(lft, incr1, rgt, incr2,
2175 : dst, GDK_flt_max,
2176 : ci1, ci2, candoff1, candoff2);
2177 0 : break;
2178 0 : case TYPE_dbl:
2179 0 : nils = sub_bte_int_dbl(lft, incr1, rgt, incr2,
2180 : dst, GDK_dbl_max,
2181 : ci1, ci2, candoff1, candoff2);
2182 0 : break;
2183 0 : default:
2184 0 : goto unsupported;
2185 : }
2186 : break;
2187 0 : case TYPE_lng:
2188 0 : switch (tp) {
2189 0 : case TYPE_lng:
2190 0 : nils = sub_bte_lng_lng(lft, incr1, rgt, incr2,
2191 : dst, GDK_lng_max,
2192 : ci1, ci2, candoff1, candoff2);
2193 0 : break;
2194 : #ifdef HAVE_HGE
2195 0 : case TYPE_hge:
2196 0 : nils = sub_bte_lng_hge(lft, incr1, rgt, incr2,
2197 : dst, GDK_hge_max,
2198 : ci1, ci2, candoff1, candoff2);
2199 0 : break;
2200 : #endif
2201 0 : case TYPE_flt:
2202 0 : nils = sub_bte_lng_flt(lft, incr1, rgt, incr2,
2203 : dst, GDK_flt_max,
2204 : ci1, ci2, candoff1, candoff2);
2205 0 : break;
2206 0 : case TYPE_dbl:
2207 0 : nils = sub_bte_lng_dbl(lft, incr1, rgt, incr2,
2208 : dst, GDK_dbl_max,
2209 : ci1, ci2, candoff1, candoff2);
2210 0 : break;
2211 0 : default:
2212 0 : goto unsupported;
2213 : }
2214 : break;
2215 : #ifdef HAVE_HGE
2216 0 : case TYPE_hge:
2217 0 : switch (tp) {
2218 0 : case TYPE_hge:
2219 0 : nils = sub_bte_hge_hge(lft, incr1, rgt, incr2,
2220 : dst, GDK_hge_max,
2221 : ci1, ci2, candoff1, candoff2);
2222 0 : break;
2223 0 : case TYPE_flt:
2224 0 : nils = sub_bte_hge_flt(lft, incr1, rgt, incr2,
2225 : dst, GDK_flt_max,
2226 : ci1, ci2, candoff1, candoff2);
2227 0 : break;
2228 0 : case TYPE_dbl:
2229 0 : nils = sub_bte_hge_dbl(lft, incr1, rgt, incr2,
2230 : dst, GDK_dbl_max,
2231 : ci1, ci2, candoff1, candoff2);
2232 0 : break;
2233 0 : default:
2234 0 : goto unsupported;
2235 : }
2236 : break;
2237 : #endif
2238 0 : case TYPE_flt:
2239 0 : switch (tp) {
2240 0 : case TYPE_flt:
2241 0 : nils = sub_bte_flt_flt(lft, incr1, rgt, incr2,
2242 : dst, GDK_flt_max,
2243 : ci1, ci2, candoff1, candoff2);
2244 0 : break;
2245 0 : case TYPE_dbl:
2246 0 : nils = sub_bte_flt_dbl(lft, incr1, rgt, incr2,
2247 : dst, GDK_dbl_max,
2248 : ci1, ci2, candoff1, candoff2);
2249 0 : break;
2250 0 : default:
2251 0 : goto unsupported;
2252 : }
2253 : break;
2254 0 : case TYPE_dbl:
2255 0 : switch (tp) {
2256 0 : case TYPE_dbl:
2257 0 : nils = sub_bte_dbl_dbl(lft, incr1, rgt, incr2,
2258 : dst, GDK_dbl_max,
2259 : ci1, ci2, candoff1, candoff2);
2260 0 : break;
2261 0 : default:
2262 0 : goto unsupported;
2263 : }
2264 0 : break;
2265 0 : default:
2266 0 : goto unsupported;
2267 : }
2268 : break;
2269 191 : case TYPE_sht:
2270 191 : switch (tp2) {
2271 0 : case TYPE_bte:
2272 0 : switch (tp) {
2273 0 : case TYPE_sht:
2274 0 : nils = sub_sht_bte_sht(lft, incr1, rgt, incr2,
2275 : dst, GDK_sht_max,
2276 : ci1, ci2, candoff1, candoff2);
2277 0 : break;
2278 0 : case TYPE_int:
2279 0 : nils = sub_sht_bte_int(lft, incr1, rgt, incr2,
2280 : dst, GDK_int_max,
2281 : ci1, ci2, candoff1, candoff2);
2282 0 : break;
2283 0 : case TYPE_lng:
2284 0 : nils = sub_sht_bte_lng(lft, incr1, rgt, incr2,
2285 : dst, GDK_lng_max,
2286 : ci1, ci2, candoff1, candoff2);
2287 0 : break;
2288 : #ifdef HAVE_HGE
2289 0 : case TYPE_hge:
2290 0 : nils = sub_sht_bte_hge(lft, incr1, rgt, incr2,
2291 : dst, GDK_hge_max,
2292 : ci1, ci2, candoff1, candoff2);
2293 0 : break;
2294 : #endif
2295 0 : case TYPE_flt:
2296 0 : nils = sub_sht_bte_flt(lft, incr1, rgt, incr2,
2297 : dst, GDK_flt_max,
2298 : ci1, ci2, candoff1, candoff2);
2299 0 : break;
2300 0 : case TYPE_dbl:
2301 0 : nils = sub_sht_bte_dbl(lft, incr1, rgt, incr2,
2302 : dst, GDK_dbl_max,
2303 : ci1, ci2, candoff1, candoff2);
2304 0 : break;
2305 0 : default:
2306 0 : goto unsupported;
2307 : }
2308 : break;
2309 112 : case TYPE_sht:
2310 112 : switch (tp) {
2311 105 : case TYPE_sht:
2312 105 : nils = sub_sht_sht_sht(lft, incr1, rgt, incr2,
2313 : dst, GDK_sht_max,
2314 : ci1, ci2, candoff1, candoff2);
2315 105 : break;
2316 7 : case TYPE_int:
2317 7 : nils = sub_sht_sht_int(lft, incr1, rgt, incr2,
2318 : dst, GDK_int_max,
2319 : ci1, ci2, candoff1, candoff2);
2320 7 : break;
2321 0 : case TYPE_lng:
2322 0 : nils = sub_sht_sht_lng(lft, incr1, rgt, incr2,
2323 : dst, GDK_lng_max,
2324 : ci1, ci2, candoff1, candoff2);
2325 0 : break;
2326 : #ifdef HAVE_HGE
2327 0 : case TYPE_hge:
2328 0 : nils = sub_sht_sht_hge(lft, incr1, rgt, incr2,
2329 : dst, GDK_hge_max,
2330 : ci1, ci2, candoff1, candoff2);
2331 0 : break;
2332 : #endif
2333 0 : case TYPE_flt:
2334 0 : nils = sub_sht_sht_flt(lft, incr1, rgt, incr2,
2335 : dst, GDK_flt_max,
2336 : ci1, ci2, candoff1, candoff2);
2337 0 : break;
2338 0 : case TYPE_dbl:
2339 0 : nils = sub_sht_sht_dbl(lft, incr1, rgt, incr2,
2340 : dst, GDK_dbl_max,
2341 : ci1, ci2, candoff1, candoff2);
2342 0 : break;
2343 0 : default:
2344 0 : goto unsupported;
2345 : }
2346 : break;
2347 0 : case TYPE_int:
2348 0 : switch (tp) {
2349 0 : case TYPE_int:
2350 0 : nils = sub_sht_int_int(lft, incr1, rgt, incr2,
2351 : dst, GDK_int_max,
2352 : ci1, ci2, candoff1, candoff2);
2353 0 : break;
2354 0 : case TYPE_lng:
2355 0 : nils = sub_sht_int_lng(lft, incr1, rgt, incr2,
2356 : dst, GDK_lng_max,
2357 : ci1, ci2, candoff1, candoff2);
2358 0 : break;
2359 : #ifdef HAVE_HGE
2360 0 : case TYPE_hge:
2361 0 : nils = sub_sht_int_hge(lft, incr1, rgt, incr2,
2362 : dst, GDK_hge_max,
2363 : ci1, ci2, candoff1, candoff2);
2364 0 : break;
2365 : #endif
2366 0 : case TYPE_flt:
2367 0 : nils = sub_sht_int_flt(lft, incr1, rgt, incr2,
2368 : dst, GDK_flt_max,
2369 : ci1, ci2, candoff1, candoff2);
2370 0 : break;
2371 0 : case TYPE_dbl:
2372 0 : nils = sub_sht_int_dbl(lft, incr1, rgt, incr2,
2373 : dst, GDK_dbl_max,
2374 : ci1, ci2, candoff1, candoff2);
2375 0 : break;
2376 0 : default:
2377 0 : goto unsupported;
2378 : }
2379 : break;
2380 79 : case TYPE_lng:
2381 79 : switch (tp) {
2382 79 : case TYPE_lng:
2383 79 : nils = sub_sht_lng_lng(lft, incr1, rgt, incr2,
2384 : dst, GDK_lng_max,
2385 : ci1, ci2, candoff1, candoff2);
2386 79 : break;
2387 : #ifdef HAVE_HGE
2388 0 : case TYPE_hge:
2389 0 : nils = sub_sht_lng_hge(lft, incr1, rgt, incr2,
2390 : dst, GDK_hge_max,
2391 : ci1, ci2, candoff1, candoff2);
2392 0 : break;
2393 : #endif
2394 0 : case TYPE_flt:
2395 0 : nils = sub_sht_lng_flt(lft, incr1, rgt, incr2,
2396 : dst, GDK_flt_max,
2397 : ci1, ci2, candoff1, candoff2);
2398 0 : break;
2399 0 : case TYPE_dbl:
2400 0 : nils = sub_sht_lng_dbl(lft, incr1, rgt, incr2,
2401 : dst, GDK_dbl_max,
2402 : ci1, ci2, candoff1, candoff2);
2403 0 : break;
2404 0 : default:
2405 0 : goto unsupported;
2406 : }
2407 : break;
2408 : #ifdef HAVE_HGE
2409 0 : case TYPE_hge:
2410 0 : switch (tp) {
2411 0 : case TYPE_hge:
2412 0 : nils = sub_sht_hge_hge(lft, incr1, rgt, incr2,
2413 : dst, GDK_hge_max,
2414 : ci1, ci2, candoff1, candoff2);
2415 0 : break;
2416 0 : case TYPE_flt:
2417 0 : nils = sub_sht_hge_flt(lft, incr1, rgt, incr2,
2418 : dst, GDK_flt_max,
2419 : ci1, ci2, candoff1, candoff2);
2420 0 : break;
2421 0 : case TYPE_dbl:
2422 0 : nils = sub_sht_hge_dbl(lft, incr1, rgt, incr2,
2423 : dst, GDK_dbl_max,
2424 : ci1, ci2, candoff1, candoff2);
2425 0 : break;
2426 0 : default:
2427 0 : goto unsupported;
2428 : }
2429 : break;
2430 : #endif
2431 0 : case TYPE_flt:
2432 0 : switch (tp) {
2433 0 : case TYPE_flt:
2434 0 : nils = sub_sht_flt_flt(lft, incr1, rgt, incr2,
2435 : dst, GDK_flt_max,
2436 : ci1, ci2, candoff1, candoff2);
2437 0 : break;
2438 0 : case TYPE_dbl:
2439 0 : nils = sub_sht_flt_dbl(lft, incr1, rgt, incr2,
2440 : dst, GDK_dbl_max,
2441 : ci1, ci2, candoff1, candoff2);
2442 0 : break;
2443 0 : default:
2444 0 : goto unsupported;
2445 : }
2446 : break;
2447 0 : case TYPE_dbl:
2448 0 : switch (tp) {
2449 0 : case TYPE_dbl:
2450 0 : nils = sub_sht_dbl_dbl(lft, incr1, rgt, incr2,
2451 : dst, GDK_dbl_max,
2452 : ci1, ci2, candoff1, candoff2);
2453 0 : break;
2454 0 : default:
2455 0 : goto unsupported;
2456 : }
2457 0 : break;
2458 0 : default:
2459 0 : goto unsupported;
2460 : }
2461 : break;
2462 57222 : case TYPE_int:
2463 57222 : switch (tp2) {
2464 0 : case TYPE_bte:
2465 0 : switch (tp) {
2466 0 : case TYPE_int:
2467 0 : nils = sub_int_bte_int(lft, incr1, rgt, incr2,
2468 : dst, GDK_int_max,
2469 : ci1, ci2, candoff1, candoff2);
2470 0 : break;
2471 0 : case TYPE_lng:
2472 0 : nils = sub_int_bte_lng(lft, incr1, rgt, incr2,
2473 : dst, GDK_lng_max,
2474 : ci1, ci2, candoff1, candoff2);
2475 0 : break;
2476 : #ifdef HAVE_HGE
2477 0 : case TYPE_hge:
2478 0 : nils = sub_int_bte_hge(lft, incr1, rgt, incr2,
2479 : dst, GDK_hge_max,
2480 : ci1, ci2, candoff1, candoff2);
2481 0 : break;
2482 : #endif
2483 0 : case TYPE_flt:
2484 0 : nils = sub_int_bte_flt(lft, incr1, rgt, incr2,
2485 : dst, GDK_flt_max,
2486 : ci1, ci2, candoff1, candoff2);
2487 0 : break;
2488 0 : case TYPE_dbl:
2489 0 : nils = sub_int_bte_dbl(lft, incr1, rgt, incr2,
2490 : dst, GDK_dbl_max,
2491 : ci1, ci2, candoff1, candoff2);
2492 0 : break;
2493 0 : default:
2494 0 : goto unsupported;
2495 : }
2496 : break;
2497 0 : case TYPE_sht:
2498 0 : switch (tp) {
2499 0 : case TYPE_int:
2500 0 : nils = sub_int_sht_int(lft, incr1, rgt, incr2,
2501 : dst, GDK_int_max,
2502 : ci1, ci2, candoff1, candoff2);
2503 0 : break;
2504 0 : case TYPE_lng:
2505 0 : nils = sub_int_sht_lng(lft, incr1, rgt, incr2,
2506 : dst, GDK_lng_max,
2507 : ci1, ci2, candoff1, candoff2);
2508 0 : break;
2509 : #ifdef HAVE_HGE
2510 0 : case TYPE_hge:
2511 0 : nils = sub_int_sht_hge(lft, incr1, rgt, incr2,
2512 : dst, GDK_hge_max,
2513 : ci1, ci2, candoff1, candoff2);
2514 0 : break;
2515 : #endif
2516 0 : case TYPE_flt:
2517 0 : nils = sub_int_sht_flt(lft, incr1, rgt, incr2,
2518 : dst, GDK_flt_max,
2519 : ci1, ci2, candoff1, candoff2);
2520 0 : break;
2521 0 : case TYPE_dbl:
2522 0 : nils = sub_int_sht_dbl(lft, incr1, rgt, incr2,
2523 : dst, GDK_dbl_max,
2524 : ci1, ci2, candoff1, candoff2);
2525 0 : break;
2526 0 : default:
2527 0 : goto unsupported;
2528 : }
2529 : break;
2530 57222 : case TYPE_int:
2531 57222 : switch (tp) {
2532 36397 : case TYPE_int:
2533 36397 : nils = sub_int_int_int(lft, incr1, rgt, incr2,
2534 : dst, GDK_int_max,
2535 : ci1, ci2, candoff1, candoff2);
2536 36397 : break;
2537 20825 : case TYPE_lng:
2538 20825 : nils = sub_int_int_lng(lft, incr1, rgt, incr2,
2539 : dst, GDK_lng_max,
2540 : ci1, ci2, candoff1, candoff2);
2541 20825 : break;
2542 : #ifdef HAVE_HGE
2543 0 : case TYPE_hge:
2544 0 : nils = sub_int_int_hge(lft, incr1, rgt, incr2,
2545 : dst, GDK_hge_max,
2546 : ci1, ci2, candoff1, candoff2);
2547 0 : break;
2548 : #endif
2549 0 : case TYPE_flt:
2550 0 : nils = sub_int_int_flt(lft, incr1, rgt, incr2,
2551 : dst, GDK_flt_max,
2552 : ci1, ci2, candoff1, candoff2);
2553 0 : break;
2554 0 : case TYPE_dbl:
2555 0 : nils = sub_int_int_dbl(lft, incr1, rgt, incr2,
2556 : dst, GDK_dbl_max,
2557 : ci1, ci2, candoff1, candoff2);
2558 0 : break;
2559 0 : default:
2560 0 : goto unsupported;
2561 : }
2562 : break;
2563 0 : case TYPE_lng:
2564 0 : switch (tp) {
2565 0 : case TYPE_lng:
2566 0 : nils = sub_int_lng_lng(lft, incr1, rgt, incr2,
2567 : dst, GDK_lng_max,
2568 : ci1, ci2, candoff1, candoff2);
2569 0 : break;
2570 : #ifdef HAVE_HGE
2571 0 : case TYPE_hge:
2572 0 : nils = sub_int_lng_hge(lft, incr1, rgt, incr2,
2573 : dst, GDK_hge_max,
2574 : ci1, ci2, candoff1, candoff2);
2575 0 : break;
2576 : #endif
2577 0 : case TYPE_flt:
2578 0 : nils = sub_int_lng_flt(lft, incr1, rgt, incr2,
2579 : dst, GDK_flt_max,
2580 : ci1, ci2, candoff1, candoff2);
2581 0 : break;
2582 0 : case TYPE_dbl:
2583 0 : nils = sub_int_lng_dbl(lft, incr1, rgt, incr2,
2584 : dst, GDK_dbl_max,
2585 : ci1, ci2, candoff1, candoff2);
2586 0 : break;
2587 0 : default:
2588 0 : goto unsupported;
2589 : }
2590 : break;
2591 : #ifdef HAVE_HGE
2592 0 : case TYPE_hge:
2593 0 : switch (tp) {
2594 0 : case TYPE_hge:
2595 0 : nils = sub_int_hge_hge(lft, incr1, rgt, incr2,
2596 : dst, GDK_hge_max,
2597 : ci1, ci2, candoff1, candoff2);
2598 0 : break;
2599 0 : case TYPE_flt:
2600 0 : nils = sub_int_hge_flt(lft, incr1, rgt, incr2,
2601 : dst, GDK_flt_max,
2602 : ci1, ci2, candoff1, candoff2);
2603 0 : break;
2604 0 : case TYPE_dbl:
2605 0 : nils = sub_int_hge_dbl(lft, incr1, rgt, incr2,
2606 : dst, GDK_dbl_max,
2607 : ci1, ci2, candoff1, candoff2);
2608 0 : break;
2609 0 : default:
2610 0 : goto unsupported;
2611 : }
2612 : break;
2613 : #endif
2614 0 : case TYPE_flt:
2615 0 : switch (tp) {
2616 0 : case TYPE_flt:
2617 0 : nils = sub_int_flt_flt(lft, incr1, rgt, incr2,
2618 : dst, GDK_flt_max,
2619 : ci1, ci2, candoff1, candoff2);
2620 0 : break;
2621 0 : case TYPE_dbl:
2622 0 : nils = sub_int_flt_dbl(lft, incr1, rgt, incr2,
2623 : dst, GDK_dbl_max,
2624 : ci1, ci2, candoff1, candoff2);
2625 0 : break;
2626 0 : default:
2627 0 : goto unsupported;
2628 : }
2629 : break;
2630 0 : case TYPE_dbl:
2631 0 : switch (tp) {
2632 0 : case TYPE_dbl:
2633 0 : nils = sub_int_dbl_dbl(lft, incr1, rgt, incr2,
2634 : dst, GDK_dbl_max,
2635 : ci1, ci2, candoff1, candoff2);
2636 0 : break;
2637 0 : default:
2638 0 : goto unsupported;
2639 : }
2640 0 : break;
2641 0 : default:
2642 0 : goto unsupported;
2643 : }
2644 : break;
2645 23303 : case TYPE_lng:
2646 23303 : switch (tp2) {
2647 0 : case TYPE_bte:
2648 0 : switch (tp) {
2649 0 : case TYPE_lng:
2650 0 : nils = sub_lng_bte_lng(lft, incr1, rgt, incr2,
2651 : dst, GDK_lng_max,
2652 : ci1, ci2, candoff1, candoff2);
2653 0 : break;
2654 : #ifdef HAVE_HGE
2655 0 : case TYPE_hge:
2656 0 : nils = sub_lng_bte_hge(lft, incr1, rgt, incr2,
2657 : dst, GDK_hge_max,
2658 : ci1, ci2, candoff1, candoff2);
2659 0 : break;
2660 : #endif
2661 0 : case TYPE_flt:
2662 0 : nils = sub_lng_bte_flt(lft, incr1, rgt, incr2,
2663 : dst, GDK_flt_max,
2664 : ci1, ci2, candoff1, candoff2);
2665 0 : break;
2666 0 : case TYPE_dbl:
2667 0 : nils = sub_lng_bte_dbl(lft, incr1, rgt, incr2,
2668 : dst, GDK_dbl_max,
2669 : ci1, ci2, candoff1, candoff2);
2670 0 : break;
2671 0 : default:
2672 0 : goto unsupported;
2673 : }
2674 : break;
2675 0 : case TYPE_sht:
2676 0 : switch (tp) {
2677 0 : case TYPE_lng:
2678 0 : nils = sub_lng_sht_lng(lft, incr1, rgt, incr2,
2679 : dst, GDK_lng_max,
2680 : ci1, ci2, candoff1, candoff2);
2681 0 : break;
2682 : #ifdef HAVE_HGE
2683 0 : case TYPE_hge:
2684 0 : nils = sub_lng_sht_hge(lft, incr1, rgt, incr2,
2685 : dst, GDK_hge_max,
2686 : ci1, ci2, candoff1, candoff2);
2687 0 : break;
2688 : #endif
2689 0 : case TYPE_flt:
2690 0 : nils = sub_lng_sht_flt(lft, incr1, rgt, incr2,
2691 : dst, GDK_flt_max,
2692 : ci1, ci2, candoff1, candoff2);
2693 0 : break;
2694 0 : case TYPE_dbl:
2695 0 : nils = sub_lng_sht_dbl(lft, incr1, rgt, incr2,
2696 : dst, GDK_dbl_max,
2697 : ci1, ci2, candoff1, candoff2);
2698 0 : break;
2699 0 : default:
2700 0 : goto unsupported;
2701 : }
2702 : break;
2703 16805 : case TYPE_int:
2704 16805 : switch (tp) {
2705 16805 : case TYPE_lng:
2706 16805 : nils = sub_lng_int_lng(lft, incr1, rgt, incr2,
2707 : dst, GDK_lng_max,
2708 : ci1, ci2, candoff1, candoff2);
2709 16805 : break;
2710 : #ifdef HAVE_HGE
2711 0 : case TYPE_hge:
2712 0 : nils = sub_lng_int_hge(lft, incr1, rgt, incr2,
2713 : dst, GDK_hge_max,
2714 : ci1, ci2, candoff1, candoff2);
2715 0 : break;
2716 : #endif
2717 0 : case TYPE_flt:
2718 0 : nils = sub_lng_int_flt(lft, incr1, rgt, incr2,
2719 : dst, GDK_flt_max,
2720 : ci1, ci2, candoff1, candoff2);
2721 0 : break;
2722 0 : case TYPE_dbl:
2723 0 : nils = sub_lng_int_dbl(lft, incr1, rgt, incr2,
2724 : dst, GDK_dbl_max,
2725 : ci1, ci2, candoff1, candoff2);
2726 0 : break;
2727 0 : default:
2728 0 : goto unsupported;
2729 : }
2730 : break;
2731 6498 : case TYPE_lng:
2732 6498 : switch (tp) {
2733 6204 : case TYPE_lng:
2734 6204 : nils = sub_lng_lng_lng(lft, incr1, rgt, incr2,
2735 : dst, GDK_lng_max,
2736 : ci1, ci2, candoff1, candoff2);
2737 6204 : break;
2738 : #ifdef HAVE_HGE
2739 294 : case TYPE_hge:
2740 294 : nils = sub_lng_lng_hge(lft, incr1, rgt, incr2,
2741 : dst, GDK_hge_max,
2742 : ci1, ci2, candoff1, candoff2);
2743 294 : break;
2744 : #endif
2745 0 : case TYPE_flt:
2746 0 : nils = sub_lng_lng_flt(lft, incr1, rgt, incr2,
2747 : dst, GDK_flt_max,
2748 : ci1, ci2, candoff1, candoff2);
2749 0 : break;
2750 0 : case TYPE_dbl:
2751 0 : nils = sub_lng_lng_dbl(lft, incr1, rgt, incr2,
2752 : dst, GDK_dbl_max,
2753 : ci1, ci2, candoff1, candoff2);
2754 0 : break;
2755 0 : default:
2756 0 : goto unsupported;
2757 : }
2758 : break;
2759 : #ifdef HAVE_HGE
2760 0 : case TYPE_hge:
2761 0 : switch (tp) {
2762 0 : case TYPE_hge:
2763 0 : nils = sub_lng_hge_hge(lft, incr1, rgt, incr2,
2764 : dst, GDK_hge_max,
2765 : ci1, ci2, candoff1, candoff2);
2766 0 : break;
2767 0 : case TYPE_flt:
2768 0 : nils = sub_lng_hge_flt(lft, incr1, rgt, incr2,
2769 : dst, GDK_flt_max,
2770 : ci1, ci2, candoff1, candoff2);
2771 0 : break;
2772 0 : case TYPE_dbl:
2773 0 : nils = sub_lng_hge_dbl(lft, incr1, rgt, incr2,
2774 : dst, GDK_dbl_max,
2775 : ci1, ci2, candoff1, candoff2);
2776 0 : break;
2777 0 : default:
2778 0 : goto unsupported;
2779 : }
2780 : break;
2781 : #endif
2782 0 : case TYPE_flt:
2783 0 : switch (tp) {
2784 0 : case TYPE_flt:
2785 0 : nils = sub_lng_flt_flt(lft, incr1, rgt, incr2,
2786 : dst, GDK_flt_max,
2787 : ci1, ci2, candoff1, candoff2);
2788 0 : break;
2789 0 : case TYPE_dbl:
2790 0 : nils = sub_lng_flt_dbl(lft, incr1, rgt, incr2,
2791 : dst, GDK_dbl_max,
2792 : ci1, ci2, candoff1, candoff2);
2793 0 : break;
2794 0 : default:
2795 0 : goto unsupported;
2796 : }
2797 : break;
2798 0 : case TYPE_dbl:
2799 0 : switch (tp) {
2800 0 : case TYPE_dbl:
2801 0 : nils = sub_lng_dbl_dbl(lft, incr1, rgt, incr2,
2802 : dst, GDK_dbl_max,
2803 : ci1, ci2, candoff1, candoff2);
2804 0 : break;
2805 0 : default:
2806 0 : goto unsupported;
2807 : }
2808 0 : break;
2809 0 : default:
2810 0 : goto unsupported;
2811 : }
2812 : break;
2813 : #ifdef HAVE_HGE
2814 83 : case TYPE_hge:
2815 83 : switch (tp2) {
2816 0 : case TYPE_bte:
2817 0 : switch (tp) {
2818 0 : case TYPE_hge:
2819 0 : nils = sub_hge_bte_hge(lft, incr1, rgt, incr2,
2820 : dst, GDK_hge_max,
2821 : ci1, ci2, candoff1, candoff2);
2822 0 : break;
2823 0 : case TYPE_flt:
2824 0 : nils = sub_hge_bte_flt(lft, incr1, rgt, incr2,
2825 : dst, GDK_flt_max,
2826 : ci1, ci2, candoff1, candoff2);
2827 0 : break;
2828 0 : case TYPE_dbl:
2829 0 : nils = sub_hge_bte_dbl(lft, incr1, rgt, incr2,
2830 : dst, GDK_dbl_max,
2831 : ci1, ci2, candoff1, candoff2);
2832 0 : break;
2833 0 : default:
2834 0 : goto unsupported;
2835 : }
2836 : break;
2837 0 : case TYPE_sht:
2838 0 : switch (tp) {
2839 0 : case TYPE_hge:
2840 0 : nils = sub_hge_sht_hge(lft, incr1, rgt, incr2,
2841 : dst, GDK_hge_max,
2842 : ci1, ci2, candoff1, candoff2);
2843 0 : break;
2844 0 : case TYPE_flt:
2845 0 : nils = sub_hge_sht_flt(lft, incr1, rgt, incr2,
2846 : dst, GDK_flt_max,
2847 : ci1, ci2, candoff1, candoff2);
2848 0 : break;
2849 0 : case TYPE_dbl:
2850 0 : nils = sub_hge_sht_dbl(lft, incr1, rgt, incr2,
2851 : dst, GDK_dbl_max,
2852 : ci1, ci2, candoff1, candoff2);
2853 0 : break;
2854 0 : default:
2855 0 : goto unsupported;
2856 : }
2857 : break;
2858 0 : case TYPE_int:
2859 0 : switch (tp) {
2860 0 : case TYPE_hge:
2861 0 : nils = sub_hge_int_hge(lft, incr1, rgt, incr2,
2862 : dst, GDK_hge_max,
2863 : ci1, ci2, candoff1, candoff2);
2864 0 : break;
2865 0 : case TYPE_flt:
2866 0 : nils = sub_hge_int_flt(lft, incr1, rgt, incr2,
2867 : dst, GDK_flt_max,
2868 : ci1, ci2, candoff1, candoff2);
2869 0 : break;
2870 0 : case TYPE_dbl:
2871 0 : nils = sub_hge_int_dbl(lft, incr1, rgt, incr2,
2872 : dst, GDK_dbl_max,
2873 : ci1, ci2, candoff1, candoff2);
2874 0 : break;
2875 0 : default:
2876 0 : goto unsupported;
2877 : }
2878 : break;
2879 3 : case TYPE_lng:
2880 3 : switch (tp) {
2881 3 : case TYPE_hge:
2882 3 : nils = sub_hge_lng_hge(lft, incr1, rgt, incr2,
2883 : dst, GDK_hge_max,
2884 : ci1, ci2, candoff1, candoff2);
2885 3 : break;
2886 0 : case TYPE_flt:
2887 0 : nils = sub_hge_lng_flt(lft, incr1, rgt, incr2,
2888 : dst, GDK_flt_max,
2889 : ci1, ci2, candoff1, candoff2);
2890 0 : break;
2891 0 : case TYPE_dbl:
2892 0 : nils = sub_hge_lng_dbl(lft, incr1, rgt, incr2,
2893 : dst, GDK_dbl_max,
2894 : ci1, ci2, candoff1, candoff2);
2895 0 : break;
2896 0 : default:
2897 0 : goto unsupported;
2898 : }
2899 : break;
2900 80 : case TYPE_hge:
2901 80 : switch (tp) {
2902 80 : case TYPE_hge:
2903 80 : nils = sub_hge_hge_hge(lft, incr1, rgt, incr2,
2904 : dst, GDK_hge_max,
2905 : ci1, ci2, candoff1, candoff2);
2906 80 : break;
2907 0 : case TYPE_flt:
2908 0 : nils = sub_hge_hge_flt(lft, incr1, rgt, incr2,
2909 : dst, GDK_flt_max,
2910 : ci1, ci2, candoff1, candoff2);
2911 0 : break;
2912 0 : case TYPE_dbl:
2913 0 : nils = sub_hge_hge_dbl(lft, incr1, rgt, incr2,
2914 : dst, GDK_dbl_max,
2915 : ci1, ci2, candoff1, candoff2);
2916 0 : break;
2917 0 : default:
2918 0 : goto unsupported;
2919 : }
2920 : break;
2921 0 : case TYPE_flt:
2922 0 : switch (tp) {
2923 0 : case TYPE_flt:
2924 0 : nils = sub_hge_flt_flt(lft, incr1, rgt, incr2,
2925 : dst, GDK_flt_max,
2926 : ci1, ci2, candoff1, candoff2);
2927 0 : break;
2928 0 : case TYPE_dbl:
2929 0 : nils = sub_hge_flt_dbl(lft, incr1, rgt, incr2,
2930 : dst, GDK_dbl_max,
2931 : ci1, ci2, candoff1, candoff2);
2932 0 : break;
2933 0 : default:
2934 0 : goto unsupported;
2935 : }
2936 : break;
2937 0 : case TYPE_dbl:
2938 0 : switch (tp) {
2939 0 : case TYPE_dbl:
2940 0 : nils = sub_hge_dbl_dbl(lft, incr1, rgt, incr2,
2941 : dst, GDK_dbl_max,
2942 : ci1, ci2, candoff1, candoff2);
2943 0 : break;
2944 0 : default:
2945 0 : goto unsupported;
2946 : }
2947 0 : break;
2948 0 : default:
2949 0 : goto unsupported;
2950 : }
2951 : break;
2952 : #endif
2953 17 : case TYPE_flt:
2954 17 : switch (tp2) {
2955 0 : case TYPE_bte:
2956 0 : switch (tp) {
2957 0 : case TYPE_flt:
2958 0 : nils = sub_flt_bte_flt(lft, incr1, rgt, incr2,
2959 : dst, GDK_flt_max,
2960 : ci1, ci2, candoff1, candoff2);
2961 0 : break;
2962 0 : case TYPE_dbl:
2963 0 : nils = sub_flt_bte_dbl(lft, incr1, rgt, incr2,
2964 : dst, GDK_dbl_max,
2965 : ci1, ci2, candoff1, candoff2);
2966 0 : break;
2967 0 : default:
2968 0 : goto unsupported;
2969 : }
2970 : break;
2971 0 : case TYPE_sht:
2972 0 : switch (tp) {
2973 0 : case TYPE_flt:
2974 0 : nils = sub_flt_sht_flt(lft, incr1, rgt, incr2,
2975 : dst, GDK_flt_max,
2976 : ci1, ci2, candoff1, candoff2);
2977 0 : break;
2978 0 : case TYPE_dbl:
2979 0 : nils = sub_flt_sht_dbl(lft, incr1, rgt, incr2,
2980 : dst, GDK_dbl_max,
2981 : ci1, ci2, candoff1, candoff2);
2982 0 : break;
2983 0 : default:
2984 0 : goto unsupported;
2985 : }
2986 : break;
2987 0 : case TYPE_int:
2988 0 : switch (tp) {
2989 0 : case TYPE_flt:
2990 0 : nils = sub_flt_int_flt(lft, incr1, rgt, incr2,
2991 : dst, GDK_flt_max,
2992 : ci1, ci2, candoff1, candoff2);
2993 0 : break;
2994 0 : case TYPE_dbl:
2995 0 : nils = sub_flt_int_dbl(lft, incr1, rgt, incr2,
2996 : dst, GDK_dbl_max,
2997 : ci1, ci2, candoff1, candoff2);
2998 0 : break;
2999 0 : default:
3000 0 : goto unsupported;
3001 : }
3002 : break;
3003 0 : case TYPE_lng:
3004 0 : switch (tp) {
3005 0 : case TYPE_flt:
3006 0 : nils = sub_flt_lng_flt(lft, incr1, rgt, incr2,
3007 : dst, GDK_flt_max,
3008 : ci1, ci2, candoff1, candoff2);
3009 0 : break;
3010 0 : case TYPE_dbl:
3011 0 : nils = sub_flt_lng_dbl(lft, incr1, rgt, incr2,
3012 : dst, GDK_dbl_max,
3013 : ci1, ci2, candoff1, candoff2);
3014 0 : break;
3015 0 : default:
3016 0 : goto unsupported;
3017 : }
3018 : break;
3019 : #ifdef HAVE_HGE
3020 0 : case TYPE_hge:
3021 0 : switch (tp) {
3022 0 : case TYPE_flt:
3023 0 : nils = sub_flt_hge_flt(lft, incr1, rgt, incr2,
3024 : dst, GDK_flt_max,
3025 : ci1, ci2, candoff1, candoff2);
3026 0 : break;
3027 0 : case TYPE_dbl:
3028 0 : nils = sub_flt_hge_dbl(lft, incr1, rgt, incr2,
3029 : dst, GDK_dbl_max,
3030 : ci1, ci2, candoff1, candoff2);
3031 0 : break;
3032 0 : default:
3033 0 : goto unsupported;
3034 : }
3035 : break;
3036 : #endif
3037 17 : case TYPE_flt:
3038 17 : switch (tp) {
3039 17 : case TYPE_flt:
3040 17 : nils = sub_flt_flt_flt(lft, incr1, rgt, incr2,
3041 : dst, GDK_flt_max,
3042 : ci1, ci2, candoff1, candoff2);
3043 17 : break;
3044 0 : case TYPE_dbl:
3045 0 : nils = sub_flt_flt_dbl(lft, incr1, rgt, incr2,
3046 : dst, GDK_dbl_max,
3047 : ci1, ci2, candoff1, candoff2);
3048 0 : break;
3049 0 : default:
3050 0 : goto unsupported;
3051 : }
3052 : break;
3053 0 : case TYPE_dbl:
3054 0 : switch (tp) {
3055 0 : case TYPE_dbl:
3056 0 : nils = sub_flt_dbl_dbl(lft, incr1, rgt, incr2,
3057 : dst, GDK_dbl_max,
3058 : ci1, ci2, candoff1, candoff2);
3059 0 : break;
3060 0 : default:
3061 0 : goto unsupported;
3062 : }
3063 0 : break;
3064 0 : default:
3065 0 : goto unsupported;
3066 : }
3067 : break;
3068 213 : case TYPE_dbl:
3069 213 : switch (tp2) {
3070 0 : case TYPE_bte:
3071 0 : switch (tp) {
3072 0 : case TYPE_dbl:
3073 0 : nils = sub_dbl_bte_dbl(lft, incr1, rgt, incr2,
3074 : dst, GDK_dbl_max,
3075 : ci1, ci2, candoff1, candoff2);
3076 0 : break;
3077 0 : default:
3078 0 : goto unsupported;
3079 : }
3080 0 : break;
3081 0 : case TYPE_sht:
3082 0 : switch (tp) {
3083 0 : case TYPE_dbl:
3084 0 : nils = sub_dbl_sht_dbl(lft, incr1, rgt, incr2,
3085 : dst, GDK_dbl_max,
3086 : ci1, ci2, candoff1, candoff2);
3087 0 : break;
3088 0 : default:
3089 0 : goto unsupported;
3090 : }
3091 0 : break;
3092 0 : case TYPE_int:
3093 0 : switch (tp) {
3094 0 : case TYPE_dbl:
3095 0 : nils = sub_dbl_int_dbl(lft, incr1, rgt, incr2,
3096 : dst, GDK_dbl_max,
3097 : ci1, ci2, candoff1, candoff2);
3098 0 : break;
3099 0 : default:
3100 0 : goto unsupported;
3101 : }
3102 0 : break;
3103 0 : case TYPE_lng:
3104 0 : switch (tp) {
3105 0 : case TYPE_dbl:
3106 0 : nils = sub_dbl_lng_dbl(lft, incr1, rgt, incr2,
3107 : dst, GDK_dbl_max,
3108 : ci1, ci2, candoff1, candoff2);
3109 0 : break;
3110 0 : default:
3111 0 : goto unsupported;
3112 : }
3113 0 : break;
3114 : #ifdef HAVE_HGE
3115 0 : case TYPE_hge:
3116 0 : switch (tp) {
3117 0 : case TYPE_dbl:
3118 0 : nils = sub_dbl_hge_dbl(lft, incr1, rgt, incr2,
3119 : dst, GDK_dbl_max,
3120 : ci1, ci2, candoff1, candoff2);
3121 0 : break;
3122 0 : default:
3123 0 : goto unsupported;
3124 : }
3125 0 : break;
3126 : #endif
3127 0 : case TYPE_flt:
3128 0 : switch (tp) {
3129 0 : case TYPE_dbl:
3130 0 : nils = sub_dbl_flt_dbl(lft, incr1, rgt, incr2,
3131 : dst, GDK_dbl_max,
3132 : ci1, ci2, candoff1, candoff2);
3133 0 : break;
3134 0 : default:
3135 0 : goto unsupported;
3136 : }
3137 0 : break;
3138 213 : case TYPE_dbl:
3139 213 : switch (tp) {
3140 213 : case TYPE_dbl:
3141 213 : nils = sub_dbl_dbl_dbl(lft, incr1, rgt, incr2,
3142 : dst, GDK_dbl_max,
3143 : ci1, ci2, candoff1, candoff2);
3144 213 : break;
3145 0 : default:
3146 0 : goto unsupported;
3147 : }
3148 213 : break;
3149 0 : default:
3150 0 : goto unsupported;
3151 : }
3152 : break;
3153 0 : default:
3154 0 : goto unsupported;
3155 : }
3156 :
3157 : return nils;
3158 :
3159 0 : unsupported:
3160 0 : GDKerror("%s: type combination (sub(%s,%s)->%s) not supported.\n",
3161 : func, ATOMname(tp1), ATOMname(tp2), ATOMname(tp));
3162 0 : return BUN_NONE;
3163 : }
3164 :
3165 : BAT *
3166 20964 : BATcalcsub(BAT *b1, BAT *b2, BAT *s1, BAT *s2, int tp)
3167 : {
3168 20964 : lng t0 = 0;
3169 20964 : BAT *bn;
3170 20964 : BUN nils;
3171 20964 : struct canditer ci1, ci2;
3172 :
3173 20964 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
3174 :
3175 20964 : BATcheck(b1, NULL);
3176 20964 : BATcheck(b2, NULL);
3177 :
3178 20964 : canditer_init(&ci1, b1, s1);
3179 20980 : canditer_init(&ci2, b2, s2);
3180 20982 : if (ci1.ncand != ci2.ncand || ci1.hseq != ci2.hseq) {
3181 0 : GDKerror("inputs not the same size.\n");
3182 0 : return NULL;
3183 : }
3184 :
3185 20982 : bn = COLnew(ci1.hseq, tp, ci1.ncand, TRANSIENT);
3186 20958 : if (bn == NULL)
3187 : return NULL;
3188 20958 : if (ci1.ncand == 0)
3189 : return bn;
3190 :
3191 15104 : BATiter b1i = bat_iterator(b1);
3192 15125 : BATiter b2i = bat_iterator(b2);
3193 30223 : nils = sub_typeswitchloop(b1i.base, b1i.type, true,
3194 15125 : b2i.base, b2i.type, true,
3195 15125 : Tloc(bn, 0), tp,
3196 : &ci1, &ci2,
3197 : b1->hseqbase, b2->hseqbase, __func__);
3198 15098 : bat_iterator_end(&b1i);
3199 15109 : bat_iterator_end(&b2i);
3200 :
3201 15105 : if (nils == BUN_NONE) {
3202 0 : BBPunfix(bn->batCacheid);
3203 0 : return NULL;
3204 : }
3205 :
3206 15105 : BATsetcount(bn, ci1.ncand);
3207 :
3208 15116 : bn->tsorted = ci1.ncand <= 1 || nils == ci1.ncand;
3209 15116 : bn->trevsorted = ci1.ncand <= 1 || nils == ci1.ncand;
3210 15116 : bn->tkey = ci1.ncand <= 1;
3211 15116 : bn->tnil = nils != 0;
3212 15116 : bn->tnonil = nils == 0;
3213 :
3214 15116 : TRC_DEBUG(ALGO, "b1=" ALGOBATFMT ",b2=" ALGOBATFMT
3215 : ",s1=" ALGOOPTBATFMT ",s2=" ALGOOPTBATFMT
3216 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
3217 : ALGOBATPAR(b1), ALGOBATPAR(b2),
3218 : ALGOOPTBATPAR(s1), ALGOOPTBATPAR(s2),
3219 : ALGOOPTBATPAR(bn), GDKusec() - t0);
3220 :
3221 : return bn;
3222 : }
3223 :
3224 : BAT *
3225 27264 : BATcalcsubcst(BAT *b, const ValRecord *v, BAT *s, int tp)
3226 : {
3227 27264 : lng t0 = 0;
3228 27264 : BAT *bn;
3229 27264 : BUN nils;
3230 27264 : struct canditer ci;
3231 :
3232 27264 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
3233 :
3234 27264 : BATcheck(b, NULL);
3235 :
3236 27264 : canditer_init(&ci, b, s);
3237 :
3238 27283 : bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
3239 27279 : if (bn == NULL)
3240 : return NULL;
3241 27279 : if (ci.ncand == 0)
3242 : return bn;
3243 :
3244 22266 : BATiter bi = bat_iterator(b);
3245 44513 : nils = sub_typeswitchloop(bi.base, bi.type, true,
3246 22268 : VALptr(v), v->vtype, false,
3247 22268 : Tloc(bn, 0), tp,
3248 : &ci,
3249 22268 : &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
3250 : b->hseqbase, 0, __func__);
3251 :
3252 22245 : if (nils == BUN_NONE) {
3253 0 : bat_iterator_end(&bi);
3254 0 : BBPunfix(bn->batCacheid);
3255 0 : return NULL;
3256 : }
3257 :
3258 22245 : BATsetcount(bn, ci.ncand);
3259 :
3260 : /* if the input is sorted, and no overflow occurred, the result
3261 : * is also sorted */
3262 7901 : bn->tsorted = (bi.sorted && nils == 0) ||
3263 22587 : ci.ncand <= 1 || nils == ci.ncand;
3264 2623 : bn->trevsorted = (bi.revsorted && nils == 0) ||
3265 22509 : ci.ncand <= 1 || nils == ci.ncand;
3266 22256 : bn->tkey = ci.ncand <= 1;
3267 22256 : bn->tnil = nils != 0;
3268 22256 : bn->tnonil = nils == 0;
3269 22256 : bat_iterator_end(&bi);
3270 :
3271 22260 : TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
3272 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
3273 : ALGOBATPAR(b), ALGOOPTBATPAR(s),
3274 : ALGOOPTBATPAR(bn), GDKusec() - t0);
3275 :
3276 : return bn;
3277 : }
3278 :
3279 : BAT *
3280 123 : BATcalccstsub(const ValRecord *v, BAT *b, BAT *s, int tp)
3281 : {
3282 123 : lng t0 = 0;
3283 123 : BAT *bn;
3284 123 : BUN nils;
3285 123 : struct canditer ci;
3286 :
3287 123 : TRC_DEBUG_IF(ALGO) t0 = GDKusec();
3288 :
3289 123 : BATcheck(b, NULL);
3290 :
3291 123 : canditer_init(&ci, b, s);
3292 :
3293 123 : bn = COLnew(ci.hseq, tp, ci.ncand, TRANSIENT);
3294 123 : if (bn == NULL)
3295 : return NULL;
3296 123 : if (ci.ncand == 0)
3297 : return bn;
3298 :
3299 107 : BATiter bi = bat_iterator(b);
3300 214 : nils = sub_typeswitchloop(VALptr(v), v->vtype, false,
3301 107 : bi.base, bi.type, true,
3302 107 : Tloc(bn, 0), tp,
3303 107 : &(struct canditer){.tpe=cand_dense, .ncand=ci.ncand},
3304 : &ci,
3305 : 0, b->hseqbase, __func__);
3306 :
3307 107 : if (nils == BUN_NONE) {
3308 0 : bat_iterator_end(&bi);
3309 0 : BBPunfix(bn->batCacheid);
3310 0 : return NULL;
3311 : }
3312 :
3313 107 : BATsetcount(bn, ci.ncand);
3314 :
3315 : /* if the input is sorted, and no overflow occurred, the result
3316 : * is sorted in the opposite direction (except that NILs mess
3317 : * things up */
3318 103 : bn->tsorted = (nils == 0 && bi.revsorted) ||
3319 179 : ci.ncand <= 1 || nils == ci.ncand;
3320 103 : bn->trevsorted = (nils == 0 && bi.sorted) ||
3321 178 : ci.ncand <= 1 || nils == ci.ncand;
3322 107 : bn->tkey = ci.ncand <= 1;
3323 107 : bn->tnil = nils != 0;
3324 107 : bn->tnonil = nils == 0;
3325 107 : bat_iterator_end(&bi);
3326 :
3327 107 : TRC_DEBUG(ALGO, "b=" ALGOBATFMT ",s=" ALGOOPTBATFMT
3328 : " -> " ALGOOPTBATFMT " " LLFMT "usec\n",
3329 : ALGOBATPAR(b), ALGOOPTBATPAR(s),
3330 : ALGOOPTBATPAR(bn), GDKusec() - t0);
3331 :
3332 : return bn;
3333 : }
3334 :
3335 : gdk_return
3336 43969 : VARcalcsub(ValPtr ret, const ValRecord *lft, const ValRecord *rgt)
3337 : {
3338 43969 : ret->bat = false;
3339 43979 : if (sub_typeswitchloop(VALptr(lft), lft->vtype, false,
3340 44017 : VALptr(rgt), rgt->vtype, false,
3341 43969 : VALget(ret), ret->vtype,
3342 43969 : &(struct canditer){.tpe=cand_dense, .ncand=1},
3343 43969 : &(struct canditer){.tpe=cand_dense, .ncand=1},
3344 : 0, 0, __func__) == BUN_NONE)
3345 2 : return GDK_FAIL;
3346 43977 : return GDK_SUCCEED;
3347 : }
3348 :
3349 : BAT *
3350 0 : BATcalcdecr(BAT *b, BAT *s)
3351 : {
3352 0 : return BATcalcincrdecr(b, s, sub_typeswitchloop,
3353 : __func__);
3354 : }
3355 :
3356 : gdk_return
3357 0 : VARcalcdecr(ValPtr ret, const ValRecord *v)
3358 : {
3359 0 : ret->bat = false;
3360 0 : if (sub_typeswitchloop(VALptr(v), v->vtype, false,
3361 0 : &(bte){1}, TYPE_bte, false,
3362 0 : VALget(ret), ret->vtype,
3363 0 : &(struct canditer){.tpe=cand_dense, .ncand=1},
3364 0 : &(struct canditer){.tpe=cand_dense, .ncand=1},
3365 : 0, 0, __func__) == BUN_NONE)
3366 0 : return GDK_FAIL;
3367 0 : return GDK_SUCCEED;
3368 : }
|