Skip to content

Commit b2ec71f

Browse files
committed
hashmap: port to Vec<T>
1 parent 1798de7 commit b2ec71f

File tree

1 file changed

+25
-25
lines changed

1 file changed

+25
-25
lines changed

src/libstd/hashmap.rs

Lines changed: 25 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,9 @@ use rand::Rng;
6666
use rand;
6767
use uint;
6868
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;
7172

7273
static INITIAL_CAPACITY: uint = 32u; // 2^5
7374

@@ -90,7 +91,7 @@ pub struct HashMap<K,V> {
9091
priv k1: u64,
9192
priv resize_at: uint,
9293
priv size: uint,
93-
priv buckets: ~[Option<Bucket<K, V>>],
94+
priv buckets: Vec<Option<Bucket<K, V>>>
9495
}
9596

9697
// We could rewrite FoundEntry to have type Option<&Bucket<K, V>>
@@ -151,7 +152,7 @@ impl<K:Hash + Eq,V> HashMap<K, V> {
151152
-> SearchResult {
152153
let mut ret = TableFull;
153154
self.bucket_sequence(hash, |i| {
154-
match self.buckets[i] {
155+
match self.buckets.as_slice()[i] {
155156
Some(ref bkt) if bkt.hash == hash && *k == bkt.key => {
156157
ret = FoundEntry(i); false
157158
},
@@ -169,7 +170,7 @@ impl<K:Hash + Eq,V> HashMap<K, V> {
169170
-> SearchResult {
170171
let mut ret = TableFull;
171172
self.bucket_sequence(hash, |i| {
172-
match self.buckets[i] {
173+
match self.buckets.as_slice()[i] {
173174
Some(ref bkt) if bkt.hash == hash && k.equiv(&bkt.key) => {
174175
ret = FoundEntry(i); false
175176
},
@@ -194,7 +195,7 @@ impl<K:Hash + Eq,V> HashMap<K, V> {
194195
self.resize_at = resize_at(new_capacity);
195196

196197
let old_buckets = replace(&mut self.buckets,
197-
vec::from_fn(new_capacity, |_| None));
198+
Vec::from_fn(new_capacity, |_| None));
198199

199200
self.size = 0;
200201
for bucket in old_buckets.move_iter() {
@@ -213,15 +214,15 @@ impl<K:Hash + Eq,V> HashMap<K, V> {
213214

214215
#[inline]
215216
fn value_for_bucket<'a>(&'a self, idx: uint) -> &'a V {
216-
match self.buckets[idx] {
217+
match self.buckets.as_slice()[idx] {
217218
Some(ref bkt) => &bkt.value,
218219
None => fail!("HashMap::find: internal logic error"),
219220
}
220221
}
221222

222223
#[inline]
223224
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] {
225226
Some(ref mut bkt) => &mut bkt.value,
226227
None => unreachable!()
227228
}
@@ -234,13 +235,12 @@ impl<K:Hash + Eq,V> HashMap<K, V> {
234235
match self.bucket_for_key_with_hash(hash, &k) {
235236
TableFull => { fail!("Internal logic error"); }
236237
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});
239239
self.size += 1;
240240
None
241241
}
242242
FoundEntry(idx) => {
243-
match self.buckets[idx] {
243+
match self.buckets.as_mut_slice()[idx] {
244244
None => { fail!("insert_internal: Internal logic error") }
245245
Some(ref mut b) => {
246246
b.hash = hash;
@@ -273,16 +273,16 @@ impl<K:Hash + Eq,V> HashMap<K, V> {
273273
};
274274

275275
let len_buckets = self.buckets.len();
276-
let bucket = self.buckets[idx].take();
276+
let bucket = self.buckets.as_mut_slice()[idx].take();
277277

278278
let value = bucket.map(|bucket| bucket.value);
279279

280280
/* re-inserting buckets may cause changes in size, so remember
281281
what our new size is ahead of time before we start insertions */
282282
let size = self.size - 1;
283283
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();
286286
self.insert_opt_bucket(bucket);
287287
idx = self.next_bucket(idx, len_buckets);
288288
}
@@ -300,7 +300,7 @@ impl<K:Hash + Eq,V> Container for HashMap<K, V> {
300300
impl<K:Hash + Eq,V> Mutable for HashMap<K, V> {
301301
/// Clear the map, removing all key-value pairs.
302302
fn clear(&mut self) {
303-
for bkt in self.buckets.mut_iter() {
303+
for bkt in self.buckets.as_mut_slice().mut_iter() {
304304
*bkt = None;
305305
}
306306
self.size = 0;
@@ -380,7 +380,7 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
380380
k0: k0, k1: k1,
381381
resize_at: resize_at(cap),
382382
size: 0,
383-
buckets: vec::from_fn(cap, |_| None)
383+
buckets: Vec::from_fn(cap, |_| None)
384384
}
385385
}
386386

@@ -455,7 +455,7 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
455455
FoundEntry(idx) => { found(&k, self.mut_value_for_bucket(idx), a); idx }
456456
FoundHole(idx) => {
457457
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});
459459
self.size += 1;
460460
idx
461461
}
@@ -541,14 +541,14 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
541541
/// An iterator visiting all key-value pairs in arbitrary order.
542542
/// Iterator element type is (&'a K, &'a V).
543543
pub fn iter<'a>(&'a self) -> Entries<'a, K, V> {
544-
Entries { iter: self.buckets.iter() }
544+
Entries { iter: self.buckets.as_slice().iter() }
545545
}
546546

547547
/// An iterator visiting all key-value pairs in arbitrary order,
548548
/// with mutable references to the values.
549549
/// Iterator element type is (&'a K, &'a mut V).
550550
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() }
552552
}
553553

554554
/// 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> {
599599
/// HashMap iterator
600600
#[deriving(Clone)]
601601
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>>>,
603603
}
604604

605605
/// HashMap mutable values iterator
606606
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>>>,
608608
}
609609

610610
/// HashMap move iterator
611611
pub struct MoveEntries<K, V> {
612-
priv iter: vec::MoveItems<Option<Bucket<K, V>>>,
612+
priv iter: vec_ng::MoveItems<Option<Bucket<K, V>>>,
613613
}
614614

615615
/// HashMap keys iterator
@@ -623,12 +623,12 @@ pub type Values<'a, K, V> =
623623
/// HashSet iterator
624624
#[deriving(Clone)]
625625
pub struct SetItems<'a, K> {
626-
priv iter: vec::Items<'a, Option<Bucket<K, ()>>>,
626+
priv iter: Items<'a, Option<Bucket<K, ()>>>,
627627
}
628628

629629
/// HashSet move iterator
630630
pub struct SetMoveItems<K> {
631-
priv iter: vec::MoveItems<Option<Bucket<K, ()>>>,
631+
priv iter: vec_ng::MoveItems<Option<Bucket<K, ()>>>,
632632
}
633633

634634
impl<'a, K, V> Iterator<(&'a K, &'a V)> for Entries<'a, K, V> {
@@ -807,7 +807,7 @@ impl<T:Hash + Eq> HashSet<T> {
807807
/// An iterator visiting all elements in arbitrary order.
808808
/// Iterator element type is &'a T.
809809
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() }
811811
}
812812

813813
/// Creates a consuming iterator, that is, one that moves each value out

0 commit comments

Comments
 (0)