return a < b ? -1 : (a > b ? 1 : 0);
}
+#if SIZEOF_DEV_T != 8
+unsigned long devt_hash_func(const void *p, const uint8_t hash_key[HASH_KEY_SIZE]) {
+ uint64_t u;
+ siphash24((uint8_t*) &u, p, sizeof(dev_t), hash_key);
+ return (unsigned long) u;
+}
+
+int devt_compare_func(const void *_a, const void *_b) {
+ dev_t a, b;
+ a = *(const dev_t*) _a;
+ b = *(const dev_t*) _b;
+ return a < b ? -1 : (a > b ? 1 : 0);
+}
+#endif
+
static unsigned bucket_hash(Hashmap *h, const void *p) {
return (unsigned) (h->hash_func(p, h->hash_key) % h->n_buckets);
}
if (!h)
return NULL;
- memset(h, 0, size);
+ memzero(h, size);
} else {
h = malloc0(size);
return data;
}
+void* hashmap_remove2(Hashmap *h, const void *key, void **rkey) {
+ struct hashmap_entry *e;
+ unsigned hash;
+ void *data;
+
+ if (!h) {
+ if (rkey)
+ *rkey = NULL;
+ return NULL;
+ }
+
+ hash = bucket_hash(h, key);
+ e = hash_scan(h, hash, key);
+ if (!e) {
+ if (rkey)
+ *rkey = NULL;
+ return NULL;
+ }
+
+ data = e->value;
+ if (rkey)
+ *rkey = (void*) e->key;
+
+ remove_entry(h, e);
+
+ return data;
+}
+
int hashmap_remove_and_put(Hashmap *h, const void *old_key, const void *new_key, void *value) {
struct hashmap_entry *e;
unsigned old_hash, new_hash;