@@ -66,8 +66,9 @@ use rand::Rng;
66
66
use rand;
67
67
use uint;
68
68
use util:: replace;
69
- use vec:: { ImmutableVector , MutableVector , OwnedVector } ;
70
- use vec;
69
+ use vec:: { ImmutableVector , MutableVector , OwnedVector , Items , MutItems } ;
70
+ use vec_ng;
71
+ use vec_ng:: Vec ;
71
72
72
73
static INITIAL_CAPACITY : uint = 32 u; // 2^5
73
74
@@ -90,7 +91,7 @@ pub struct HashMap<K,V> {
90
91
priv k1: u64 ,
91
92
priv resize_at : uint ,
92
93
priv size : uint ,
93
- priv buckets : ~ [ Option < Bucket < K , V > > ] ,
94
+ priv buckets : Vec < Option < Bucket < K , V > > >
94
95
}
95
96
96
97
// We could rewrite FoundEntry to have type Option<&Bucket<K, V>>
@@ -151,7 +152,7 @@ impl<K:Hash + Eq,V> HashMap<K, V> {
151
152
-> SearchResult {
152
153
let mut ret = TableFull ;
153
154
self . bucket_sequence ( hash, |i| {
154
- match self . buckets [ i] {
155
+ match self . buckets . as_slice ( ) [ i] {
155
156
Some ( ref bkt) if bkt. hash == hash && * k == bkt. key => {
156
157
ret = FoundEntry ( i) ; false
157
158
} ,
@@ -169,7 +170,7 @@ impl<K:Hash + Eq,V> HashMap<K, V> {
169
170
-> SearchResult {
170
171
let mut ret = TableFull ;
171
172
self . bucket_sequence ( hash, |i| {
172
- match self . buckets [ i] {
173
+ match self . buckets . as_slice ( ) [ i] {
173
174
Some ( ref bkt) if bkt. hash == hash && k. equiv ( & bkt. key ) => {
174
175
ret = FoundEntry ( i) ; false
175
176
} ,
@@ -194,7 +195,7 @@ impl<K:Hash + Eq,V> HashMap<K, V> {
194
195
self . resize_at = resize_at ( new_capacity) ;
195
196
196
197
let old_buckets = replace ( & mut self . buckets ,
197
- vec :: from_fn ( new_capacity, |_| None ) ) ;
198
+ Vec :: from_fn ( new_capacity, |_| None ) ) ;
198
199
199
200
self . size = 0 ;
200
201
for bucket in old_buckets. move_iter ( ) {
@@ -213,15 +214,15 @@ impl<K:Hash + Eq,V> HashMap<K, V> {
213
214
214
215
#[ inline]
215
216
fn value_for_bucket < ' a > ( & ' a self , idx : uint ) -> & ' a V {
216
- match self . buckets [ idx] {
217
+ match self . buckets . as_slice ( ) [ idx] {
217
218
Some ( ref bkt) => & bkt. value ,
218
219
None => fail ! ( "HashMap::find: internal logic error" ) ,
219
220
}
220
221
}
221
222
222
223
#[ inline]
223
224
fn mut_value_for_bucket < ' a > ( & ' a mut self , idx : uint ) -> & ' a mut V {
224
- match self . buckets [ idx] {
225
+ match self . buckets . as_mut_slice ( ) [ idx] {
225
226
Some ( ref mut bkt) => & mut bkt. value ,
226
227
None => unreachable ! ( )
227
228
}
@@ -234,13 +235,12 @@ impl<K:Hash + Eq,V> HashMap<K, V> {
234
235
match self . bucket_for_key_with_hash ( hash, & k) {
235
236
TableFull => { fail ! ( "Internal logic error" ) ; }
236
237
FoundHole ( idx) => {
237
- self . buckets [ idx] = Some ( Bucket { hash : hash, key : k,
238
- value : v} ) ;
238
+ self . buckets . as_mut_slice ( ) [ idx] = Some ( Bucket { hash : hash, key : k, value : v} ) ;
239
239
self . size += 1 ;
240
240
None
241
241
}
242
242
FoundEntry ( idx) => {
243
- match self . buckets [ idx] {
243
+ match self . buckets . as_mut_slice ( ) [ idx] {
244
244
None => { fail ! ( "insert_internal: Internal logic error" ) }
245
245
Some ( ref mut b) => {
246
246
b. hash = hash;
@@ -273,16 +273,16 @@ impl<K:Hash + Eq,V> HashMap<K, V> {
273
273
} ;
274
274
275
275
let len_buckets = self . buckets . len ( ) ;
276
- let bucket = self . buckets [ idx] . take ( ) ;
276
+ let bucket = self . buckets . as_mut_slice ( ) [ idx] . take ( ) ;
277
277
278
278
let value = bucket. map ( |bucket| bucket. value ) ;
279
279
280
280
/* re-inserting buckets may cause changes in size, so remember
281
281
what our new size is ahead of time before we start insertions */
282
282
let size = self . size - 1 ;
283
283
idx = self . next_bucket ( idx, len_buckets) ;
284
- while self . buckets [ idx] . is_some ( ) {
285
- let bucket = self . buckets [ idx] . take ( ) ;
284
+ while self . buckets . as_slice ( ) [ idx] . is_some ( ) {
285
+ let bucket = self . buckets . as_mut_slice ( ) [ idx] . take ( ) ;
286
286
self . insert_opt_bucket ( bucket) ;
287
287
idx = self . next_bucket ( idx, len_buckets) ;
288
288
}
@@ -300,7 +300,7 @@ impl<K:Hash + Eq,V> Container for HashMap<K, V> {
300
300
impl < K : Hash + Eq , V > Mutable for HashMap < K , V > {
301
301
/// Clear the map, removing all key-value pairs.
302
302
fn clear ( & mut self ) {
303
- for bkt in self . buckets . mut_iter ( ) {
303
+ for bkt in self . buckets . as_mut_slice ( ) . mut_iter ( ) {
304
304
* bkt = None ;
305
305
}
306
306
self . size = 0 ;
@@ -380,7 +380,7 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
380
380
k0 : k0, k1 : k1,
381
381
resize_at : resize_at ( cap) ,
382
382
size : 0 ,
383
- buckets : vec :: from_fn ( cap, |_| None )
383
+ buckets : Vec :: from_fn ( cap, |_| None )
384
384
}
385
385
}
386
386
@@ -455,7 +455,7 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
455
455
FoundEntry ( idx) => { found ( & k, self . mut_value_for_bucket ( idx) , a) ; idx }
456
456
FoundHole ( idx) => {
457
457
let v = not_found ( & k, a) ;
458
- self . buckets [ idx] = Some ( Bucket { hash : hash, key : k, value : v} ) ;
458
+ self . buckets . as_mut_slice ( ) [ idx] = Some ( Bucket { hash : hash, key : k, value : v} ) ;
459
459
self . size += 1 ;
460
460
idx
461
461
}
@@ -541,14 +541,14 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
541
541
/// An iterator visiting all key-value pairs in arbitrary order.
542
542
/// Iterator element type is (&'a K, &'a V).
543
543
pub fn iter < ' a > ( & ' a self ) -> Entries < ' a , K , V > {
544
- Entries { iter : self . buckets . iter ( ) }
544
+ Entries { iter : self . buckets . as_slice ( ) . iter ( ) }
545
545
}
546
546
547
547
/// An iterator visiting all key-value pairs in arbitrary order,
548
548
/// with mutable references to the values.
549
549
/// Iterator element type is (&'a K, &'a mut V).
550
550
pub fn mut_iter < ' a > ( & ' a mut self ) -> MutEntries < ' a , K , V > {
551
- MutEntries { iter : self . buckets . mut_iter ( ) }
551
+ MutEntries { iter : self . buckets . as_mut_slice ( ) . mut_iter ( ) }
552
552
}
553
553
554
554
/// Creates a consuming iterator, that is, one that moves each key-value
@@ -599,17 +599,17 @@ impl<K:Hash + Eq + Clone,V:Clone> Clone for HashMap<K,V> {
599
599
/// HashMap iterator
600
600
#[ deriving( Clone ) ]
601
601
pub struct Entries < ' a , K , V > {
602
- priv iter : vec :: Items < ' a , Option < Bucket < K , V > > > ,
602
+ priv iter : Items < ' a , Option < Bucket < K , V > > > ,
603
603
}
604
604
605
605
/// HashMap mutable values iterator
606
606
pub struct MutEntries < ' a , K , V > {
607
- priv iter : vec :: MutItems < ' a , Option < Bucket < K , V > > > ,
607
+ priv iter : MutItems < ' a , Option < Bucket < K , V > > > ,
608
608
}
609
609
610
610
/// HashMap move iterator
611
611
pub struct MoveEntries < K , V > {
612
- priv iter : vec :: MoveItems < Option < Bucket < K , V > > > ,
612
+ priv iter : vec_ng :: MoveItems < Option < Bucket < K , V > > > ,
613
613
}
614
614
615
615
/// HashMap keys iterator
@@ -623,12 +623,12 @@ pub type Values<'a, K, V> =
623
623
/// HashSet iterator
624
624
#[ deriving( Clone ) ]
625
625
pub struct SetItems < ' a , K > {
626
- priv iter : vec :: Items < ' a , Option < Bucket < K , ( ) > > > ,
626
+ priv iter : Items < ' a , Option < Bucket < K , ( ) > > > ,
627
627
}
628
628
629
629
/// HashSet move iterator
630
630
pub struct SetMoveItems < K > {
631
- priv iter : vec :: MoveItems < Option < Bucket < K , ( ) > > > ,
631
+ priv iter : vec_ng :: MoveItems < Option < Bucket < K , ( ) > > > ,
632
632
}
633
633
634
634
impl < ' a , K , V > Iterator < ( & ' a K , & ' a V ) > for Entries < ' a , K , V > {
@@ -807,7 +807,7 @@ impl<T:Hash + Eq> HashSet<T> {
807
807
/// An iterator visiting all elements in arbitrary order.
808
808
/// Iterator element type is &'a T.
809
809
pub fn iter < ' a > ( & ' a self ) -> SetItems < ' a , T > {
810
- SetItems { iter : self . map . buckets . iter ( ) }
810
+ SetItems { iter : self . map . buckets . as_slice ( ) . iter ( ) }
811
811
}
812
812
813
813
/// Creates a consuming iterator, that is, one that moves each value out
0 commit comments