Skip to content

Commit 684da86

Browse files
thestingergraydon
authored andcommitted
---
yaml --- r: 41805 b: refs/heads/master c: 4f92d8f h: refs/heads/master i: 41803: 013d004 v: v3
1 parent f7419d5 commit 684da86

File tree

2 files changed

+19
-5
lines changed

2 files changed

+19
-5
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: 9fb49088b35ae82c290ed112cdc87b71986d3d7e
2+
refs/heads/master: 4f92d8fb52ba335abae39bdd38e72ff42cd37bb2
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 2f46b763da2c098913884f101b6d71d69af41b49
55
refs/heads/try: 3d5418789064fdb463e872a4e651af1c628a3650

trunk/src/libstd/treemap.rs

Lines changed: 18 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -338,10 +338,24 @@ impl <T: Ord> TreeSet<T> {
338338

339339
/// Visit the values (in-order) representing the intersection
340340
pure fn intersection(&self, other: &TreeSet<T>, f: fn(&T) -> bool) {
341-
// FIXME: this is a naive O(n*log(m)) implementation, could be O(n + m)
342-
for self.each |x| {
343-
if other.contains(x) {
344-
if !f(x) { break }
341+
let mut x = self.iter();
342+
let mut y = other.iter();
343+
344+
unsafe { // purity workaround
345+
let mut a = x.next();
346+
let mut b = y.next();
347+
348+
while a.is_some() && b.is_some() {
349+
let a1 = a.unwrap();
350+
let b1 = b.unwrap();
351+
if a1 < b1 {
352+
a = x.next();
353+
} else {
354+
if !(b1 < a1) {
355+
if !f(a1) { return }
356+
}
357+
b = y.next();
358+
}
345359
}
346360
}
347361
}

0 commit comments

Comments
 (0)