Changeset: bc5a0fe5481b for MonetDB URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=bc5a0fe5481b Added Files: gdk/gdk_batop.c Removed Files: gdk/gdk_batop.mx Modified Files: gdk/Makefile.ag Branch: default Log Message:
De-mx gdk_batop. Biggest change: BATins only allows (v)oid-headed inputs. diffs (truncated from 545 to 300 lines): diff --git a/gdk/Makefile.ag b/gdk/Makefile.ag --- a/gdk/Makefile.ag +++ b/gdk/Makefile.ag @@ -34,7 +34,7 @@ lib_gdk = { gdk_scanselect_defs_str.mx \ gdk_scanselect_defs_fix.mx \ gdk_scanselect_defs_var.mx \ - gdk_scanselect.mx gdk.h gdk_batop.mx \ + gdk_scanselect.mx gdk.h gdk_batop.c \ gdk_search.mx gdk_tm.c gdk_align.c gdk_bbp.c gdk_bbp.h \ gdk_heap.c gdk_setop.mx gdk_utils.c gdk_utils.h gdk_atoms.c gdk_atoms.h \ gdk_qsort.c gdk_qsort_impl.h gdk_ssort.c gdk_ssort_impl.h \ diff --git a/gdk/gdk_batop.mx b/gdk/gdk_batop.c rename from gdk/gdk_batop.mx rename to gdk/gdk_batop.c --- a/gdk/gdk_batop.mx +++ b/gdk/gdk_batop.c @@ -1,25 +1,22 @@ -@/ -The contents of this file are subject to the MonetDB Public License -Version 1.1 (the "License"); you may not use this file except in -compliance with the License. You may obtain a copy of the License at -http://www.monetdb.org/Legal/MonetDBLicense +/* + * The contents of this file are subject to the MonetDB Public License + * Version 1.1 (the "License"); you may not use this file except in + * compliance with the License. You may obtain a copy of the License at + * http://www.monetdb.org/Legal/MonetDBLicense + * + * Software distributed under the License is distributed on an "AS IS" + * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the + * License for the specific language governing rights and limitations + * under the License. + * + * The Original Code is the MonetDB Database System. + * + * The Initial Developer of the Original Code is CWI. + * Portions created by CWI are Copyright (C) 1997-July 2008 CWI. + * Copyright August 2008-2012 MonetDB B.V. + * All Rights Reserved. + */ -Software distributed under the License is distributed on an "AS IS" -basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the -License for the specific language governing rights and limitations -under the License. - -The Original Code is the MonetDB Database System. - -The Initial Developer of the Original Code is CWI. -Portions created by CWI are Copyright (C) 1997-July 2008 CWI. -Copyright August 2008-2012 MonetDB B.V. -All Rights Reserved. -@ - -@f gdk_batop - -@c /* * @a M. L. Kersten, P. Boncz, S. Manegold, N. Nes * @* Common BAT Operations @@ -69,157 +66,138 @@ All Rights Reserved. static BAT * insert_string_bat(BAT *b, BAT *n, int append) { - BATiter ni; /* iterators */ - int ht, tt; /* head and tail types */ - size_t hoff = ~(size_t) 0, toff = ~(size_t) 0; /* head and tail offsets */ + BATiter ni; /* iterator */ + int tt; /* tail type */ + size_t toff = ~(size_t) 0; /* tail offset */ BUN p, q; /* loop variables */ oid o = 0; /* in case we're appending */ ptr hp, tp; /* head and tail value pointers */ - unsigned char hbv, tbv; /* head and tail value-as-bte */ - unsigned short hsv, tsv; /* head and tail value-as-sht */ + unsigned char tbv; /* tail value-as-bte */ + unsigned short tsv; /* tail value-as-sht */ #if SIZEOF_VAR_T == 8 - unsigned int hiv, tiv; /* head and tail value-as-int */ + unsigned int tiv; /* tail value-as-int */ #endif - var_t hvv, tvv; /* head and tail value-as-var_t */ var_t v; /* value */ - int nhw, ntw, bhw, btw; /* shortcuts for {b,n}->{H,T}->width */ + int ntw, btw; /* shortcuts for {b,n}->t->width */ - assert(!append || b->H->type == TYPE_void || b->H->type == TYPE_oid); + assert(b->H->type == TYPE_void || b->H->type == TYPE_oid); if (n->batCount == 0) return b; ni = bat_iterator(n); - bhw = b->H->width; btw = b->T->width; - nhw = n->H->width; ntw = n->T->width; hp = NULL; tp = NULL; -@= prep_strapp - @1t = b->@1type; - if (@1t == TYPE_str && - (!GDK_ELIMDOUBLES(b->@2->vheap) || b->batCount == 0) && - !GDK_ELIMDOUBLES(n->@2->vheap) && - b->@2->vheap->hashash == n->@2->vheap->hashash && + if (b->H->type != TYPE_void) { + hp = &o; + o = MAXoid(b); + } + tt = b->ttype; + if (tt == TYPE_str && + (!GDK_ELIMDOUBLES(b->T->vheap) || b->batCount == 0) && + !GDK_ELIMDOUBLES(n->T->vheap) && + b->T->vheap->hashash == n->T->vheap->hashash && /* if needs to be kept unique, take slow path */ - (b->@1key & BOUND2BTRUE) == 0 && + (b->tkey & BOUND2BTRUE) == 0 && /* if view, only copy if significant part of parent is used */ - (VIEW@1parent(n) == 0 || - BATcapacity(BBP_cache(VIEW@1parent(n))) < 2 * BATcount(n))) { + (VIEWtparent(n) == 0 || + BATcapacity(BBP_cache(VIEWtparent(n))) < 2 * BATcount(n))) { /* append string heaps */ - @1off = b->batCount == 0 ? 0 : b->@2->vheap->free; + toff = b->batCount == 0 ? 0 : b->T->vheap->free; /* make sure we get alignment right */ - @1off = (@1off + GDK_VARALIGN - 1) & ~(GDK_VARALIGN - 1); - assert(((@1off >> GDK_VARSHIFT) << GDK_VARSHIFT) == @1off); - if (HEAPextend(b->@2->vheap, @1off + n->@2->vheap->size) < 0) { - @1off = ~ (size_t) 0; + toff = (toff + GDK_VARALIGN - 1) & ~(GDK_VARALIGN - 1); + assert(((toff >> GDK_VARSHIFT) << GDK_VARSHIFT) == toff); + if (HEAPextend(b->T->vheap, toff + n->T->vheap->size) < 0) { + toff = ~ (size_t) 0; goto bunins_failed; } - memcpy(b->@2->vheap->base + @1off, n->@2->vheap->base, n->@2->vheap->size); - b->@2->vheap->free = @1off + n->@2->vheap->free; + memcpy(b->T->vheap->base + toff, n->T->vheap->base, n->T->vheap->size); + b->T->vheap->free = toff + n->T->vheap->free; /* flush double-elimination hash table */ - memset(b->@2->vheap->base, 0, GDK_STRHASHSIZE); - if (b->@2->width < SIZEOF_VAR_T && - ((size_t) 1 << 8 * b->@2->width) < (b->@2->width <= 2 ? (b->@2->vheap->size >> GDK_VARSHIFT) - GDK_VAROFFSET : (b->@2->vheap->size >> GDK_VARSHIFT))) { + memset(b->T->vheap->base, 0, GDK_STRHASHSIZE); + if (b->T->width < SIZEOF_VAR_T && + ((size_t) 1 << 8 * b->T->width) < (b->T->width <= 2 ? (b->T->vheap->size >> GDK_VARSHIFT) - GDK_VAROFFSET : (b->T->vheap->size >> GDK_VARSHIFT))) { /* offsets aren't going to fit */ - if (GDKupgradevarheap(b->@2, (var_t) (b->@2->vheap->size >> GDK_VARSHIFT), 0) == GDK_FAIL) { - @1off = ~ (size_t) 0; + if (GDKupgradevarheap(b->T, (var_t) (b->T->vheap->size >> GDK_VARSHIFT), 0) == GDK_FAIL) { + toff = ~ (size_t) 0; goto bunins_failed; } - b@1w = b->@2->width; + btw = b->T->width; } - switch (b@1w) { + switch (btw) { case 1: - @1t = TYPE_bte; + tt = TYPE_bte; break; case 2: - @1t = TYPE_sht; + tt = TYPE_sht; break; #if SIZEOF_VAR_T == 8 case 4: - @1t = TYPE_int; + tt = TYPE_int; break; #endif default: - @1t = TYPE_var; + tt = TYPE_var; break; } - b->@2->varsized = 0; - n->@2->varsized = 0; - b->@2->type = @1t; + b->T->varsized = 0; + n->T->varsized = 0; + b->T->type = tt; } -@ -@c - if (!append) { - @:prep_strapp(h,H)@ - } else if (b->H->type != TYPE_void) { - hp = &o; - o = MAXoid(b); - } - @:prep_strapp(t,T)@ BATloop(n, p, q) { -@= read_strapp - @1p = b->@2->type ? BUN@3(ni, p) : NULL; - if (@1off != ~ (size_t) 0) { - assert(@1p != NULL); - switch (n@1w) { + if (!append) + hp = b->H->type ? BUNhloc(ni, p) : NULL; + + tp = b->T->type ? BUNtail(ni, p) : NULL; + if (toff != ~ (size_t) 0) { + assert(tp != NULL); + switch (ntw) { case 1: - v = (var_t) * (unsigned char *) @1p + GDK_VAROFFSET; + v = (var_t) * (unsigned char *) tp + GDK_VAROFFSET; break; case 2: - v = (var_t) * (unsigned short *) @1p + GDK_VAROFFSET; + v = (var_t) * (unsigned short *) tp + GDK_VAROFFSET; break; #if SIZEOF_VAR_T == 8 case 4: - v = (var_t) * (unsigned int *) @1p; + v = (var_t) * (unsigned int *) tp; break; #endif default: - v = * (var_t *) @1p; + v = * (var_t *) tp; break; } - v = (var_t) ((((size_t) v << GDK_VARSHIFT) + @1off) >> GDK_VARSHIFT); + v = (var_t) ((((size_t) v << GDK_VARSHIFT) + toff) >> GDK_VARSHIFT); assert(v >= GDK_VAROFFSET); - assert(((size_t) v << GDK_VARSHIFT) < b->@2->vheap->free); - switch (b@1w) { + assert(((size_t) v << GDK_VARSHIFT) < b->T->vheap->free); + switch (btw) { case 1: assert(v - GDK_VAROFFSET < ((var_t) 1 << 8)); - @1bv = (unsigned char) (v - GDK_VAROFFSET); - @1p = (ptr) &@1bv; + tbv = (unsigned char) (v - GDK_VAROFFSET); + tp = (ptr) &tbv; break; case 2: assert(v - GDK_VAROFFSET < ((var_t) 1 << 16)); - @1sv = (unsigned short) (v - GDK_VAROFFSET); - @1p = (ptr) &@1sv; + tsv = (unsigned short) (v - GDK_VAROFFSET); + tp = (ptr) &tsv; break; #if SIZEOF_VAR_T == 8 case 4: assert(v < ((var_t) 1 << 32)); - @1iv = (unsigned int) v; - @1p = (ptr) &@1iv; + tiv = (unsigned int) v; + tp = (ptr) &tiv; break; #endif default: - @1vv = v; - @1p = (ptr) &@1vv; + tp = (ptr) &v; break; } } -@ -@c - if (!append) { - @:read_strapp(h,H,head)@ - } - @:read_strapp(t,T,tail)@ bunfastins(b, hp, tp); if (append) o++; } - if (hoff != ~(size_t) 0) { - b->H->varsized = 1; - n->H->varsized = 1; - b->H->type = TYPE_str; - } if (toff != ~(size_t) 0) { b->T->varsized = 1; n->T->varsized = 1; @@ -227,11 +205,6 @@ insert_string_bat(BAT *b, BAT *n, int ap } return b; bunins_failed: - if (hoff != ~(size_t) 0) { - b->H->varsized = 1; - n->H->varsized = 1; - b->H->type = TYPE_str; - } if (toff != ~(size_t) 0) { b->T->varsized = 1; n->T->varsized = 1; @@ -251,6 +224,10 @@ BATins(BAT *b, BAT *n, bit force) if (b == NULL || n == NULL || BATcount(n) == 0) { return b; } + if (b->htype != TYPE_void && b->htype != TYPE_oid) { + GDKerror("BATins: input must be (V)OID headed\n"); + return NULL; _______________________________________________ Checkin-list mailing list Checkin-list@monetdb.org http://mail.monetdb.org/mailman/listinfo/checkin-list