From e040ab8423b7ae74eeb2ee5d9b1f1da5256f59fd Mon Sep 17 00:00:00 2001 From: Paul Stansifer Date: Tue, 17 Jul 2012 11:22:11 -0700 Subject: Impl-ize interner. --- src/libsyntax/util/interner.rs | 46 ++++++++++++++++++++++++------------------ 1 file changed, 26 insertions(+), 20 deletions(-) (limited to 'src/libsyntax/util') diff --git a/src/libsyntax/util/interner.rs b/src/libsyntax/util/interner.rs index 0e69f2c10b7..f25604ab991 100644 --- a/src/libsyntax/util/interner.rs +++ b/src/libsyntax/util/interner.rs @@ -5,7 +5,7 @@ import std::map; import std::map::{hashmap, hashfn, eqfn}; import dvec::{dvec, extensions}; -type interner = +type hash_interner = {map: hashmap, vect: dvec, hasher: hashfn, @@ -13,28 +13,34 @@ type interner = fn mk(hasher: hashfn, eqer: eqfn) -> interner { let m = map::hashmap::(hasher, eqer); - ret {map: m, vect: dvec(), hasher: hasher, eqer: eqer}; + let hi: hash_interner = + {map: m, vect: dvec(), hasher: hasher, eqer: eqer}; + ret hi as interner::; } -fn intern(itr: interner, val: T) -> uint { - alt itr.map.find(val) { - some(idx) { ret idx; } - none { - let new_idx = itr.vect.len(); - itr.map.insert(val, new_idx); - itr.vect.push(val); - ret new_idx; - } - } +/* when traits can extend traits, we should extend index to get [] */ +iface interner { + fn intern(T) -> uint; + pure fn get(uint) -> T; + fn len() -> uint; } -// |get| isn't "pure" in the traditional sense, because it can go from -// failing to returning a value as items are interned. But for typestate, -// where we first check a pred and then rely on it, ceasing to fail is ok. -pure fn get(itr: interner, idx: uint) -> T { - unchecked { - itr.vect.get_elt(idx) +impl of interner for hash_interner { + fn intern(val: T) -> uint { + alt self.map.find(val) { + some(idx) { ret idx; } + none { + let new_idx = self.vect.len(); + self.map.insert(val, new_idx); + self.vect.push(val); + ret new_idx; + } + } } -} -fn len(itr: interner) -> uint { ret itr.vect.len(); } + // this isn't "pure" in the traditional sense, because it can go from + // failing to returning a value as items are interned. But for typestate, + // where we first check a pred and then rely on it, ceasing to fail is ok. + pure fn get(idx: uint) -> T { self.vect.get_elt(idx) } + fn len() -> uint { ret self.vect.len(); } +} \ No newline at end of file -- cgit 1.4.1-3-g733a5