Changeset: 32b7c57326d8 for MonetDB URL: https://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=32b7c57326d8 Modified Files: gdk/gdk_calc.c Branch: msk-type Log Message:
Implemented conversion to and from msk type.
diffs (truncated from 491 to 300 lines):
diff --git a/gdk/gdk_calc.c b/gdk/gdk_calc.c
--- a/gdk/gdk_calc.c
+++ b/gdk/gdk_calc.c
@@ -13654,7 +13654,7 @@ BATcalcifthencstelsecst(BAT *b, const Va
#define convertimpl_copy(TYPE) \
static BUN \
-convert_##TYPE##_##TYPE(const TYPE *src, TYPE *restrict dst, \
+convert_##TYPE##_##TYPE(const TYPE *restrict src, TYPE *restrict dst, \
struct canditer *restrict ci, \
const bit *restrict rv, \
oid candoff, bool *reduce) \
@@ -13682,7 +13682,7 @@ convert_##TYPE##_##TYPE(const TYPE *src,
#define convertimpl_enlarge(TYPE1, TYPE2) \
static BUN \
-convert_##TYPE1##_##TYPE2(const TYPE1 *src, TYPE2 *restrict dst, \
+convert_##TYPE1##_##TYPE2(const TYPE1 *restrict src, TYPE2 *restrict dst, \
struct canditer *restrict ci, \
const bit *restrict rv, \
oid candoff, bool *reduce) \
@@ -13716,7 +13716,7 @@ convert_##TYPE1##_##TYPE2(const TYPE1 *s
#define convertimpl_enlarge_float(TYPE1, TYPE2, MANT_DIG) \
static BUN \
-convert_##TYPE1##_##TYPE2(const TYPE1 *src, TYPE2 *restrict dst, \
+convert_##TYPE1##_##TYPE2(const TYPE1 *restrict src, TYPE2 *restrict dst, \
struct canditer *restrict ci, \
const bit *restrict rv, \
oid candoff, bool *reduce) \
@@ -13758,7 +13758,7 @@ convert_##TYPE1##_##TYPE2(const TYPE1 *s
#define convertimpl_oid_enlarge(TYPE1) \
static BUN \
-convert_##TYPE1##_oid(const TYPE1 *src, oid *restrict dst, \
+convert_##TYPE1##_oid(const TYPE1 *restrict src, oid *restrict dst, \
struct canditer *restrict ci, \
const bit *restrict rv, \
oid candoff, bool abort_on_error, bool *reduce) \
@@ -13807,7 +13807,7 @@ convert_##TYPE1##_oid(const TYPE1 *src,
#define convertimpl_oid_reduce(TYPE1) \
static BUN \
-convert_##TYPE1##_oid(const TYPE1 *src, oid *restrict dst, \
+convert_##TYPE1##_oid(const TYPE1 *restrict src, oid *restrict dst, \
struct canditer *restrict ci, \
const bit *restrict rv, \
oid candoff, bool abort_on_error, bool *reduce) \
@@ -13858,7 +13858,7 @@ convert_##TYPE1##_oid(const TYPE1 *src,
#define convertimpl_reduce(TYPE1, TYPE2) \
static BUN \
-convert_##TYPE1##_##TYPE2(const TYPE1 *src, TYPE2 *restrict dst, \
+convert_##TYPE1##_##TYPE2(const TYPE1 *restrict src, TYPE2 *restrict dst, \
struct canditer *restrict ci, \
const bit *restrict rv, \
oid candoff, bool abort_on_error, bool *reduce) \
@@ -13918,7 +13918,7 @@ convert_##TYPE1##_##TYPE2(const TYPE1 *s
#define convertimpl_reduce_float(TYPE1, TYPE2) \
static BUN \
-convert_##TYPE1##_##TYPE2(const TYPE1 *src, TYPE2 *restrict dst, \
+convert_##TYPE1##_##TYPE2(const TYPE1 *restrict src, TYPE2 *restrict dst, \
struct canditer *restrict ci, \
const bit *restrict rv, \
oid candoff, bool abort_on_error, bool *reduce) \
@@ -13973,7 +13973,7 @@ convert_##TYPE1##_##TYPE2(const TYPE1 *s
#define convert2bit_impl(TYPE) \
static BUN \
-convert_##TYPE##_bit(const TYPE *src, bit *restrict dst, \
+convert_##TYPE##_bit(const TYPE *restrict src, bit *restrict dst, \
struct canditer *restrict ci, \
const bit *restrict rv, \
oid candoff, bool *reduce) \
@@ -14006,6 +14006,119 @@ convert_##TYPE##_bit(const TYPE *src, bi
return nils; \
}
+#define convertimpl_msk(TYPE) \
+static BUN \
+convert_##TYPE##_msk(const TYPE *restrict src, uint32_t *restrict dst, \
+ struct canditer *restrict ci, const bit *restrict rv, \
+ oid candoff, bool *reduce) \
+{ \
+ BUN cnt = ci->ncand / 32; \
+ BUN i, j, k; \
+ uint32_t mask; \
+ oid x; \
+ \
+ *reduce = true; \
+ k = 0; \
+ if (ci->tpe == cand_dense) { \
+ for (i = 0; i < cnt; i++) { \
+ mask = 0; \
+ for (j = 0; j < 32; j++) { \
+ x = canditer_next_dense(ci) - candoff; \
+ mask |= (uint32_t) ((rv == NULL || rv[k]) &&
!is_##TYPE##_nil(src[x]) && src[x] != 0) << j; \
+ k++; \
+ } \
+ dst[i] = mask; \
+ } \
+ cnt = ci->ncand % 32; \
+ if (cnt > 0) { \
+ mask = 0; \
+ for (j = 0; j < cnt; j++) { \
+ x = canditer_next_dense(ci) - candoff; \
+ mask |= (uint32_t) ((rv == NULL || rv[i]) &&
!is_##TYPE##_nil(src[x]) && src[x] != 0) << j; \
+ k++; \
+ } \
+ dst[i] = mask; \
+ } \
+ } else { \
+ for (i = 0; i < cnt; i++) { \
+ mask = 0; \
+ for (j = 0; j < 32; j++) { \
+ x = canditer_next(ci) - candoff; \
+ mask |= (uint32_t) ((rv == NULL || rv[k]) &&
!is_##TYPE##_nil(src[x]) && src[x] != 0) << j; \
+ k++; \
+ } \
+ dst[i] = mask; \
+ } \
+ cnt = ci->ncand % 32; \
+ if (cnt > 0) { \
+ mask = 0; \
+ for (j = 0; j < cnt; j++) { \
+ x = canditer_next(ci) - candoff; \
+ mask |= (uint32_t) ((rv == NULL || rv[i]) &&
!is_##TYPE##_nil(src[x]) && src[x] != 0) << j; \
+ k++; \
+ } \
+ dst[i] = mask; \
+ } \
+ } \
+ return 0; \
+} \
+ \
+static BUN \
+convert_msk_##TYPE(const uint32_t *restrict src, TYPE *restrict dst, \
+ struct canditer *restrict ci, const bit *restrict rv, \
+ oid candoff, bool *reduce) \
+{ \
+ BUN nils = 0; \
+ BUN k; \
+ \
+ *reduce = false; \
+ if (ci->tpe == cand_dense) { \
+ uint32_t mask; \
+ BUN i = (ci->seq - candoff) / 32; \
+ BUN cnt = (ci->seq + ci->ncand - candoff) / 32; \
+ BUN first = (ci->seq - candoff) % 32; \
+ BUN rem = (ci->seq + ci->ncand - candoff) % 32; \
+ BUN j; \
+ k = 0; \
+ for (; i < cnt; i++) { \
+ mask = src[i]; \
+ for (j = first; j < 32; j++) { \
+ if (rv && !rv[k]) { \
+ dst[k] = TYPE##_nil; \
+ nils++; \
+ } else { \
+ dst[k] = (mask & (1U << j)) != 0; \
+ } \
+ k++; \
+ } \
+ first = 0; \
+ } \
+ if (rem > first) { \
+ mask = src[i]; \
+ for (j = first; j < rem; j++) { \
+ if (rv && !rv[k]) { \
+ dst[k] = TYPE##_nil; \
+ nils++; \
+ } else { \
+ dst[k] = (mask & (1U << j)) != 0; \
+ } \
+ k++; \
+ } \
+ } \
+ } else { \
+ for (k = 0; k < ci->ncand; k++) { \
+ oid x = canditer_next(ci) - candoff; \
+ if (rv != NULL && !rv[k]) { \
+ dst[k] = TYPE##_nil; \
+ nils++; \
+ } else { \
+ dst[k] = (src[x / 32] & (1U << (x % 32))) != 0;
\
+ } \
+ } \
+ } \
+ return nils; \
+}
+
convertimpl_copy(bte)
convertimpl_enlarge(bte, sht)
convertimpl_enlarge(bte, int)
@@ -14100,6 +14213,16 @@ convert2bit_impl(hge)
convert2bit_impl(flt)
convert2bit_impl(dbl)
+convertimpl_msk(bte)
+convertimpl_msk(sht)
+convertimpl_msk(int)
+convertimpl_msk(lng)
+#ifdef HAVE_HGE
+convertimpl_msk(hge)
+#endif
+convertimpl_msk(flt)
+convertimpl_msk(dbl)
+
static BUN
convert_any_str(BAT *b, BAT *bn, struct canditer *restrict ci,
const bit *restrict rv)
@@ -14153,6 +14276,19 @@ convert_any_str(BAT *b, BAT *bn, struct
goto bunins_failed;
}
}
+ } else if (ATOMstorage(b->ttype) == TYPE_msk) {
+ for (i = 0; i < ci->ncand; i++) {
+ const char *v;
+ x = canditer_next(ci) - candoff;
+ if (rv != NULL && !rv[i]) {
+ nils++;
+ v = str_nil;
+ } else
+ v = mskGetVal(b, x) ? "1" : "0";
+ if (tfastins_nocheckVAR(bn, i, v,
+ bn->twidth) != GDK_SUCCEED)
+ goto bunins_failed;
+ }
} else {
for (i = 0; i < ci->ncand; i++) {
x = canditer_next(ci) - candoff;
@@ -14191,10 +14327,43 @@ convert_str_any(BAT *b, int tp, void *re
ssize_t l;
ssize_t (*atomfromstr)(const char *, size_t *, ptr *, bool) =
BATatoms[tp].atomFromStr;
BATiter bi = bat_iterator(b);
-
+ const char *s;
+
+ if (ATOMstorage(tp) == TYPE_msk) {
+ uint32_t mask = 0;
+ uint32_t *d = dst;
+ int j = 0;
+ for (BUN i = 0; i < ci->ncand; i++) {
+ oid x = canditer_next(ci) - candoff;
+ uint32_t v;
+ if (rv != NULL && !rv[i])
+ v = 0;
+ else {
+ s = BUNtvar(bi, x);
+ if (strcmp(s, "0") == 0)
+ v = 0;
+ else if (strcmp(s, "1") == 0)
+ v = 1;
+ else if (!abort_on_error)
+ v = 0;
+ else
+ goto conversion_failed;
+ }
+ mask |= v << j;
+ if (++j == 32) {
+ *d++ = mask;
+ j = 0;
+ mask = 0;
+ }
+ }
+ if (j > 0)
+ *d = mask;
+ return 0;
+
+ }
for (BUN i = 0; i < ci->ncand; i++) {
oid x = canditer_next(ci) - candoff;
- const char *s = BUNtvar(bi, x);
+ s = BUNtvar(bi, x);
if ((rv != NULL && !rv[i]) || strNil(s)) {
memcpy(dst, nil, len);
nils++;
@@ -14203,21 +14372,7 @@ convert_str_any(BAT *b, int tp, void *re
if ((l = (*atomfromstr)(s, &len, &d, false)) < 0 ||
l < (ssize_t) strlen(s)) {
if (abort_on_error) {
- GDKclrerr();
- size_t sz = escapedStrlen(s, NULL,
NULL, '\'');
- char *bf = GDKmalloc(sz + 1);
- if (bf) {
- escapedStr(bf, s, sz + 1, NULL,
NULL, '\'');
- GDKerror("22018!conversion of
string "
- "'%s' to type %s
failed.\n",
- bf, ATOMname(tp));
- GDKfree(bf);
- } else {
- GDKerror("22018!conversion of
string "
- "to type %s failed.\n",
- ATOMname(tp));
- }
- return BUN_NONE;
+ goto conversion_failed;
}
memcpy(dst, nil, len);
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list
