Add clear() to the map interface.

Add clear to the map interface, and implement it in hashmap and smallintmap.
This commit is contained in:
Glenn Willen 2012-07-08 16:04:57 -07:00
parent d95ab538c1
commit 1c882842e0
2 changed files with 25 additions and 1 deletions

View file

@ -60,6 +60,9 @@ iface map<K, V: copy> {
*/
fn remove(K) -> option<V>;
/// Clear the map, removing all key/value pairs.
fn clear();
/// Iterate over all the key/value pairs in the map
fn each(fn(K, V) -> bool);
@ -75,6 +78,8 @@ iface map<K, V: copy> {
mod chained {
export t, mk, hashmap;
const initial_capacity: uint = 32u; // 2^5
type entry<K, V> = {
hash: uint,
key: K,
@ -255,6 +260,11 @@ mod chained {
}
}
fn clear() {
self.count = 0u;
self.chains = chains(initial_capacity);
}
fn each(blk: fn(K,V) -> bool) {
for self.each_entry |entry| {
if !blk(entry.key, copy entry.value) { break; }
@ -271,7 +281,6 @@ mod chained {
}
fn mk<K, V: copy>(hasher: hashfn<K>, eqer: eqfn<K>) -> t<K,V> {
let initial_capacity: uint = 32u; // 2^5
let slf: t<K, V> = @{mut count: 0u,
mut chains: chains(initial_capacity),
hasher: hasher,
@ -609,6 +618,18 @@ mod tests {
assert (option::get(map.find(key)) == "val");
}
#[test]
fn test_clear() {
let key = "k";
let map = map::hashmap::<str, str>(str::hash, str::eq);
map.insert(key, "val");
assert (map.size() == 1);
assert (map.contains_key(key));
map.clear();
assert (map.size() == 0);
assert (!map.contains_key(key));
}
#[test]
fn test_hash_from_vec() {
let map = map::hash_from_strs(~[

View file

@ -73,6 +73,9 @@ impl <V: copy> of map::map<uint, V> for smallintmap<V> {
self.v.set_elt(key, none);
old
}
fn clear() {
self.v.set(~[mut]);
}
fn contains_key(&&key: uint) -> bool {
contains_key(self, key)
}