@@ -20,15 +20,15 @@ use std::hashmap::HashMap;
20
20
21
21
pub struct Interner < T > {
22
22
priv map: @RefCell < HashMap < T , Name > > ,
23
- priv vect : @mut ~[ T ] ,
23
+ priv vect : @RefCell < ~[ T ] > ,
24
24
}
25
25
26
26
// when traits can extend traits, we should extend index<Name,T> to get []
27
27
impl < T : Eq + IterBytes + Hash + Freeze + Clone + ' static > Interner < T > {
28
28
pub fn new ( ) -> Interner < T > {
29
29
Interner {
30
30
map : @RefCell :: new ( HashMap :: new ( ) ) ,
31
- vect : @mut ~[ ] ,
31
+ vect : @RefCell :: new ( ~[ ] ) ,
32
32
}
33
33
}
34
34
@@ -47,28 +47,30 @@ impl<T:Eq + IterBytes + Hash + Freeze + Clone + 'static> Interner<T> {
47
47
None => ( ) ,
48
48
}
49
49
50
- let vect = & mut * self . vect ;
51
- let new_idx = vect. len ( ) as Name ;
50
+ let mut vect = self . vect . borrow_mut ( ) ;
51
+ let new_idx = vect. get ( ) . len ( ) as Name ;
52
52
map. get ( ) . insert ( val. clone ( ) , new_idx) ;
53
- vect. push ( val) ;
53
+ vect. get ( ) . push ( val) ;
54
54
new_idx
55
55
}
56
56
57
57
pub fn gensym ( & self , val : T ) -> Name {
58
- let new_idx = {
59
- let vect = & * self . vect ;
60
- vect. len ( ) as Name
61
- } ;
58
+ let mut vect = self . vect . borrow_mut ( ) ;
59
+ let new_idx = vect. get ( ) . len ( ) as Name ;
62
60
// leave out of .map to avoid colliding
63
- self . vect . push ( val) ;
61
+ vect. get ( ) . push ( val) ;
64
62
new_idx
65
63
}
66
64
67
65
pub fn get ( & self , idx : Name ) -> T {
68
- self . vect [ idx] . clone ( )
66
+ let vect = self . vect . borrow ( ) ;
67
+ vect. get ( ) [ idx] . clone ( )
69
68
}
70
69
71
- pub fn len ( & self ) -> uint { let vect = & * self . vect ; vect. len ( ) }
70
+ pub fn len ( & self ) -> uint {
71
+ let vect = self . vect . borrow ( ) ;
72
+ vect. get ( ) . len ( )
73
+ }
72
74
73
75
pub fn find_equiv < Q : Hash + IterBytes + Equiv < T > > ( & self , val : & Q )
74
76
-> Option < Name > {
@@ -84,15 +86,15 @@ impl<T:Eq + IterBytes + Hash + Freeze + Clone + 'static> Interner<T> {
84
86
// borrowed pointers rather than @ ones, resulting in less allocation.
85
87
pub struct StrInterner {
86
88
priv map: @RefCell < HashMap < @str , Name > > ,
87
- priv vect : @mut ~[ @str ] ,
89
+ priv vect : @RefCell < ~[ @str ] > ,
88
90
}
89
91
90
92
// when traits can extend traits, we should extend index<Name,T> to get []
91
93
impl StrInterner {
92
94
pub fn new ( ) -> StrInterner {
93
95
StrInterner {
94
96
map : @RefCell :: new ( HashMap :: new ( ) ) ,
95
- vect : @mut ~[ ] ,
97
+ vect : @RefCell :: new ( ~[ ] ) ,
96
98
}
97
99
}
98
100
@@ -112,14 +114,16 @@ impl StrInterner {
112
114
let new_idx = self . len ( ) as Name ;
113
115
let val = val. to_managed ( ) ;
114
116
map. get ( ) . insert ( val, new_idx) ;
115
- self . vect . push ( val) ;
117
+ let mut vect = self . vect . borrow_mut ( ) ;
118
+ vect. get ( ) . push ( val) ;
116
119
new_idx
117
120
}
118
121
119
122
pub fn gensym ( & self , val : & str ) -> Name {
120
123
let new_idx = self . len ( ) as Name ;
121
124
// leave out of .map to avoid colliding
122
- self . vect . push ( val. to_managed ( ) ) ;
125
+ let mut vect = self . vect . borrow_mut ( ) ;
126
+ vect. get ( ) . push ( val. to_managed ( ) ) ;
123
127
new_idx
124
128
}
125
129
@@ -136,13 +140,21 @@ impl StrInterner {
136
140
pub fn gensym_copy ( & self , idx : Name ) -> Name {
137
141
let new_idx = self . len ( ) as Name ;
138
142
// leave out of map to avoid colliding
139
- self . vect . push ( self . vect [ idx] ) ;
143
+ let mut vect = self . vect . borrow_mut ( ) ;
144
+ let existing = vect. get ( ) [ idx] ;
145
+ vect. get ( ) . push ( existing) ;
140
146
new_idx
141
147
}
142
148
143
- pub fn get ( & self , idx : Name ) -> @str { self . vect [ idx] }
149
+ pub fn get ( & self , idx : Name ) -> @str {
150
+ let vect = self . vect . borrow ( ) ;
151
+ vect. get ( ) [ idx]
152
+ }
144
153
145
- pub fn len ( & self ) -> uint { let vect = & * self . vect ; vect. len ( ) }
154
+ pub fn len ( & self ) -> uint {
155
+ let vect = self . vect . borrow ( ) ;
156
+ vect. get ( ) . len ( )
157
+ }
146
158
147
159
pub fn find_equiv < Q : Hash + IterBytes + Equiv < @str > > ( & self , val : & Q )
148
160
-> Option < Name > {
0 commit comments