mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-16 21:15:18 +03:00
Have hashmap's insert method overwrite on existing-key insertion and return true iff overwrite did not occur.
This commit is contained in:
+8
-4
@@ -13,7 +13,7 @@
|
||||
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 insert_common[K, V](&hashfn[K] hasher,
|
||||
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 rehash[K, V](&hashfn[K] hasher,
|
||||
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 insert(&K key, &V val) {
|
||||
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 {
|
||||
|
||||
Reference in New Issue
Block a user