Skip to content

Commit 9599cc8

Browse files
committed
implement BaseIter for LinearMap
1 parent fe841f3 commit 9599cc8

File tree

5 files changed

+32
-28
lines changed

5 files changed

+32
-28
lines changed

src/libcargo/cargo.rc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -495,7 +495,7 @@ pub fn try_parse_sources(filename: &Path,
495495
let c = io::read_whole_file_str(filename);
496496
match json::from_str(c.get()) {
497497
Ok(json::Object(j)) => {
498-
for j.each |k, v| {
498+
for j.each |&(k, v)| {
499499
sources.insert(copy *k, parse_source(*k, v));
500500
debug!("source: %s", *k);
501501
}

src/libcore/hashmap.rs

Lines changed: 21 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -235,6 +235,23 @@ pub mod linear {
235235
}
236236
}
237237
238+
impl <K: Hash IterBytes Eq, V> LinearMap<K, V>: BaseIter<(&K, &V)> {
239+
/// Visit all key-value pairs
240+
pure fn each(&self, blk: fn(&(&self/K, &self/V)) -> bool) {
241+
for uint::range(0, self.buckets.len()) |i| {
242+
let mut broke = false;
243+
do self.buckets[i].map |bucket| {
244+
if !blk(&(&bucket.key, &bucket.value)) {
245+
broke = true; // FIXME(#3064) just write "break;"
246+
}
247+
};
248+
if broke { break; }
249+
}
250+
}
251+
pure fn size_hint(&self) -> Option<uint> { Some(self.len()) }
252+
}
253+
254+
238255
impl <K: Hash IterBytes Eq, V> LinearMap<K, V>: Container {
239256
/// Return the number of elements in the map
240257
pure fn len(&self) -> uint { self.size }
@@ -264,12 +281,12 @@ pub mod linear {
264281
265282
/// Visit all keys
266283
pure fn each_key(&self, blk: fn(k: &K) -> bool) {
267-
self.each(|k, _| blk(k))
284+
self.each(|&(k, _)| blk(k))
268285
}
269286
270287
/// Visit all values
271288
pure fn each_value(&self, blk: fn(v: &V) -> bool) {
272-
self.each(|_, v| blk(v))
289+
self.each(|&(_, v)| blk(v))
273290
}
274291
275292
/// Return the value corresponding to the key in the map
@@ -322,19 +339,6 @@ pub mod linear {
322339
linear_map_with_capacity(INITIAL_CAPACITY)
323340
}
324341
325-
/// Visit all key-value pairs
326-
pure fn each(&self, blk: fn(k: &K, v: &V) -> bool) {
327-
for self.buckets.each |slot| {
328-
let mut broke = false;
329-
do slot.iter |bucket| {
330-
if !blk(&bucket.key, &bucket.value) {
331-
broke = true; // FIXME(#3064) just write "break;"
332-
}
333-
}
334-
if broke { break; }
335-
}
336-
}
337-
338342
fn pop(&mut self, k: &K) -> Option<V> {
339343
let hash = k.hash_keyed(self.k0, self.k1) as uint;
340344
self.pop_internal(hash, k)
@@ -388,7 +392,7 @@ pub mod linear {
388392
pure fn eq(&self, other: &LinearMap<K, V>) -> bool {
389393
if self.len() != other.len() { return false; }
390394

391-
for self.each |key, value| {
395+
for self.each |&(key, value)| {
392396
match other.find(key) {
393397
None => return false,
394398
Some(v) => if value != v { return false },
@@ -603,7 +607,7 @@ mod test_map {
603607
assert m.insert(i, i*2);
604608
}
605609
let mut observed = 0;
606-
for m.each |k, v| {
610+
for m.each |&(k, v)| {
607611
assert *v == *k * 2;
608612
observed |= (1 << *k);
609613
}

src/libstd/json.rs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ pub impl<S: serialize::Encoder> Json: serialize::Encodable<S> {
302302
Object(ref v) => {
303303
do s.emit_rec || {
304304
let mut idx = 0;
305-
for v.each |key, value| {
305+
for v.each |&(key, value)| {
306306
do s.emit_field(*key, idx) {
307307
value.encode(s);
308308
}
@@ -936,7 +936,7 @@ impl Json : Eq {
936936
&Object(ref d1) => {
937937
if d0.len() == d1.len() {
938938
let mut equal = true;
939-
for d0.each |k, v0| {
939+
for d0.each |&(k, v0)| {
940940
match d1.find(k) {
941941
Some(v1) if v0 == v1 => { },
942942
_ => { equal = false; break }
@@ -1000,12 +1000,12 @@ impl Json : Ord {
10001000
let mut d1_flat = ~[];
10011001
10021002
// FIXME #4430: this is horribly inefficient...
1003-
for d0.each |k, v| {
1003+
for d0.each |&(k, v)| {
10041004
d0_flat.push((@copy *k, @copy *v));
10051005
}
10061006
d0_flat.qsort();
10071007
1008-
for d1.each |k, v| {
1008+
for d1.each |&(k, v)| {
10091009
d1_flat.push((@copy *k, @copy *v));
10101010
}
10111011
d1_flat.qsort();
@@ -1146,7 +1146,7 @@ impl <A: ToJson> ~[A]: ToJson {
11461146
impl <A: ToJson Copy> LinearMap<~str, A>: ToJson {
11471147
fn to_json() -> Json {
11481148
let mut d = LinearMap::new();
1149-
for self.each() |key, value| {
1149+
for self.each |&(key, value)| {
11501150
d.insert(copy *key, value.to_json());
11511151
}
11521152
Object(~d)

src/libstd/net_url.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,10 @@ pub fn encode_form_urlencoded(m: &LinearMap<~str, ~[~str]>) -> ~str {
219219
let mut out = ~"";
220220
let mut first = true;
221221

222-
for m.each |key, values| {
222+
for m.each |&(key, values)| {
223223
let key = encode_plus(*key);
224224

225-
for (*values).each |value| {
225+
for values.each |value| {
226226
if first {
227227
first = false;
228228
} else {

src/libstd/workcache.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ type WorkMap = LinearMap<WorkKey, ~str>;
142142
pub impl<S: Encoder> WorkMap: Encodable<S> {
143143
fn encode(&self, s: &S) {
144144
let d = dvec::DVec();
145-
for self.each |k, v| {
145+
for self.each |&(k, v)| {
146146
d.push((copy *k, copy *v))
147147
}
148148
let mut v = d.get();
@@ -155,7 +155,7 @@ pub impl<D: Decoder> WorkMap: Decodable<D> {
155155
static fn decode(&self, d: &D) -> WorkMap {
156156
let v : ~[(WorkKey,~str)] = Decodable::decode(d);
157157
let mut w = LinearMap::new();
158-
for v.each |&(k,v)| {
158+
for v.each |&(k, v)| {
159159
w.insert(copy k, copy v);
160160
}
161161
w
@@ -312,7 +312,7 @@ impl @Mut<Prep> : TPrep {
312312
}
313313

314314
fn all_fresh(&self, cat: &str, map: &WorkMap) -> bool {
315-
for map.each |k,v| {
315+
for map.each |&(k, v)| {
316316
if ! self.is_fresh(cat, k.kind, k.name, *v) {
317317
return false;
318318
}

0 commit comments

Comments
 (0)