Skip to content

Commit f83c118

Browse files
committed
auto merge of #7833 : blake2-ppc/rust/hashmap-consume, r=alexcrichton
Updated all users of HashMap, HashSet ::consume() to use .consume_iter(). Since .consume_iter() takes the map or set by value, it needs awkward extra code to in librusti's use of @mut HashMap, where the map value can not be directly moved out. Addresses issue #7719
2 parents 559d2ef + 7ef9e72 commit f83c118

File tree

6 files changed

+33
-74
lines changed

6 files changed

+33
-74
lines changed

src/libextra/json.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1086,9 +1086,8 @@ impl serialize::Decoder for Decoder {
10861086
debug!("read_map()");
10871087
let len = match self.stack.pop() {
10881088
Object(obj) => {
1089-
let mut obj = obj;
10901089
let len = obj.len();
1091-
do obj.consume |key, value| {
1090+
for obj.consume().advance |(key, value)| {
10921091
self.stack.push(value);
10931092
self.stack.push(String(key));
10941093
}

src/librustc/rustc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ Available lint options:
154154
"));
155155

156156
let lint_dict = lint::get_lint_dict();
157-
let mut lint_dict = lint_dict.consume_iter()
157+
let mut lint_dict = lint_dict.consume()
158158
.transform(|(k, v)| (v, k))
159159
.collect::<~[(lint::LintSpec, &'static str)]>();
160160
lint_dict.qsort();

src/librusti/program.rs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
// except according to those terms.
1010

1111
use std::cast;
12+
use std::util;
1213
use std::hashmap::HashMap;
1314
use std::local_data;
1415

@@ -165,7 +166,8 @@ impl Program {
165166
None => {}
166167
}
167168

168-
do self.newvars.consume |name, var| {
169+
let newvars = util::replace(&mut self.newvars, HashMap::new());
170+
for newvars.consume().advance |(name, var)| {
169171
self.local_vars.insert(name, var);
170172
}
171173

@@ -230,7 +232,8 @@ impl Program {
230232
/// it updates this cache with the new values of each local variable.
231233
pub fn consume_cache(&mut self) {
232234
let map = local_data::pop(tls_key).expect("tls is empty");
233-
do map.consume |name, value| {
235+
let cons_map = util::replace(map, HashMap::new());
236+
for cons_map.consume().advance |(name, value)| {
234237
match self.local_vars.find_mut(&name) {
235238
Some(v) => { v.data = (*value).clone(); }
236239
None => { fail!("unknown variable %s", name) }
@@ -341,7 +344,8 @@ impl Program {
341344
}
342345

343346
// I'm not an @ pointer, so this has to be done outside.
344-
do newvars.consume |k, v| {
347+
let cons_newvars = util::replace(newvars, HashMap::new());
348+
for cons_newvars.consume().advance |(k, v)| {
345349
self.newvars.insert(k, v);
346350
}
347351

src/libstd/hashmap.rs

Lines changed: 20 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -438,31 +438,6 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
438438
self.mangle(k, v, |_k,a| a, |k,v,_a| f(k,v))
439439
}
440440

441-
/// Calls a function on each element of a hash map, destroying the hash
442-
/// map in the process.
443-
pub fn consume(&mut self, f: &fn(K, V)) {
444-
let buckets = replace(&mut self.buckets,
445-
vec::from_fn(INITIAL_CAPACITY, |_| None));
446-
self.size = 0;
447-
448-
for buckets.consume_iter().advance |bucket| {
449-
match bucket {
450-
None => {},
451-
Some(Bucket{key, value, _}) => {
452-
f(key, value)
453-
}
454-
}
455-
}
456-
}
457-
458-
/// Creates a consuming iterator, that is, one that moves each key-value
459-
/// pair out of the map in arbitrary order. The map cannot be used after
460-
/// calling this.
461-
pub fn consume_iter(self) -> HashMapConsumeIterator<K, V> {
462-
// `consume_rev_iter` is more efficient than `consume_iter` for vectors
463-
HashMapConsumeIterator {iter: self.buckets.consume_rev_iter()}
464-
}
465-
466441
/// Retrieves a value for the given key, failing if the key is not
467442
/// present.
468443
pub fn get<'a>(&'a self, k: &K) -> &'a V {
@@ -522,6 +497,15 @@ impl<K: Hash + Eq, V> HashMap<K, V> {
522497
pub fn mut_iter<'a>(&'a mut self) -> HashMapMutIterator<'a, K, V> {
523498
HashMapMutIterator { iter: self.buckets.mut_iter() }
524499
}
500+
501+
/// Creates a consuming iterator, that is, one that moves each key-value
502+
/// pair out of the map in arbitrary order. The map cannot be used after
503+
/// calling this.
504+
pub fn consume(self) -> HashMapConsumeIterator<K, V> {
505+
// `consume_rev_iter` is more efficient than `consume_iter` for vectors
506+
HashMapConsumeIterator {iter: self.buckets.consume_rev_iter()}
507+
}
508+
525509
}
526510

527511
impl<K: Hash + Eq, V: Clone> HashMap<K, V> {
@@ -761,19 +745,6 @@ impl<T:Hash + Eq> HashSet<T> {
761745
self.map.reserve_at_least(n)
762746
}
763747

764-
/// Consumes all of the elements in the set, emptying it out
765-
pub fn consume(&mut self, f: &fn(T)) {
766-
self.map.consume(|k, _| f(k))
767-
}
768-
769-
/// Creates a consuming iterator, that is, one that moves each value out
770-
/// of the set in arbitrary order. The set cannot be used after calling
771-
/// this.
772-
pub fn consume_iter(self) -> HashSetConsumeIterator<T> {
773-
// `consume_rev_iter` is more efficient than `consume_iter` for vectors
774-
HashSetConsumeIterator {iter: self.map.buckets.consume_rev_iter()}
775-
}
776-
777748
/// Returns true if the hash set contains a value equivalent to the
778749
/// given query value.
779750
pub fn contains_equiv<Q:Hash + Equiv<T>>(&self, value: &Q) -> bool {
@@ -786,6 +757,14 @@ impl<T:Hash + Eq> HashSet<T> {
786757
HashSetIterator { iter: self.map.buckets.iter() }
787758
}
788759

760+
/// Creates a consuming iterator, that is, one that moves each value out
761+
/// of the set in arbitrary order. The set cannot be used after calling
762+
/// this.
763+
pub fn consume(self) -> HashSetConsumeIterator<T> {
764+
// `consume_rev_iter` is more efficient than `consume_iter` for vectors
765+
HashSetConsumeIterator {iter: self.map.buckets.consume_rev_iter()}
766+
}
767+
789768
/// Visit the values representing the difference
790769
pub fn difference_iter<'a>(&'a self, other: &'a HashSet<T>)
791770
-> SetAlgebraIter<'a, T> {
@@ -975,29 +954,6 @@ mod test_map {
975954

976955
#[test]
977956
fn test_consume() {
978-
let mut m = HashMap::new();
979-
assert!(m.insert(1, 2));
980-
assert!(m.insert(2, 3));
981-
let mut m2 = HashMap::new();
982-
do m.consume |k, v| {
983-
m2.insert(k, v);
984-
}
985-
assert_eq!(m.len(), 0);
986-
assert_eq!(m2.len(), 2);
987-
assert_eq!(m2.get(&1), &2);
988-
assert_eq!(m2.get(&2), &3);
989-
}
990-
991-
#[test]
992-
fn test_consume_still_usable() {
993-
let mut m = HashMap::new();
994-
assert!(m.insert(1, 2));
995-
do m.consume |_, _| {}
996-
assert!(m.insert(1, 2));
997-
}
998-
999-
#[test]
1000-
fn test_consume_iter() {
1001957
let hm = {
1002958
let mut hm = HashMap::new();
1003959

@@ -1007,7 +963,7 @@ mod test_map {
1007963
hm
1008964
};
1009965

1010-
let v = hm.consume_iter().collect::<~[(char, int)]>();
966+
let v = hm.consume().collect::<~[(char, int)]>();
1011967
assert!([('a', 1), ('b', 2)] == v || [('b', 2), ('a', 1)] == v);
1012968
}
1013969

@@ -1293,7 +1249,7 @@ mod test_set {
12931249
}
12941250

12951251
#[test]
1296-
fn test_consume_iter() {
1252+
fn test_consume() {
12971253
let hs = {
12981254
let mut hs = HashSet::new();
12991255

@@ -1303,7 +1259,7 @@ mod test_set {
13031259
hs
13041260
};
13051261

1306-
let v = hs.consume_iter().collect::<~[char]>();
1262+
let v = hs.consume().collect::<~[char]>();
13071263
assert!(['a', 'b'] == v || ['b', 'a'] == v);
13081264
}
13091265
}

src/libstd/unstable/weak_task.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ fn run_weak_task_service(port: Port<ServiceMsg>) {
122122
}
123123
}
124124

125-
do shutdown_map.consume |_, shutdown_chan| {
125+
for shutdown_map.consume().advance |(_, shutdown_chan)| {
126126
// Weak task may have already exited
127127
shutdown_chan.send(());
128128
}

src/test/bench/graph500-bfs.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,9 +96,9 @@ fn make_graph(N: uint, edges: ~[(node_id, node_id)]) -> graph {
9696
}
9797
}
9898

99-
do graph.consume_iter().transform |mut v| {
99+
do graph.consume_iter().transform |v| {
100100
let mut vec = ~[];
101-
do v.consume |i| {
101+
for v.consume().advance |i| {
102102
vec.push(i);
103103
}
104104
vec
@@ -119,7 +119,7 @@ fn gen_search_keys(graph: &[~[node_id]], n: uint) -> ~[node_id] {
119119
}
120120
}
121121
let mut vec = ~[];
122-
do keys.consume |i| {
122+
for keys.consume().advance |i| {
123123
vec.push(i);
124124
}
125125
return vec;

0 commit comments

Comments
 (0)