Skip to content

Commit 2996575

Browse files
committed
Have hashmap's insert method overwrite on existing-key insertion and return true iff overwrite did not occur.
1 parent c014748 commit 2996575

File tree

1 file changed

+8
-4
lines changed

1 file changed

+8
-4
lines changed

src/lib/map.rs

+8-4
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ type hashfn[K] = fn(&K) -> uint;
1313
type eqfn[K] = fn(&K, &K) -> bool;
1414

1515
type hashmap[K, V] = obj {
16-
fn insert(&K key, &V val);
16+
fn insert(&K key, &V val) -> bool;
1717
fn contains_key(&K key) -> bool;
1818
fn get(&K key) -> V;
1919
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] {
8080
alt (bkts.(j)) {
8181
case (some[K, V](k, _)) {
8282
if (eqer(key, k)) {
83+
bkts.(j) = some[K, V](k, val);
8384
ret false;
8485
}
8586
i += 1u;
@@ -143,7 +144,7 @@ fn mk_hashmap[K, V](&hashfn[K] hasher, &eqfn[K] eqer) -> hashmap[K, V] {
143144
mutable uint nelts,
144145
util.rational lf)
145146
{
146-
fn insert(&K key, &V val) {
147+
fn insert(&K key, &V val) -> bool {
147148
let util.rational load = rec(num=(nelts + 1u) as int, den=nbkts as int);
148149
if (!util.rational_leq(load, lf)) {
149150
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] {
154155
let vec[mutable bucket[K, V]] newbkts = make_buckets[K, V](nnewbkts);
155156
rehash[K, V](hasher, eqer, bkts, nbkts, newbkts, nnewbkts);
156157
}
157-
insert_common[K, V](hasher, eqer, bkts, nbkts, key, val);
158-
nelts += 1u;
158+
if (insert_common[K, V](hasher, eqer, bkts, nbkts, key, val)) {
159+
nelts += 1u;
160+
ret true;
161+
}
162+
ret false;
159163
}
160164

161165
fn contains_key(&K key) -> bool {

0 commit comments

Comments
 (0)