From 3dc7aa2ef572a26f9c5e0ea134b43c80a013e8f5 Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Sun, 29 Jan 2017 14:08:07 -0800 Subject: Simplify gethash variants using new function. * hash.c (gethash_e): New function. Just returns the entry cell if found, or else nil. This should have been written first. (gethash, gethash_f, gethash_n): Replace body with trivial one-liner based on gethash_e. * hash.h (gethash_e): Declared. --- hash.c | 21 +++++++++------------ hash.h | 1 + 2 files changed, 10 insertions(+), 12 deletions(-) diff --git a/hash.c b/hash.c index 5b472130..9b1d4b46 100644 --- a/hash.c +++ b/hash.c @@ -676,13 +676,18 @@ val gethash_c(val hash, val key, loc new_p) return cell; } -val gethash(val hash, val key) +val gethash_e(val hash, val key) { struct hash *h = coerce(struct hash *, cobj_handle(hash, hash_s)); int lim = hash_rec_limit; cnum hv = h->hash_fun(key, &lim); val chain = vecref(h->table, num_fast(hv % h->modulus)); - val found = h->assoc_fun(key, hv, chain); + return h->assoc_fun(key, hv, chain); +} + +val gethash(val hash, val key) +{ + val found = gethash_e(hash, key); return cdr(found); } @@ -704,21 +709,13 @@ val inhash(val hash, val key, val init) val gethash_f(val hash, val key, loc found) { - struct hash *h = coerce(struct hash *, cobj_handle(hash, hash_s)); - int lim = hash_rec_limit; - cnum hv = h->hash_fun(key, &lim); - val chain = vecref(h->table, num_fast(hv % h->modulus)); - set(found, h->assoc_fun(key, hv, chain)); + set(found, gethash_e(hash, key)); return cdr(deref(found)); } val gethash_n(val hash, val key, val notfound_val) { - struct hash *h = coerce(struct hash *, cobj_handle(hash, hash_s)); - int lim = hash_rec_limit; - cnum hv = h->hash_fun(key, &lim); - val chain = vecref(h->table, num_fast(hv % h->modulus)); - val existing = h->assoc_fun(key, hv, chain); + val existing = gethash_e(hash, key); return if3(existing, cdr(existing), default_bool_arg(notfound_val)); } diff --git a/hash.h b/hash.h index 608ecddd..f5af5c0a 100644 --- a/hash.h +++ b/hash.h @@ -32,6 +32,7 @@ val make_hash(val weak_keys, val weak_vals, val equal_based); val make_similar_hash(val existing); val copy_hash(val existing); val gethash_c(val hash, val key, loc new_p); +val gethash_e(val hash, val key); val gethash(val hash, val key); val inhash(val hash, val key, val init); val gethash_n(val hash, val key, val notfound_val); -- cgit v1.2.3