summaryrefslogtreecommitdiffstats
path: root/hash.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2017-01-29 14:08:07 -0800
committerKaz Kylheku <kaz@kylheku.com>2017-01-29 14:08:07 -0800
commit3dc7aa2ef572a26f9c5e0ea134b43c80a013e8f5 (patch)
treeba497af2f84050dfa253b6860e26854150544496 /hash.c
parent06a0dd484bc93a02bd3cf4ff77d2b99474c84c4e (diff)
downloadtxr-3dc7aa2ef572a26f9c5e0ea134b43c80a013e8f5.tar.gz
txr-3dc7aa2ef572a26f9c5e0ea134b43c80a013e8f5.tar.bz2
txr-3dc7aa2ef572a26f9c5e0ea134b43c80a013e8f5.zip
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.
Diffstat (limited to 'hash.c')
-rw-r--r--hash.c21
1 files changed, 9 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));
}