Skip to content

Commit 68db5d8

Browse files
author
Steve Jenson
committed
size_hint() and .. for drain
* Replaced unit tests with quickcheck tests. * Added a size_hint method. * drain now takes a `..` argument.
1 parent 76b3598 commit 68db5d8

File tree

2 files changed

+27
-47
lines changed

2 files changed

+27
-47
lines changed

src/lib.rs

+15-47
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ use std::hash::BuildHasher;
99
use std::hash::Hasher;
1010
use std::collections::hash_map::RandomState;
1111
use std::borrow::Borrow;
12+
use std::ops::RangeFull;
1213

1314
use std::cmp::{max, Ordering};
1415
use std::fmt;
@@ -400,18 +401,6 @@ impl<K, V, S> OrderMap<K, V, S>
400401
pub fn capacity(&self) -> usize {
401402
usable_capacity(self.raw_capacity())
402403
}
403-
404-
/// Clears the `OrderMap`, returning all key-value pairs as a `Drain`.
405-
/// Keeps the allocated memory for reuse.
406-
pub fn drain(&mut self) -> Drain<K, V> {
407-
for i in &mut self.indices {
408-
*i = Pos::none();
409-
}
410-
411-
Drain {
412-
inner: self.entries.drain(..),
413-
}
414-
}
415404
}
416405

417406
/// Trait for the "size class". Either u32 or u64 depending on the index
@@ -991,6 +980,17 @@ impl<K, V, S> OrderMap<K, V, S>
991980
self.entries.sort_by(move |a, b| cmp(&a.key, &a.value, &b.key, &b.value));
992981
self.into_iter()
993982
}
983+
/// Clears the `OrderMap`, returning all key-value pairs as a drain iterator.
984+
/// Keeps the allocated memory for reuse.
985+
pub fn drain(&mut self, range: RangeFull) -> Drain<K, V> {
986+
for i in &mut self.indices {
987+
*i = Pos::none();
988+
}
989+
990+
Drain {
991+
inner: self.entries.drain(range),
992+
}
993+
}
994994
}
995995

996996
impl<K, V, S> OrderMap<K, V, S> {
@@ -1517,6 +1517,9 @@ impl<'a, K, V> Iterator for Drain<'a, K, V> {
15171517
fn next(&mut self) -> Option<Self::Item> {
15181518
self.inner.next().map(|bucket| (bucket.key, bucket.value))
15191519
}
1520+
fn size_hint(&self) -> (usize, Option<usize>) {
1521+
self.inner.size_hint()
1522+
}
15201523
}
15211524

15221525
#[cfg(test)]
@@ -1713,39 +1716,4 @@ mod tests {
17131716
assert_ne!(map_a, map_c);
17141717
assert_ne!(map_c, map_a);
17151718
}
1716-
1717-
1718-
#[test]
1719-
fn drain_basic() {
1720-
let mut map_a = OrderMap::new();
1721-
map_a.insert(1, "1");
1722-
map_a.insert(2, "2");
1723-
let entries: Vec<(u32, &str)> = map_a.drain().collect();
1724-
assert!(map_a.is_empty());
1725-
assert_eq!(entries.len(), 2);
1726-
assert!(map_a.is_empty());
1727-
1728-
map_a.insert(3, "3");
1729-
assert!(!map_a.is_empty());
1730-
assert_eq!(map_a.len(), 1);
1731-
assert!(map_a.get(&3).is_some());
1732-
assert!(map_a.get(&1).is_none());
1733-
}
1734-
1735-
#[test]
1736-
fn drain_after_resize() {
1737-
let mut map_a = OrderMap::with_capacity(2);
1738-
map_a.insert(1, "1");
1739-
map_a.insert(2, "2");
1740-
map_a.insert(3, "3");
1741-
let entries: Vec<(u32, &str)> = map_a.drain().collect();
1742-
assert!(map_a.is_empty());
1743-
assert_eq!(entries.len(), 3);
1744-
1745-
map_a.insert(4, "4");
1746-
assert!(!map_a.is_empty());
1747-
assert_eq!(map_a.len(), 1);
1748-
assert!(map_a.get(&4).is_some());
1749-
assert!(map_a.get(&1).is_none());
1750-
}
17511719
}

tests/quick.rs

+12
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,18 @@ quickcheck! {
105105
map.capacity() >= cap
106106
}
107107

108+
fn drain(insert: Vec<u8>) -> bool {
109+
let mut map = OrderMap::new();
110+
for &key in &insert {
111+
map.insert(key, ());
112+
}
113+
let mut clone = map.clone();
114+
let drained = clone.drain(..);
115+
for (key, _) in drained {
116+
map.remove(&key);
117+
}
118+
map.is_empty()
119+
}
108120
}
109121

110122
use Op::*;

0 commit comments

Comments
 (0)