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]

Reply via email to