Skip to content

Commit 9da641b

Browse files
committed
libsyntax: convert interner into a modern struct
1 parent 2ec958d commit 9da641b

File tree

2 files changed

+36
-42
lines changed

2 files changed

+36
-42
lines changed

src/libsyntax/parse/token.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ pub fn mk_ident_interner() -> @ident_interner {
429429
];
430430
431431
let rv = @ident_interner {
432-
interner: interner::mk_prefill(init_vec)
432+
interner: interner::Interner::prefill(init_vec)
433433
};
434434
435435
task::local_data::local_data_set(interner_key!(), @rv);
@@ -443,7 +443,7 @@ pub fn mk_ident_interner() -> @ident_interner {
443443
/* for when we don't care about the contents; doesn't interact with TLD or
444444
serialization */
445445
pub fn mk_fake_ident_interner() -> @ident_interner {
446-
@ident_interner { interner: interner::mk::<@~str>() }
446+
@ident_interner { interner: interner::Interner::new() }
447447
}
448448
449449
/**

src/libsyntax/util/interner.rs

Lines changed: 34 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -14,72 +14,66 @@
1414

1515
use core::prelude::*;
1616

17-
use core::dvec::DVec;
18-
use std::oldmap::HashMap;
19-
use std::oldmap;
17+
use hashmap::linear::LinearMap;
18+
use dvec::DVec;
2019

21-
pub type hash_interner<T> = {map: HashMap<T, uint>, vect: DVec<T>};
22-
23-
pub fn mk<T:Eq IterBytes Hash Const Copy>() -> Interner<T> {
24-
let m = oldmap::HashMap::<T, uint>();
25-
let hi: hash_interner<T> =
26-
{map: m, vect: DVec()};
27-
((hi) as Interner::<T>)
28-
}
29-
30-
pub fn mk_prefill<T:Eq IterBytes Hash Const Copy>(init: &[T]) -> Interner<T> {
31-
let rv = mk();
32-
for init.each() |v| { rv.intern(*v); }
33-
return rv;
20+
pub struct Interner<T> {
21+
priv mut map: LinearMap<T, uint>,
22+
priv vect: DVec<T>,
3423
}
3524

25+
// when traits can extend traits, we should extend index<uint,T> to get []
26+
pub impl<T: Eq IterBytes Hash Const Copy> Interner<T> {
27+
static fn new() -> Interner<T> {
28+
Interner {
29+
map: LinearMap::new(),
30+
vect: DVec(),
31+
}
32+
}
3633

37-
/* when traits can extend traits, we should extend index<uint,T> to get [] */
38-
pub trait Interner<T:Eq IterBytes Hash Const Copy> {
39-
fn intern(T) -> uint;
40-
fn gensym(T) -> uint;
41-
pure fn get(uint) -> T;
42-
fn len() -> uint;
43-
}
34+
static fn prefill(init: &[T]) -> Interner<T> {
35+
let rv = Interner::new();
36+
for init.each() |v| { rv.intern(*v); }
37+
rv
38+
}
4439

45-
pub impl<T:Eq IterBytes Hash Const Copy> Interner<T> for hash_interner<T> {
46-
fn intern(val: T) -> uint {
40+
fn intern(&self, val: T) -> uint {
4741
match self.map.find(&val) {
48-
Some(idx) => return idx,
49-
None => {
50-
let new_idx = self.vect.len();
51-
self.map.insert(val, new_idx);
52-
self.vect.push(val);
53-
return new_idx;
54-
}
42+
Some(&idx) => return idx,
43+
None => (),
5544
}
45+
46+
let new_idx = self.vect.len();
47+
self.map.insert(val, new_idx);
48+
self.vect.push(val);
49+
new_idx
5650
}
57-
fn gensym(val: T) -> uint {
51+
52+
fn gensym(&self, val: T) -> uint {
5853
let new_idx = self.vect.len();
5954
// leave out of .map to avoid colliding
6055
self.vect.push(val);
61-
return new_idx;
56+
new_idx
6257
}
6358

6459
// this isn't "pure" in the traditional sense, because it can go from
6560
// failing to returning a value as items are interned. But for typestate,
6661
// where we first check a pred and then rely on it, ceasing to fail is ok.
67-
pure fn get(idx: uint) -> T { self.vect.get_elt(idx) }
62+
pure fn get(&self, idx: uint) -> T { self.vect.get_elt(idx) }
6863

69-
fn len() -> uint { return self.vect.len(); }
64+
fn len(&self) -> uint { self.vect.len() }
7065
}
7166

72-
7367
#[test]
7468
#[should_fail]
7569
pub fn i1 () {
76-
let i : Interner<@~str> = mk();
70+
let i : Interner<@~str> = Interner::new();
7771
i.get(13);
7872
}
7973

8074
#[test]
8175
pub fn i2 () {
82-
let i : Interner<@~str> = mk();
76+
let i : Interner<@~str> = Interner::new();
8377
// first one is zero:
8478
assert i.intern (@~"dog") == 0;
8579
// re-use gets the same entry:
@@ -104,7 +98,7 @@ pub fn i2 () {
10498

10599
#[test]
106100
pub fn i3 () {
107-
let i : Interner<@~str> = mk_prefill([@~"Alan",@~"Bob",@~"Carol"]);
101+
let i : Interner<@~str> = Interner::prefill([@~"Alan",@~"Bob",@~"Carol"]);
108102
assert i.get(0) == @~"Alan";
109103
assert i.get(1) == @~"Bob";
110104
assert i.get(2) == @~"Carol";

0 commit comments

Comments
 (0)