Skip to content

Commit 85bb851

Browse files
authored
Try #83:
2 parents 64886bb + 374a915 commit 85bb851

File tree

1 file changed

+20
-45
lines changed

1 file changed

+20
-45
lines changed

src/bitmap/store.rs

Lines changed: 20 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -323,35 +323,23 @@ impl Store {
323323
pub fn intersect_with(&mut self, other: &Self) {
324324
match (self, other) {
325325
(&mut Array(ref mut vec1), &Array(ref vec2)) => {
326-
let mut i1 = 0usize;
327-
let mut iter2 = vec2.iter();
328-
let mut current2 = iter2.next();
329-
while i1 < vec1.len() {
330-
match current2.map(|c2| vec1[i1].cmp(c2)) {
331-
None | Some(Less) => {
332-
vec1.remove(i1);
333-
}
334-
Some(Greater) => {
335-
current2 = iter2.next();
336-
}
337-
Some(Equal) => {
338-
i1 += 1;
339-
current2 = iter2.next();
340-
}
341-
}
342-
}
326+
let mut i = 0;
327+
vec1.retain(|x| {
328+
i += vec2
329+
.iter()
330+
.skip(i)
331+
.position(|y| y >= x)
332+
.unwrap_or(vec2.len());
333+
vec2.get(i).map_or(false, |y| x == y)
334+
});
343335
}
344336
(&mut Bitmap(ref mut bits1), &Bitmap(ref bits2)) => {
345337
for (index1, &index2) in bits1.iter_mut().zip(bits2.iter()) {
346338
*index1 &= index2;
347339
}
348340
}
349341
(&mut Array(ref mut vec), store @ &Bitmap(..)) => {
350-
for i in (0..(vec.len())).rev() {
351-
if !store.contains(vec[i]) {
352-
vec.remove(i);
353-
}
354-
}
342+
vec.retain(|x| store.contains(*x));
355343
}
356344
(this @ &mut Bitmap(..), &Array(..)) => {
357345
let mut new = other.clone();
@@ -364,24 +352,15 @@ impl Store {
364352
pub fn difference_with(&mut self, other: &Self) {
365353
match (self, other) {
366354
(&mut Array(ref mut vec1), &Array(ref vec2)) => {
367-
let mut i1 = 0usize;
368-
let mut iter2 = vec2.iter();
369-
let mut current2 = iter2.next();
370-
while i1 < vec1.len() {
371-
match current2.map(|c2| vec1[i1].cmp(c2)) {
372-
None => break,
373-
Some(Less) => {
374-
i1 += 1;
375-
}
376-
Some(Greater) => {
377-
current2 = iter2.next();
378-
}
379-
Some(Equal) => {
380-
vec1.remove(i1);
381-
current2 = iter2.next();
382-
}
383-
}
384-
}
355+
let mut i = 0;
356+
vec1.retain(|x| {
357+
i += vec2
358+
.iter()
359+
.skip(i)
360+
.position(|y| y >= x)
361+
.unwrap_or(vec2.len());
362+
vec2.get(i).map_or(true, |y| x != y)
363+
});
385364
}
386365
(ref mut this @ &mut Bitmap(..), &Array(ref vec2)) => {
387366
for index in vec2.iter() {
@@ -394,11 +373,7 @@ impl Store {
394373
}
395374
}
396375
(&mut Array(ref mut vec), store @ &Bitmap(..)) => {
397-
for i in (0..vec.len()).rev() {
398-
if store.contains(vec[i]) {
399-
vec.remove(i);
400-
}
401-
}
376+
vec.retain(|x| !store.contains(*x));
402377
}
403378
}
404379
}

0 commit comments

Comments
 (0)