/* * @- * The operator below is only working for a very limited * case. It also re-uses oids, which may become a semantic * problem quickly. */ str DCdeleteUpperSlice(int *ret, int *bid, int *pos) { BAT *b; int *readerT, *writerT; BUN size, i; (void) ret; if ((b = BATdescriptor(*bid)) == NULL) throw(MAL, "dc.deleteUpperSlice", "Cannot access input BAT"); /* check for a failure */ assert(b != NULL); /* remove Hashes etc */ HASHdestroy(b); size = BATcount(b); writerT = (int *) Tloc(b, BUNfirst(b)); readerT = (int *) Tloc(b, BUNfirst(b)) + *pos; for (i = *pos; i < size; i++) *writerT++ = *readerT++; b->batInserted -= *pos; BATsetcount(b, (BUN) (writerT - (int *) Tloc(b, BUNfirst(b)))); BBPunfix(*bid); b->batDirty = TRUE; return MAL_SUCCEED; }
/* * @- * The operator below is only working for a very limited cases. */ str DCreplaceTailBasedOnHead(int *ret, int *res, int *bid) { BAT *b, *r; oid *readerH_b; int *writerT_r, *readerT_b; BUN size_b, size_r, i; (void) ret; if ((b = BATdescriptor(*bid)) == NULL) throw(MAL, "dc.replaceTailBasedOnHead", "Cannot access input BAT"); /* check for a failure */ assert(b != NULL); if ((r = BATdescriptor(*res)) == NULL) throw(MAL, "dc.replaceTailBasedOnHead", "Cannot access result BAT"); /* check for a failure */ assert(r != NULL); /* remove Hashes etc */ HASHdestroy(r); size_r = BATcount(r); size_b = BATcount(b); if ((b->htype == TYPE_void) && (size_b == size_r)) { writerT_r = (int *) Tloc(r, BUNfirst(r)); readerT_b = (int *) Tloc(b, BUNfirst(b)); for (i = 0; i < size_r; i++) { *writerT_r = *readerT_b; writerT_r++; readerT_b++; } } else if ((b->htype != TYPE_void) && (size_b < size_r)) { readerH_b = (oid *) Hloc(b, BUNfirst(b)); readerT_b = (int *) Tloc(b, BUNfirst(b)); for (i = 0; i < size_b; i++) { writerT_r = (int *) Tloc(r, BUNfirst(r)) + *readerH_b; *writerT_r = *readerT_b; readerH_b++; readerT_b++; } } BBPunfix(*bid); BBPunfix(*res); r->batDirty = TRUE; return MAL_SUCCEED; }
gdk_return BATmaterializeh(BAT *b) { int ht; BUN cnt; Heap head; BUN p, q; oid h, *x; bte tshift; BATcheck(b, "BATmaterialize", GDK_FAIL); assert(!isVIEW(b)); ht = b->htype; cnt = BATcapacity(b); head = b->H->heap; p = BUNfirst(b); q = BUNlast(b); assert(cnt >= q - p); ALGODEBUG fprintf(stderr, "#BATmaterialize(%d);\n", (int) b->batCacheid); if (!BAThdense(b) || ht != TYPE_void) { /* no voids */ return GDK_SUCCEED; } ht = TYPE_oid; /* cleanup possible ACC's */ HASHdestroy(b); IMPSdestroy(b); b->H->heap.filename = NULL; if (HEAPalloc(&b->H->heap, cnt, sizeof(oid)) != GDK_SUCCEED) { b->H->heap = head; return GDK_FAIL; } /* point of no return */ b->htype = ht; tshift = b->T->shift; BATsetdims(b); if (b->ttype) { b->T->shift = tshift; /* restore in case it got changed */ b->T->width = 1 << tshift; } b->batDirty = TRUE; b->batDirtydesc = TRUE; b->H->heap.dirty = TRUE; /* set the correct dense info */ b->hdense = TRUE; /* So now generate [h..h+cnt-1] */ h = b->hseqbase; x = (oid *) b->H->heap.base; for (; p < q; p++) *x++ = h++; cnt = h - b->hseqbase; BATsetcount(b, cnt); /* cleanup the old heaps */ HEAPfree(&head, 0); return GDK_SUCCEED; }