UsingQueue can clone rather than just take.
This commit is contained in:
parent
af65945b58
commit
5665083e20
@ -74,6 +74,12 @@ impl<T> UsingQueue<T> where T: Clone {
|
|||||||
self.in_use.iter().position(|r| predicate(r)).map(|i| self.in_use.remove(i))
|
self.in_use.iter().position(|r| predicate(r)).map(|i| self.in_use.remove(i))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Returns `Some` item which is the first that `f` returns `true` with a reference to it
|
||||||
|
/// as a parameter or `None` if no such item exists in the queue.
|
||||||
|
pub fn clone_used_if<P>(&mut self, predicate: P) -> Option<T> where P: Fn(&T) -> bool {
|
||||||
|
self.in_use.iter().find(|r| predicate(r)).cloned()
|
||||||
|
}
|
||||||
|
|
||||||
/// Returns the most recently pushed block if `f` returns `true` with a reference to it as
|
/// Returns the most recently pushed block if `f` returns `true` with a reference to it as
|
||||||
/// a parameter, otherwise `None`.
|
/// a parameter, otherwise `None`.
|
||||||
/// Will not destroy a block if a reference to it has previously been returned by `use_last_ref`,
|
/// Will not destroy a block if a reference to it has previously been returned by `use_last_ref`,
|
||||||
@ -94,18 +100,52 @@ impl<T> UsingQueue<T> where T: Clone {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn should_find_when_pushed() {
|
fn should_not_find_when_pushed() {
|
||||||
let mut q = UsingQueue::new(2);
|
let mut q = UsingQueue::new(2);
|
||||||
q.push(1);
|
q.push(1);
|
||||||
assert!(q.take_used_if(|i| i == &1).is_none());
|
assert!(q.take_used_if(|i| i == &1).is_none());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn should_not_find_when_pushed_with_clone() {
|
||||||
|
let mut q = UsingQueue::new(2);
|
||||||
|
q.push(1);
|
||||||
|
assert!(q.clone_used_if(|i| i == &1).is_none());
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn should_find_when_pushed_and_used() {
|
fn should_find_when_pushed_and_used() {
|
||||||
let mut q = UsingQueue::new(2);
|
let mut q = UsingQueue::new(2);
|
||||||
q.push(1);
|
q.push(1);
|
||||||
q.use_last_ref();
|
q.use_last_ref();
|
||||||
assert!(q.take_used_if(|i| i == &1).is_some());
|
assert!(q.take_used_if(|i| i == &1).unwrap() == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn should_find_when_pushed_and_used_with_clone() {
|
||||||
|
let mut q = UsingQueue::new(2);
|
||||||
|
q.push(1);
|
||||||
|
q.use_last_ref();
|
||||||
|
assert!(q.clone_used_if(|i| i == &1).unwrap() == 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn should_not_find_again_when_pushed_and_taken() {
|
||||||
|
let mut q = UsingQueue::new(2);
|
||||||
|
q.push(1);
|
||||||
|
q.use_last_ref();
|
||||||
|
assert!(q.take_used_if(|i| i == &1).unwrap() == 1);
|
||||||
|
assert!(q.clone_used_if(|i| i == &1).is_none());
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn should_find_again_when_pushed_and_cloned() {
|
||||||
|
let mut q = UsingQueue::new(2);
|
||||||
|
q.push(1);
|
||||||
|
q.use_last_ref();
|
||||||
|
assert!(q.clone_used_if(|i| i == &1).unwrap() == 1);
|
||||||
|
assert!(q.clone_used_if(|i| i == &1).unwrap() == 1);
|
||||||
|
assert!(q.take_used_if(|i| i == &1).unwrap() == 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
Loading…
Reference in New Issue
Block a user