pub trait Drain {
fn drain(&mut self);
}
impl<T, I> Drain for T
where
T: Iterator<Item = I>,
{
fn drain(&mut self) {
for item in self {
drop(item);
}
}
}
#[cfg(test)]
mod tests {
use super::*;
use std::sync::atomic::{AtomicUsize, Ordering};
#[test]
fn test_drain_with_non_clone_iterator() {
let items: std::collections::VecDeque<i32> =
vec![1, 2, 3].into_iter().collect();
let mut iter = items.into_iter();
iter.drain();
assert!(iter.next().is_none());
}
#[test]
fn test_drain_drops_all_items() {
static DROP_COUNT: AtomicUsize = AtomicUsize::new(0);
struct DropCounter;
impl Drop for DropCounter {
fn drop(&mut self) {
DROP_COUNT.fetch_add(1, Ordering::SeqCst);
}
}
DROP_COUNT.store(0, Ordering::SeqCst);
let items: Vec<DropCounter> = (0..5).map(|_| DropCounter).collect();
let mut iter = items.into_iter();
iter.drain();
assert_eq!(DROP_COUNT.load(Ordering::SeqCst), 5);
}
}