rustc: Add a "smallintmap" implementation

This commit is contained in:
Patrick Walton 2011-06-03 16:14:29 -07:00
parent 088ab03fdb
commit cb4c969ba6
3 changed files with 54 additions and 0 deletions

40
src/lib/smallintmap.rs Normal file
View file

@ -0,0 +1,40 @@
/// A simple map based on a vector for small integer keys. Space requirements
/// are O(highest integer key).
import option::none;
import option::some;
type smallintmap[T] = rec(mutable vec[mutable option::t[T]] v);
fn mk[T]() -> smallintmap[T] {
let vec[mutable option::t[T]] v = [mutable];
ret rec(mutable v=v);
}
fn insert[T](&smallintmap[T] m, uint key, &T val) {
vec::grow_set[option::t[T]](m.v, key, none[T], some[T](val));
}
fn find[T](&smallintmap[T] m, uint key) -> option::t[T] {
if (key < vec::len[option::t[T]](m.v)) { ret m.v.(key); }
ret none[T];
}
fn get[T](&smallintmap[T] m, uint key) -> T {
alt (find[T](m, key)) {
case (none[T]) {
log_err "smallintmap::get(): key not present";
fail;
}
case (some[T](?v)) { ret v; }
}
}
fn contains_key[T](&smallintmap[T] m, uint key) -> bool {
ret !option::is_none(find[T](m, key));
}
fn truncate[T](&smallintmap[T] m, uint len) {
m.v = vec::slice_mut[option::t[T]](m.v, 0u, len);
}

View file

@ -76,6 +76,7 @@ mod box;
mod getopts;
mod term;
mod time;
mod smallintmap;
// Local Variables:
// mode: rust;

View file

@ -163,6 +163,19 @@ fn slice[T](array[T] v, uint start, uint end) -> vec[T] {
ret result;
}
// FIXME: Should go away eventually.
fn slice_mut[T](array[T] v, uint start, uint end) -> vec[mutable T] {
assert (start <= end);
assert (end <= len[T](v));
auto result = alloc_mut[T](end - start);
let uint i = start;
while (i < end) {
result += [mutable v.(i)];
i += 1u;
}
ret result;
}
fn shift[T](&mutable array[T] v) -> T {
auto ln = len[T](v);
assert (ln > 0u);