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