aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGraydon Hoare <[email protected]>2010-08-03 19:02:09 -0700
committerGraydon Hoare <[email protected]>2010-08-03 19:02:09 -0700
commit22c07762470d6f90ba08ae6b5860fe9bd9116ebc (patch)
tree726ea7d9aa1563b1ddede712f87bbf8955b4dc53 /src
parentFactor append_quad out of IL.emit_full, for use elsewhere. (diff)
parentHave hashmap's insert method overwrite on existing-key insertion and return t... (diff)
downloadrust-22c07762470d6f90ba08ae6b5860fe9bd9116ebc.tar.xz
rust-22c07762470d6f90ba08ae6b5860fe9bd9116ebc.zip
Merge branch 'master' of [email protected]:graydon/rust
Diffstat (limited to 'src')
-rw-r--r--src/lib/map.rs12
1 files changed, 8 insertions, 4 deletions
diff --git a/src/lib/map.rs b/src/lib/map.rs
index c00ee75d..f9574176 100644
--- a/src/lib/map.rs
+++ b/src/lib/map.rs
@@ -13,7 +13,7 @@ type hashfn[K] = fn(&K) -> uint;
type eqfn[K] = fn(&K, &K) -> bool;
type hashmap[K, V] = obj {
- fn insert(&K key, &V val);
+ fn insert(&K key, &V val) -> bool;
fn contains_key(&K key) -> bool;
fn get(&K key) -> V;
fn find(&K key) -> util.option[V];
@@ -80,6 +80,7 @@ fn mk_hashmap[K, V](&hashfn[K] hasher, &eqfn[K] eqer) -> hashmap[K, V] {
alt (bkts.(j)) {
case (some[K, V](k, _)) {
if (eqer(key, k)) {
+ bkts.(j) = some[K, V](k, val);
ret false;
}
i += 1u;
@@ -143,7 +144,7 @@ fn mk_hashmap[K, V](&hashfn[K] hasher, &eqfn[K] eqer) -> hashmap[K, V] {
mutable uint nelts,
util.rational lf)
{
- fn insert(&K key, &V val) {
+ fn insert(&K key, &V val) -> bool {
let util.rational load = rec(num=(nelts + 1u) as int, den=nbkts as int);
if (!util.rational_leq(load, lf)) {
let uint nnewbkts = _int.next_power_of_two(nbkts + 1u);
@@ -154,8 +155,11 @@ fn mk_hashmap[K, V](&hashfn[K] hasher, &eqfn[K] eqer) -> hashmap[K, V] {
let vec[mutable bucket[K, V]] newbkts = make_buckets[K, V](nnewbkts);
rehash[K, V](hasher, eqer, bkts, nbkts, newbkts, nnewbkts);
}
- insert_common[K, V](hasher, eqer, bkts, nbkts, key, val);
- nelts += 1u;
+ if (insert_common[K, V](hasher, eqer, bkts, nbkts, key, val)) {
+ nelts += 1u;
+ ret true;
+ }
+ ret false;
}
fn contains_key(&K key) -> bool {