Changeset: 40daa993c6ab for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/40daa993c6ab
Modified Files:
gdk/gdk.h
gdk/gdk_group.c
gdk/gdk_hash.c
gdk/gdk_join.c
gdk/gdk_qsort.c
gdk/gdk_search.c
gdk/gdk_time.h
monetdb5/modules/mal/pp_algebra.c
monetdb5/modules/mal/pp_hash.c
monetdb5/modules/mal/pp_hash.h
Branch: default
Log Message:
For pipelines, use standard hash (xxhash); macros for equality testing.
We now have macros is_TYPE_eq (where TYPE is the name of a fixed-sized
type) to compare two values. This also works for floating point types
so that two nil values compare equal.
diffs (truncated from 1029 to 300 lines):
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -1919,11 +1919,17 @@ gdk_export const inet4 inet4_nil;
gdk_export const inet6 inet6_nil;
/* derived NIL values - OIDDEPEND */
-#define bit_nil ((bit) bte_nil)
+#define bit_nil ((const bit) {bte_nil})
#define bat_nil ((bat) int_nil)
#define void_nil oid_nil
+#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && _MSC_VER < 1800
+#define isnan(x) _isnan(x)
+#define isinf(x) (_fpclass(x) & (_FPCLASS_NINF | _FPCLASS_PINF))
+#define isfinite(x) _finite(x)
+#endif
+
#define is_bit_nil(v) ((v) == GDK_bte_min-1)
#define is_bte_nil(v) ((v) == GDK_bte_min-1)
#define is_sht_nil(v) ((v) == GDK_sht_min-1)
@@ -1931,29 +1937,39 @@ gdk_export const inet6 inet6_nil;
#define is_lng_nil(v) ((v) == GDK_lng_min-1)
#ifdef HAVE_HGE
#define is_hge_nil(v) ((v) == GDK_hge_min-1)
-#endif
-#define is_oid_nil(v) ((v) == ((oid) 1 << ((8 * SIZEOF_OID) - 1)))
-#define is_flt_nil(v) isnan(v)
-#define is_dbl_nil(v) isnan(v)
-#define is_bat_nil(v) (((v) & 0x7FFFFFFF) == 0) /* v == bat_nil || v == 0 */
-
-#if defined(_MSC_VER) && !defined(__INTEL_COMPILER) && _MSC_VER < 1800
-#define isnan(x) _isnan(x)
-#define isinf(x) (_fpclass(x) & (_FPCLASS_NINF | _FPCLASS_PINF))
-#define isfinite(x) _finite(x)
-#endif
-
-#ifdef HAVE_HGE
#define is_uuid_nil(x) ((x).h == 0)
#define is_inet6_nil(x) ((x).align == 0)
#else
#define is_uuid_nil(x) (memcmp((x).u, uuid_nil.u, UUID_SIZE) == 0)
#define is_inet6_nil(x) (memcmp((x).hex, inet6_nil.hex, 16) == 0)
#endif
+#define is_oid_nil(v) ((v) == ((oid) 1 << ((8 * SIZEOF_OID) - 1)))
+#define is_flt_nil(v) isnan(v)
+#define is_dbl_nil(v) isnan(v)
+#define is_bat_nil(v) (((v) & 0x7FFFFFFF) == 0) /* v == bat_nil || v == 0 */
+
#define is_inet4_nil(x) ((x).align == 0)
#define is_blob_nil(x) ((x)->nitems == ~(size_t)0)
+#define is_bit_eq(x, y) ((x) == (y))
+#define is_bte_eq(x, y) ((x) == (y))
+#define is_sht_eq(x, y) ((x) == (y))
+#define is_int_eq(x, y) ((x) == (y))
+#define is_lng_eq(x, y) ((x) == (y))
+#ifdef HAVE_HGE
+#define is_hge_eq(x, y) ((x) == (y))
+#define is_uuid_eq(x, y) ((x).h == (y).h)
+#define is_inet6_eq(x, y) ((x).align == (y).align)
+#else
+#define is_uuid_eq(x, y) ((x).l[0] == (y).l[0] && (x).l[1] == (y).l[1])
+#define is_inet6_eq(x, y) ((x).align[0] == (y).align[0] && (x).align[1]
== (y).align[1])
+#endif
+#define is_oid_eq(x, y) ((x) == (y))
+#define is_flt_eq(x, y) ((is_flt_nil(x) && is_flt_nil(y)) || (x) == (y))
+#define is_dbl_eq(x, y) ((is_dbl_nil(x) && is_dbl_nil(y)) || (x) == (y))
+#define is_inet4_eq(x, y) ((x).align == (y).align)
+
/*
* @- Derived types
* In all algorithms across GDK, you will find switches on the types
@@ -3509,6 +3525,12 @@ lngHash(const void *x)
return (BUN) XXHASHFUNC(x, sizeof(lng), 0);
}
+#if SIZEOF_OID == SIZEOF_INT
+#define oidHash(x) intHash(x)
+#else
+#define oidHash(x) lngHash(x)
+#endif
+
#ifdef HAVE_HGE
__attribute__((__pure__))
static inline BUN
diff --git a/gdk/gdk_group.c b/gdk/gdk_group.c
--- a/gdk/gdk_group.c
+++ b/gdk/gdk_group.c
@@ -173,20 +173,12 @@
} \
} while(0)
-#define flt_neq(a, b) (is_flt_nil(a) ? !is_flt_nil(b) : is_flt_nil(b) || (a)
!= (b))
-#define dbl_neq(a, b) (is_dbl_nil(a) ? !is_dbl_nil(b) : is_dbl_nil(b) || (a)
!= (b))
-#define bte_neq(a, b) ((a) != (b))
-#define sht_neq(a, b) ((a) != (b))
-#define int_neq(a, b) ((a) != (b))
-#define lng_neq(a, b) ((a) != (b))
-#define hge_neq(a, b) ((a) != (b))
-
#define GRP_compare_consecutive_values_tpe(TYPE) \
GRP_compare_consecutive_values( \
/* INIT_0 */ const TYPE *w = (TYPE *) bi.base; \
TYPE pw = 0 , \
/* INIT_1 */ , \
- /* DIFFER */ TYPE##_neq(w[p], pw) , \
+ /* DIFFER */ !is_##TYPE##_eq(w[p], pw) , \
/* KEEP */ pw = w[p] \
)
@@ -291,25 +283,12 @@
} \
} while(0)
-#define flt_equ(a, b) (is_flt_nil(a) ? is_flt_nil(b) : !is_flt_nil(b) && (a)
== (b))
-#define dbl_equ(a, b) (is_dbl_nil(a) ? is_dbl_nil(b) : !is_dbl_nil(b) && (a)
== (b))
-#define bte_equ(a, b) ((a) == (b))
-#define sht_equ(a, b) ((a) == (b))
-#define int_equ(a, b) ((a) == (b))
-#define lng_equ(a, b) ((a) == (b))
-#ifdef HAVE_HGE
-#define hge_equ(a, b) ((a) == (b))
-#define uuid_equ(a, b) ((a).h == (b).h)
-#else
-#define uuid_equ(a, b) (memcmp((a).u, (b).u, UUID_SIZE) == 0)
-#endif
-
#define GRP_subscan_old_groups_tpe(TYPE) \
GRP_subscan_old_groups( \
/* INIT_0 */ const TYPE *w = (TYPE *) bi.base; \
TYPE pw = 0 , \
/* INIT_1 */ , \
- /* EQUAL */ TYPE##_equ(w[p], pw) , \
+ /* EQUAL */ is_##TYPE##_eq(w[p], pw) , \
/* KEEP */ pw = w[p] \
)
@@ -419,7 +398,7 @@
GRP_use_existing_hash_table( \
/* INIT_0 */ const TYPE *w = (TYPE *) bi.base, \
/* INIT_1 */ , \
- /* EQUAL */ TYPE##_equ(w[p], w[hb]) \
+ /* EQUAL */ is_##TYPE##_eq(w[p], w[hb]) \
)
#define GRP_use_existing_hash_table_any() \
@@ -591,7 +570,7 @@ ctz(oid x)
/* INIT_0 */ const TYPE *w = (TYPE *) bi.base, \
/* INIT_1 */ , \
/* HASH */ hash_##TYPE(hs, &w[p]) , \
- /* EQUAL */ TYPE##_equ(w[p], w[hb]) \
+ /* EQUAL */ is_##TYPE##_eq(w[p], w[hb]) \
)
#define GRP_create_partial_hash_table_any() \
diff --git a/gdk/gdk_hash.c b/gdk/gdk_hash.c
--- a/gdk/gdk_hash.c
+++ b/gdk/gdk_hash.c
@@ -668,24 +668,6 @@ BAThashsave(BAT *b, bool dosync)
BAThashsave_intern(b, dosync);
}
-#define EQbte(a, b) ((a) == (b))
-#define EQsht(a, b) ((a) == (b))
-#define EQint(a, b) ((a) == (b))
-#define EQlng(a, b) ((a) == (b))
-#ifdef HAVE_HGE
-#define EQhge(a, b) ((a) == (b))
-#endif
-#define EQflt(a, b) (is_flt_nil(a) ? is_flt_nil(b) : (a) == (b))
-#define EQdbl(a, b) (is_dbl_nil(a) ? is_dbl_nil(b) : (a) == (b))
-#define EQinet4(a, b) ((a).align == (b).align)
-#ifdef HAVE_HGE
-#define EQuuid(a, b) ((a).h == (b).h)
-#define EQinet6(a, b) ((a).align == (b).align)
-#else
-#define EQuuid(a, b) (memcmp((a).u, (b).u, UUID_SIZE) == 0)
-#define EQinet6(a, b) (memcmp((a).hex, (b).hex, sizeof(inet6)) == 0)
-#endif
-
#define starthash(TYPE)
\
do { \
const TYPE *restrict v = (const TYPE *) BUNtloc(bi, 0); \
@@ -701,7 +683,7 @@ BAThashsave(BAT *b, bool dosync)
for (hb = hget; \
hb != BUN_NONE; \
hb = HASHgetlink(h, hb)) { \
- if (EQ##TYPE(v[o - b->hseqbase],
v[hb])) \
+ if (is_##TYPE##_eq(v[o - b->hseqbase],
v[hb])) \
break; \
} \
h->nunique += hb == BUN_NONE; \
@@ -724,7 +706,7 @@ BAThashsave(BAT *b, bool dosync)
for (hb = hget; \
hb != BUN_NONE; \
hb = HASHgetlink(h, hb)) { \
- if (EQ##TYPE(v[o - b->hseqbase],
v[hb])) \
+ if (is_##TYPE##_eq(v[o - b->hseqbase],
v[hb])) \
break; \
} \
h->nunique += hb == BUN_NONE; \
diff --git a/gdk/gdk_join.c b/gdk/gdk_join.c
--- a/gdk/gdk_join.c
+++ b/gdk/gdk_join.c
@@ -3048,14 +3048,6 @@ vkeyjoin(BAT **r1p, BAT **r2p, BAT **r3p
return GDK_FAIL;
}
-#define EQ_int(a, b) ((a) == (b))
-#define EQ_lng(a, b) ((a) == (b))
-#ifdef HAVE_HGE
-#define EQ_uuid(a, b) ((a).h == (b).h)
-#else
-#define EQ_uuid(a, b) (memcmp((a).u, (b).u, UUID_SIZE) == 0)
-#endif
-
#define HASHJOIN(TYPE) \
do { \
TYPE *rvals = ri.base; \
@@ -3080,7 +3072,7 @@ vkeyjoin(BAT **r1p, BAT **r2p, BAT **r3p
rb != BUN_NONE; \
rb = HASHgetlink(hsh, rb)) { \
ro = canditer_idx(rci, rb); \
- if (!EQ_##TYPE(v, rvals[ro -
r->hseqbase])) \
+ if (!is_##TYPE##_eq(v, rvals[ro -
r->hseqbase])) \
continue; \
if (only_misses) { \
nr++; \
@@ -3095,7 +3087,7 @@ vkeyjoin(BAT **r1p, BAT **r2p, BAT **r3p
rb != BUN_NONE; \
rb = HASHgetlink(hsh, rb)) { \
if (rb >= rl && rb < rh && \
- EQ_##TYPE(v, rvals[rb]) && \
+ is_##TYPE##_eq(v, rvals[rb]) && \
canditer_contains(rci, ro = (oid)
(rb - roff + rseq))) { \
if (only_misses) { \
nr++; \
@@ -3111,7 +3103,7 @@ vkeyjoin(BAT **r1p, BAT **r2p, BAT **r3p
rb != BUN_NONE; \
rb = HASHgetlink(hsh, rb)) { \
if (rb >= rl && rb < rh && \
- EQ_##TYPE(v, rvals[rb])) { \
+ is_##TYPE##_eq(v, rvals[rb])) { \
if (only_misses) { \
nr++; \
break; \
diff --git a/gdk/gdk_qsort.c b/gdk/gdk_qsort.c
--- a/gdk/gdk_qsort.c
+++ b/gdk/gdk_qsort.c
@@ -37,7 +37,7 @@ struct qsort_t {
#define fixgtf(i, j, TPE) (!fixnil(j, TPE) && (fixnil(i, TPE) || ((TPE *)
h)[i] > ((TPE *) h)[j]))
#define fixgef(i, j, TPE) (fixnil(i, TPE) || (!fixnil(j, TPE) && ((TPE *)
h)[i] >= ((TPE *) h)[j]))
-#define fixeq(i, j, TPE) (((TPE *) h)[i] == ((TPE *) h)[j])
+#define fixeq(i, j, TPE) is_##TPE##_eq(((TPE *) h)[i], ((TPE *) h)[j])
#define fixnil(i, TPE) is_##TPE##_nil(((TPE *) h)[i])
#define fixswap(i, j, TPE) \
do { \
@@ -116,7 +116,7 @@ struct qsort_t {
#define fltlel_rev(i, j) (fltnil(j) || (!fltnil(i) && fixgel(i, j, flt)))
#define fltltf_rev(i, j) fixgtf(i, j, flt)
#define fltlef_rev(i, j) fixgef(i, j, flt)
-#define flteq(i, j) (fltnil(i) ? fltnil(j) : !fltnil(j) && fixeq(i,
j, flt))
+#define flteq(i, j) fixeq(i, j, flt)
#define fltnil(i) fixnil(i, flt)
#define fltswap(i, j) fixswap(i, j, flt)
@@ -128,7 +128,7 @@ struct qsort_t {
#define dbllel_rev(i, j) (dblnil(j) || (!dblnil(i) && fixgel(i, j, dbl)))
#define dblltf_rev(i, j) fixgtf(i, j, dbl)
#define dbllef_rev(i, j) fixgef(i, j, dbl)
-#define dbleq(i, j) (dblnil(i) ? dblnil(j) : !dblnil(j) && fixeq(i,
j, dbl))
+#define dbleq(i, j) fixeq(i, j, dbl)
#define dblnil(i) fixnil(i, dbl)
#define dblswap(i, j) fixswap(i, j, dbl)
diff --git a/gdk/gdk_search.c b/gdk/gdk_search.c
--- a/gdk/gdk_search.c
+++ b/gdk/gdk_search.c
@@ -88,12 +88,12 @@
#define flt_LE(a, b) (is_flt_nil(a) || (!is_flt_nil(b) && (a) <= (b)))
#define flt_GT(a, b) (!is_flt_nil(a) && (is_flt_nil(b) || (a) > (b)))
#define flt_GE(a, b) (is_flt_nil(b) || (!is_flt_nil(a) && (a) >= (b)))
-#define flt_EQ(a, b) (is_flt_nil(a) ? is_flt_nil(b) : !is_flt_nil(b) && (a)
== (b))
+#define flt_EQ(a, b) is_flt_eq(a, b)
#define dbl_LT(a, b) (!is_dbl_nil(b) && (is_dbl_nil(a) || (a) < (b)))
#define dbl_LE(a, b) (is_dbl_nil(a) || (!is_dbl_nil(b) && (a) <= (b)))
#define dbl_GT(a, b) (!is_dbl_nil(a) && (is_dbl_nil(b) || (a) > (b)))
#define dbl_GE(a, b) (is_dbl_nil(b) || (!is_dbl_nil(a) && (a) >= (b)))
-#define dbl_EQ(a, b) (is_dbl_nil(a) ? is_dbl_nil(b) : !is_dbl_nil(b) && (a)
== (b))
+#define dbl_EQ(a, b) is_dbl_eq(a, b)
#define BINSEARCHFUNC(TYPE) \
BUN \
diff --git a/gdk/gdk_time.h b/gdk/gdk_time.h
--- a/gdk/gdk_time.h
+++ b/gdk/gdk_time.h
_______________________________________________
checkin-list mailing list -- [email protected]
To unsubscribe send an email to [email protected]