Changeset: 7d3c11850670 for MonetDB
URL: http://dev.monetdb.org/hg/MonetDB?cmd=changeset;node=7d3c11850670
Modified Files:
NT/monetdb_config.h.in
configure.ag
gdk/gdk.h
gdk/gdk_calc_private.h
gdk/gdk_search.c
gdk/gdk_search.h
Branch: default
Log Message:
Some cleanup.
diffs (282 lines):
diff --git a/NT/monetdb_config.h.in b/NT/monetdb_config.h.in
--- a/NT/monetdb_config.h.in
+++ b/NT/monetdb_config.h.in
@@ -1036,19 +1036,23 @@ typedef unsigned __int64 uint64_t;
#ifdef HAVE_LONG_LONG
typedef long long lng;
+typedef unsigned long long ulng;
# define SIZEOF_LNG SIZEOF_LONG_LONG
#else
typedef __int64 lng;
+typedef unsigned __int64 ulng;
# define SIZEOF_LNG SIZEOF___INT64
#endif
#ifdef HAVE___INT128
typedef __int128 hge;
+typedef unsigned __int128 uhge;
# define HAVE_HGE 1
# define SIZEOF_HGE SIZEOF___INT128
#else
# if defined(HAVE___INT128_T) && defined(HAVE___UINT128_T)
typedef __int128_t hge;
+typedef __uint128_t uhge;
# define HAVE_HGE 1
# define SIZEOF_HGE SIZEOF___INT128_T
# endif
diff --git a/configure.ag b/configure.ag
--- a/configure.ag
+++ b/configure.ag
@@ -3121,21 +3121,25 @@ typedef size_t uintptr_t;
#ifdef HAVE_LONG_LONG
typedef long long lng;
+typedef unsigned long long ulng;
# define SIZEOF_LNG SIZEOF_LONG_LONG
#else
# ifdef HAVE___INT64
typedef __int64 lng;
+typedef unsigned __int64 ulng;
# define SIZEOF_LNG SIZEOF___INT64
# endif
#endif
#ifdef HAVE___INT128
typedef __int128 hge;
+typedef unsigned __int128 uhge;
# define HAVE_HGE 1
# define SIZEOF_HGE SIZEOF___INT128
#else
# if defined(HAVE___INT128_T) && defined(HAVE___UINT128_T)
typedef __int128_t hge;
+typedef __uint128_t uhge;
# define HAVE_HGE 1
# define SIZEOF_HGE SIZEOF___INT128_T
# endif
diff --git a/gdk/gdk.h b/gdk/gdk.h
--- a/gdk/gdk.h
+++ b/gdk/gdk.h
@@ -2895,30 +2895,15 @@ gdk_export void ALIGNsetH(BAT *b1, BAT *
* @item HASHloop
* @tab
* (BAT *b; Hash *h, size_t dummy; ptr value)
- * @item HASHloop_bit
- * @tab
- * (BAT *b; Hash *h, size_t idx; bit *value, BUN w)
* @item HASHloop_bte
* @tab
* (BAT *b; Hash *h, size_t idx; bte *value, BUN w)
* @item HASHloop_sht
* @tab
* (BAT *b; Hash *h, size_t idx; sht *value, BUN w)
- * @item HASHloop_bat
- * @tab
- * (BAT *b; Hash *h, size_t idx; bat *value, BUN w)
- * @item HASHloop_ptr
- * @tab
- * (BAT *b; Hash *h, size_t idx; ptr *value, BUN w)
* @item HASHloop_int
* @tab
* (BAT *b; Hash *h, size_t idx; int *value, BUN w)
- * @item HASHloop_oid
- * @tab
- * (BAT *b; Hash *h, size_t idx; oid *value, BUN w)
- * @item HASHloop_wrd
- * @tab
- * (BAT *b; Hash *h, size_t idx; wrd *value, BUN w)
* @item HASHloop_flt
* @tab
* (BAT *b; Hash *h, size_t idx; flt *value, BUN w)
@@ -3016,17 +3001,6 @@ gdk_export void ALIGNsetH(BAT *b1, BAT *
if (GDK_STREQ(v, BUNtvar(bi, hb)))
/*
- * For string search, we can optimize if the string heap has
- * eliminated all doubles. This is the case when not too many
- * different strings are stored in the heap. You can check this with
- * the macro strElimDoubles() If so, we can just compare integer index
- * numbers instead of strings:
- */
-#define HASHloop_fstr(bi, h, hb, idx, v) \
- for (hb = HASHget(h, strHash(v)&h->mask), idx =
strLocate((bi.b)->T->vheap,v); \
- hb != HASHnil(h); hb = HASHgetlink(h,hb))
\
- if (VarHeapValRaw((bi).b->T->heap.base, hb, (bi).b->T->width)
== idx)
-/*
* The following example shows how the hashloop is used:
*
* @verbatim
@@ -3070,26 +3044,15 @@ gdk_export void ALIGNsetH(BAT *b1, BAT *
hb = HASHgetlink(h,hb)) \
if (simple_EQ(v, BUNtloc(bi, hb), TYPE))
-#define HASHloop_bit(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, bte)
#define HASHloop_bte(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, bte)
#define HASHloop_sht(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, sht)
#define HASHloop_int(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, int)
-#define HASHloop_wrd(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, wrd)
#define HASHloop_lng(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, lng)
#ifdef HAVE_HGE
#define HASHloop_hge(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, hge)
#endif
-#define HASHloop_oid(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, oid)
-#define HASHloop_bat(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, bat)
#define HASHloop_flt(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, flt)
#define HASHloop_dbl(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, dbl)
-#define HASHloop_ptr(bi, h, hb, v) HASHloop_TYPE(bi, h, hb, v, ptr)
-
-#define HASHloop_any(bi, h, hb, v) \
- for (hb = HASHget(h, hash_any(h, v)); \
- hb != HASHnil(h); \
- hb = HASHgetlink(h,hb)) \
- if (atom_EQ(v, BUNtail(bi, hb), (bi).b->ttype))
/*
* @- loop over a BAT with ordered tail
diff --git a/gdk/gdk_calc_private.h b/gdk/gdk_calc_private.h
--- a/gdk/gdk_calc_private.h
+++ b/gdk/gdk_calc_private.h
@@ -12,22 +12,6 @@
#error this file should not be included outside its source directory
#endif
-#ifdef HAVE_LONG_LONG
-typedef unsigned long long ulng;
-#else
-typedef unsigned __int64 ulng;
-#endif
-
-#ifdef HAVE_HGE
-#ifdef HAVE___INT128
-typedef unsigned __int128 uhge;
-#else
-#ifdef HAVE___UINT128_T
-typedef __uint128_t uhge;
-#endif
-#endif
-#endif
-
/* signed version of BUN */
#if SIZEOF_BUN == SIZEOF_INT
#define SBUN int
diff --git a/gdk/gdk_search.c b/gdk/gdk_search.c
--- a/gdk/gdk_search.c
+++ b/gdk/gdk_search.c
@@ -98,15 +98,25 @@ HASHwidth(BUN hashsize)
BUN
HASHmask(BUN cnt)
{
- BUN m = 1 << 8; /* minimum size; == BATTINY */
+ BUN m = cnt;
- /* find largest power of 2 smaller than cnt */
- while (m + m < cnt)
- m += m;
- /* if cnt is more than 1/3 into the gap between m & 2*m,
+ /* find largest power of 2 smaller than or equal to cnt */
+ m |= m >> 1;
+ m |= m >> 2;
+ m |= m >> 4;
+ m |= m >> 8;
+ m |= m >> 16;
+#if SIZEOF_BUN == 8
+ m |= m >> 32;
+#endif
+ m -= m >> 1;
+
+ /* if cnt is more than 1/3 into the gap between m and 2*m,
double m */
if (m + m - cnt < 2 * (cnt - m))
m += m;
+ if (m < BATTINY)
+ m = BATTINY;
return m;
}
diff --git a/gdk/gdk_search.h b/gdk/gdk_search.h
--- a/gdk/gdk_search.h
+++ b/gdk/gdk_search.h
@@ -128,29 +128,35 @@ gdk_export BUN HASHlist(Hash *h, BUN i);
} while (0)
#endif
+#define mix_bte(X) ((unsigned int) (X))
+#define mix_sht(X) ((unsigned int) (X))
#define mix_int(X) (((X)>>7)^((X)>>13)^((X)>>21)^(X))
+#define mix_lng(X) mix_int((unsigned int) ((X) ^ ((X) >> 32)))
+#ifdef HAVE_HGE
+#define mix_hge(X) mix_int((unsigned int) ((X) ^ ((X) >> 32) ^ \
+ ((X) >> 64) ^ ((X) >> 96)))
+#endif
#define hash_loc(H,V) hash_any(H,V)
#define hash_var(H,V) hash_any(H,V)
#define hash_any(H,V) (ATOMhash((H)->type, (V)) & (H)->mask)
#define heap_hash_any(hp,H,V) ((hp) && (hp)->hashash ? ((BUN *) (V))[-1] &
(H)->mask : hash_any(H,V))
-#define hash_bte(H,V) (assert(((H)->mask & 0xFF) == 0xFF), (BUN) *(const
unsigned char*) (V))
-#define hash_sht(H,V) (assert(((H)->mask & 0xFFFF) == 0xFFFF), (BUN) *(const
unsigned short*) (V))
-#define hash_int(H,V) ((BUN) mix_int(*((const unsigned int*) (V))) &
(H)->mask)
+#define hash_bte(H,V) (assert(((H)->mask & 0xFF) == 0xFF), (BUN)
mix_bte(*(const unsigned char*) (V)))
+#define hash_sht(H,V) (assert(((H)->mask & 0xFFFF) == 0xFFFF), (BUN)
mix_sht(*(const unsigned short*) (V)))
+#define hash_int(H,V) ((BUN) mix_int(*(const unsigned int *) (V)) & (H)->mask)
/* XXX return size_t-sized value for 8-byte oid? */
-#define hash_lng(H,V) ((BUN) mix_int((unsigned int) (*(const lng *)(V) ^
(*(const lng *)(V) >> 32))) & (H)->mask)
+#define hash_lng(H,V) ((BUN) mix_lng(*(const ulng *) (V)) & (H)->mask)
#ifdef HAVE_HGE
-#define hash_hge(H,V) ((BUN) mix_int((unsigned int) (*(const hge *)(V) ^
(*(const hge *)(V) >> 32) ^ \
- (*(const hge *)(V) >>
64) ^ (*(const hge *)(V) >> 96))) & (H)->mask)
+#define hash_hge(H,V) ((BUN) mix_hge(*(const uhge *) (V)) & (H)->mask)
#endif
#if SIZEOF_OID == SIZEOF_INT
-#define hash_oid(H,V) ((BUN) mix_int((unsigned int) *((const oid*) (V))) &
(H)->mask)
+#define hash_oid(H,V) hash_int(H,V)
#else
-#define hash_oid(H,V) ((BUN) mix_int((unsigned int) (*(const oid *)(V) ^
(*(const oid *)(V) >> 32))) & (H)->mask)
+#define hash_oid(H,V) hash_lng(H,V)
#endif
#if SIZEOF_WRD == SIZEOF_INT
-#define hash_wrd(H,V) ((BUN) mix_int((unsigned int) *((const wrd*) (V))) &
(H)->mask)
+#define hash_wrd(H,V) hash_int(H,V)
#else
-#define hash_wrd(H,V) ((BUN) mix_int((unsigned int) (*(const wrd *)(V) ^
(*(const wrd *)(V) >> 32))) & (H)->mask)
+#define hash_wrd(H,V) hash_lng(H,V)
#endif
#define hash_flt(H,V) hash_int(H,V)
@@ -168,18 +174,6 @@ gdk_export BUN HASHlist(Hash *h, BUN i);
} else \
goto hashfnd_failed; \
} while (0)
-#define HASHfnd_str_hv(x,y,z) \
- do { \
- BUN _i; \
- (x) = BUN_NONE; \
- if ((y).b->T->hash || BAThash((y).b, 0) == GDK_SUCCEED) { \
- HASHloop_str_hv((y), (y).b->T->hash, _i, (z)) { \
- (x) = _i; \
- break; \
- } \
- } else \
- goto hashfnd_failed; \
- } while (0)
#define HASHfnd(x,y,z) \
do { \
BUN _i; \
@@ -211,18 +205,7 @@ gdk_export BUN HASHlist(Hash *h, BUN i);
#ifdef HAVE_HGE
#define HASHfnd_hge(x,y,z) HASHfnd_TYPE(x,y,z,hge)
#endif
-#define HASHfnd_oid(x,y,z) HASHfnd_TYPE(x,y,z,oid)
-#define HASHfnd_wrd(x,y,z) HASHfnd_TYPE(x,y,z,wrd)
-#if SIZEOF_VOID_P == SIZEOF_INT
-#define HASHfnd_ptr(x,y,z) HASHfnd_int(x,y,z)
-#else /* SIZEOF_VOID_P == SIZEOF_LNG */
-#define HASHfnd_ptr(x,y,z) HASHfnd_lng(x,y,z)
-#endif
-#define HASHfnd_bit(x,y,z) HASHfnd_bte(x,y,z)
-#define HASHfnd_flt(x,y,z) HASHfnd_int(x,y,z)
-#define HASHfnd_dbl(x,y,z) HASHfnd_lng(x,y,z)
-#define HASHfnd_any(x,y,z) HASHfnd(x,y,z)
/*
* A new entry is added with HASHins using the BAT, the BUN index, and
* a pointer to the value to be stored.
_______________________________________________
checkin-list mailing list
[email protected]
https://www.monetdb.org/mailman/listinfo/checkin-list