Commit 96120903 authored by Matthias Braun's avatar Matthias Braun
Browse files

don't shrink a set below its minimum size

[r14378]
parent c3323fd9
...@@ -144,12 +144,15 @@ ...@@ -144,12 +144,15 @@
#ifndef HT_OCCUPANCY_FLT #ifndef HT_OCCUPANCY_FLT
/** how full before we double size */ /** how full before we double size */
#define HT_OCCUPANCY_FLT 0.5f #define HT_OCCUPANCY_FLT(x) ((x)/2)
#endif /* HT_OCCUPANCY_FLT */ #endif /* HT_OCCUPANCY_FLT */
#ifndef HT_1_DIV_OCCUPANCY_FLT
#define HT_1_DIV_OCCUPANCY_FLT 2
#endif
#ifndef HT_EMPTY_FLT #ifndef HT_EMPTY_FLT
/** how empty before we half size */ /** how empty before we half size */
#define HT_EMPTY_FLT (0.4f * (HT_OCCUPANCY_FLT)) #define HT_EMPTY_FLT(x) ((x)/5)
#endif /* HT_EMPTY_FLT */ #endif /* HT_EMPTY_FLT */
#ifndef HT_MIN_BUCKETS #ifndef HT_MIN_BUCKETS
...@@ -302,8 +305,8 @@ void insert_new(HashSet *self, unsigned hash, ValueType value) ...@@ -302,8 +305,8 @@ void insert_new(HashSet *self, unsigned hash, ValueType value)
static INLINE static INLINE
void reset_thresholds(HashSet *self) void reset_thresholds(HashSet *self)
{ {
self->enlarge_threshold = (size_t) (self->num_buckets * HT_OCCUPANCY_FLT); self->enlarge_threshold = (size_t) HT_OCCUPANCY_FLT(self->num_buckets);
self->shrink_threshold = (size_t) (self->num_buckets * HT_EMPTY_FLT); self->shrink_threshold = (size_t) HT_EMPTY_FLT(self->num_buckets);
self->consider_shrink = 0; self->consider_shrink = 0;
} }
...@@ -378,6 +381,9 @@ void maybe_shrink(HashSet *self) ...@@ -378,6 +381,9 @@ void maybe_shrink(HashSet *self)
self->consider_shrink = 0; self->consider_shrink = 0;
size = hashset_size(self); size = hashset_size(self);
if(size <= HT_MIN_BUCKETS)
return;
if(LIKELY(size > self->shrink_threshold)) if(LIKELY(size > self->shrink_threshold))
return; return;
...@@ -544,7 +550,7 @@ void hashset_init_size(HashSet *self, size_t expected_elements) ...@@ -544,7 +550,7 @@ void hashset_init_size(HashSet *self, size_t expected_elements)
abort(); abort();
} }
needed_size = expected_elements * (int)(1.0 / HT_OCCUPANCY_FLT); needed_size = expected_elements * HT_1_DIV_OCCUPANCY_FLT;
po2size = ceil_po2(needed_size); po2size = ceil_po2(needed_size);
init_size(self, po2size); init_size(self, po2size);
} }
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment