Skip to content

Commit 52dd08e

Browse files
authored
Add LinkedHashSet::drain (#11)
1 parent b168e5c commit 52dd08e

File tree

2 files changed

+107
-107
lines changed

2 files changed

+107
-107
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
## 0.1.5
2+
* Add `LinkedHashSet::drain`.
23
* `LinkedHashSet::back` now uses `&self` instead of `&mut self`.
34
* Require _linked-hash-map_ 0.5.6.
45

src/lib.rs

Lines changed: 106 additions & 107 deletions
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ use std::{
118118
/// ```
119119
/// use linked_hash_set::LinkedHashSet;
120120
///
121-
/// let viking_names: LinkedHashSet<&str> = ["Einar", "Olaf", "Harald"].iter().cloned().collect();
121+
/// let viking_names: LinkedHashSet<&str> = ["Einar", "Olaf", "Harald"].into_iter().collect();
122122
/// // use the values stored in the set
123123
/// ```
124124
///
@@ -325,8 +325,8 @@ where
325325
///
326326
/// ```
327327
/// use linked_hash_set::LinkedHashSet;
328-
/// let a: LinkedHashSet<_> = [1, 2, 3].iter().cloned().collect();
329-
/// let b: LinkedHashSet<_> = [4, 2, 3, 4].iter().cloned().collect();
328+
/// let a: LinkedHashSet<_> = [1, 2, 3].into_iter().collect();
329+
/// let b: LinkedHashSet<_> = [4, 2, 3, 4].into_iter().collect();
330330
///
331331
/// // Can be seen as `a - b`.
332332
/// for x in a.difference(&b) {
@@ -355,8 +355,8 @@ where
355355
///
356356
/// ```
357357
/// use linked_hash_set::LinkedHashSet;
358-
/// let a: LinkedHashSet<_> = [1, 2, 3].iter().cloned().collect();
359-
/// let b: LinkedHashSet<_> = [4, 2, 3, 4].iter().cloned().collect();
358+
/// let a: LinkedHashSet<_> = [1, 2, 3].into_iter().collect();
359+
/// let b: LinkedHashSet<_> = [4, 2, 3, 4].into_iter().collect();
360360
///
361361
/// // Print 1, 4 in insertion order.
362362
/// for x in a.symmetric_difference(&b) {
@@ -385,8 +385,8 @@ where
385385
///
386386
/// ```
387387
/// use linked_hash_set::LinkedHashSet;
388-
/// let a: LinkedHashSet<_> = [1, 2, 3].iter().cloned().collect();
389-
/// let b: LinkedHashSet<_> = [4, 2, 3, 4].iter().cloned().collect();
388+
/// let a: LinkedHashSet<_> = [1, 2, 3].into_iter().collect();
389+
/// let b: LinkedHashSet<_> = [4, 2, 3, 4].into_iter().collect();
390390
///
391391
/// // Print 2, 3 in insertion order.
392392
/// for x in a.intersection(&b) {
@@ -410,8 +410,8 @@ where
410410
///
411411
/// ```
412412
/// use linked_hash_set::LinkedHashSet;
413-
/// let a: LinkedHashSet<_> = [1, 2, 3].iter().cloned().collect();
414-
/// let b: LinkedHashSet<_> = [4, 2, 3, 4].iter().cloned().collect();
413+
/// let a: LinkedHashSet<_> = [1, 2, 3].into_iter().collect();
414+
/// let b: LinkedHashSet<_> = [4, 2, 3, 4].into_iter().collect();
415415
///
416416
/// // Print 1, 2, 3, 4 in insertion order.
417417
/// for x in a.union(&b) {
@@ -459,28 +459,29 @@ where
459459
self.map.is_empty()
460460
}
461461

462-
// TODO not in linked_hash_map
463-
// /// Clears the set, returning all elements in an iterator.
464-
// ///
465-
// /// # Examples
466-
// ///
467-
// /// ```
468-
// /// use linked_hash_set::LinkedHashSet;
469-
// ///
470-
// /// let mut set: LinkedHashSet<_> = [1, 2, 3].iter().cloned().collect();
471-
// /// assert!(!set.is_empty());
472-
// ///
473-
// /// // print 1, 2, 3 in an insertion order
474-
// /// for i in set.drain() {
475-
// /// println!("{}", i);
476-
// /// }
477-
// ///
478-
// /// assert!(set.is_empty());
479-
// /// ```
480-
// #[inline]
481-
// pub fn drain(&mut self) -> Drain<T> {
482-
// Drain { iter: self.map.drain() }
483-
// }
462+
/// Clears the set, returning all elements in an iterator.
463+
///
464+
/// # Examples
465+
///
466+
/// ```
467+
/// use linked_hash_set::LinkedHashSet;
468+
///
469+
/// let mut set: LinkedHashSet<_> = [1, 2, 3].into_iter().collect();
470+
/// assert!(!set.is_empty());
471+
///
472+
/// // print 1, 2, 3 in an insertion order
473+
/// for i in set.drain() {
474+
/// println!("{}", i);
475+
/// }
476+
///
477+
/// assert!(set.is_empty());
478+
/// ```
479+
#[inline]
480+
pub fn drain(&mut self) -> Drain<T> {
481+
Drain {
482+
iter: self.map.drain(),
483+
}
484+
}
484485

485486
/// Clears the set, removing all values.
486487
///
@@ -509,7 +510,7 @@ where
509510
/// ```
510511
/// use linked_hash_set::LinkedHashSet;
511512
///
512-
/// let set: LinkedHashSet<_> = [1, 2, 3].iter().cloned().collect();
513+
/// let set: LinkedHashSet<_> = [1, 2, 3].into_iter().collect();
513514
/// assert_eq!(set.contains(&1), true);
514515
/// assert_eq!(set.contains(&4), false);
515516
/// ```
@@ -535,7 +536,7 @@ where
535536
/// ```
536537
/// use linked_hash_set::LinkedHashSet;
537538
///
538-
/// let mut set: LinkedHashSet<_> = [1, 2, 3].iter().cloned().collect();
539+
/// let mut set: LinkedHashSet<_> = [1, 2, 3].into_iter().collect();
539540
/// let was_refreshed = set.refresh(&2);
540541
///
541542
/// assert_eq!(was_refreshed, true);
@@ -571,7 +572,7 @@ where
571572
/// ```
572573
/// use linked_hash_set::LinkedHashSet;
573574
///
574-
/// let a: LinkedHashSet<_> = [1, 2, 3].iter().cloned().collect();
575+
/// let a: LinkedHashSet<_> = [1, 2, 3].into_iter().collect();
575576
/// let mut b = LinkedHashSet::new();
576577
///
577578
/// assert_eq!(a.is_disjoint(&b), true);
@@ -592,7 +593,7 @@ where
592593
/// ```
593594
/// use linked_hash_set::LinkedHashSet;
594595
///
595-
/// let sup: LinkedHashSet<_> = [1, 2, 3].iter().cloned().collect();
596+
/// let sup: LinkedHashSet<_> = [1, 2, 3].into_iter().collect();
596597
/// let mut set = LinkedHashSet::new();
597598
///
598599
/// assert_eq!(set.is_subset(&sup), true);
@@ -613,7 +614,7 @@ where
613614
/// ```
614615
/// use linked_hash_set::LinkedHashSet;
615616
///
616-
/// let sub: LinkedHashSet<_> = [1, 2].iter().cloned().collect();
617+
/// let sub: LinkedHashSet<_> = [1, 2].into_iter().collect();
617618
/// let mut set = LinkedHashSet::new();
618619
///
619620
/// assert_eq!(set.is_superset(&sub), false);
@@ -1016,17 +1017,16 @@ pub struct IntoIter<K> {
10161017
iter: map::IntoIter<K, ()>,
10171018
}
10181019

1019-
// TODO not in linked_hash_map
1020-
// /// A draining iterator over the items of a `LinkedHashSet`.
1021-
// ///
1022-
// /// This `struct` is created by the [`drain`] method on [`LinkedHashSet`].
1023-
// /// See its documentation for more.
1024-
// ///
1025-
// /// [`LinkedHashSet`]: struct.LinkedHashSet.html
1026-
// /// [`drain`]: struct.LinkedHashSet.html#method.drain
1027-
// pub struct Drain<'a, K: 'a> {
1028-
// iter: map::Drain<'a, K, ()>,
1029-
// }
1020+
/// A draining iterator over the items of a `LinkedHashSet`.
1021+
///
1022+
/// This `struct` is created by the [`drain`] method on [`LinkedHashSet`].
1023+
/// See its documentation for more.
1024+
///
1025+
/// [`LinkedHashSet`]: struct.LinkedHashSet.html
1026+
/// [`drain`]: struct.LinkedHashSet.html#method.drain
1027+
pub struct Drain<'a, K: 'a> {
1028+
iter: map::Drain<'a, K, ()>,
1029+
}
10301030

10311031
/// A lazy iterator producing elements in the intersection of `LinkedHashSet`s.
10321032
///
@@ -1192,23 +1192,24 @@ impl<K> DoubleEndedIterator for IntoIter<K> {
11921192
// }
11931193
// }
11941194

1195-
// TODO not in linked_hash_map
1196-
// impl<'a, K> Iterator for Drain<'a, K> {
1197-
// type Item = K;
1198-
//
1199-
// fn next(&mut self) -> Option<K> {
1200-
// self.iter.next().map(|(k, _)| k)
1201-
// }
1202-
// fn size_hint(&self) -> (usize, Option<usize>) {
1203-
// self.iter.size_hint()
1204-
// }
1205-
// }
1206-
// impl<'a, K> ExactSizeIterator for Drain<'a, K> {
1207-
// fn len(&self) -> usize {
1208-
// self.iter.len()
1209-
// }
1210-
// }
1211-
//
1195+
impl<K> Iterator for Drain<'_, K> {
1196+
type Item = K;
1197+
1198+
fn next(&mut self) -> Option<K> {
1199+
self.iter.next().map(|(k, _)| k)
1200+
}
1201+
fn size_hint(&self) -> (usize, Option<usize>) {
1202+
self.iter.size_hint()
1203+
}
1204+
}
1205+
1206+
impl<K> ExactSizeIterator for Drain<'_, K> {
1207+
fn len(&self) -> usize {
1208+
self.iter.len()
1209+
}
1210+
}
1211+
1212+
// TODO Non-trivial port without private access to map
12121213
// impl<'a, K: fmt::Debug> fmt::Debug for Drain<'a, K> {
12131214
// fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
12141215
// let entries_iter = self.iter
@@ -1680,72 +1681,70 @@ mod test_set {
16801681
assert_eq!(format!("{:?}", empty), "{}");
16811682
}
16821683

1683-
// #[test]
1684-
// fn test_trivial_drain() {
1685-
// let mut s = LinkedHashSet::<i32>::new();
1686-
// for _ in s.drain() {}
1687-
// assert!(s.is_empty());
1688-
// drop(s);
1689-
//
1690-
// let mut s = LinkedHashSet::<i32>::new();
1691-
// drop(s.drain());
1692-
// assert!(s.is_empty());
1693-
// }
1684+
#[test]
1685+
fn test_trivial_drain() {
1686+
let mut s = LinkedHashSet::<i32>::new();
1687+
for _ in s.drain() {}
1688+
assert!(s.is_empty());
1689+
drop(s);
16941690

1695-
// #[test]
1696-
// fn test_drain() {
1697-
// let mut s: LinkedHashSet<_> = (1..100).collect();
1698-
//
1699-
// // try this a bunch of times to make sure we don't screw up internal state.
1700-
// for _ in 0..20 {
1701-
// assert_eq!(s.len(), 99);
1702-
//
1703-
// {
1704-
// let mut last_i = 0;
1705-
// let mut d = s.drain();
1706-
// for (i, x) in d.by_ref().take(50).enumerate() {
1707-
// last_i = i;
1708-
// assert!(x != 0);
1709-
// }
1710-
// assert_eq!(last_i, 49);
1711-
// }
1712-
//
1713-
// for _ in &s {
1714-
// panic!("s should be empty!");
1715-
// }
1716-
//
1717-
// // reset to try again.
1718-
// s.extend(1..100);
1719-
// }
1720-
// }
1691+
let mut s = LinkedHashSet::<i32>::new();
1692+
drop(s.drain());
1693+
assert!(s.is_empty());
1694+
}
1695+
1696+
#[test]
1697+
fn test_drain() {
1698+
let mut s: LinkedHashSet<_> = (1..100).collect();
1699+
1700+
// try this a bunch of times to make sure we don't screw up internal state.
1701+
for _ in 0..20 {
1702+
assert_eq!(s.len(), 99);
1703+
1704+
{
1705+
let mut last_i = 0;
1706+
let mut d = s.drain();
1707+
for (i, x) in d.by_ref().take(50).enumerate() {
1708+
last_i = i;
1709+
assert!(x != 0);
1710+
}
1711+
assert_eq!(last_i, 49);
1712+
}
1713+
1714+
assert!(s.is_empty(), "{s:?}");
1715+
1716+
// reset to try again.
1717+
s.extend(1..100);
1718+
}
1719+
}
17211720

17221721
// #[test]
17231722
// fn test_replace() {
17241723
// use std::hash;
1725-
//
1724+
17261725
// #[derive(Debug)]
17271726
// struct Foo(&'static str, i32);
1728-
//
1727+
17291728
// impl PartialEq for Foo {
17301729
// fn eq(&self, other: &Self) -> bool {
17311730
// self.0 == other.0
17321731
// }
17331732
// }
1734-
//
1733+
17351734
// impl Eq for Foo {}
1736-
//
1735+
17371736
// impl hash::Hash for Foo {
17381737
// fn hash<H: hash::Hasher>(&self, h: &mut H) {
17391738
// self.0.hash(h);
17401739
// }
17411740
// }
1742-
//
1741+
17431742
// let mut s = LinkedHashSet::new();
17441743
// assert_eq!(s.replace(Foo("a", 1)), None);
17451744
// assert_eq!(s.len(), 1);
17461745
// assert_eq!(s.replace(Foo("a", 2)), Some(Foo("a", 1)));
17471746
// assert_eq!(s.len(), 1);
1748-
//
1747+
17491748
// let mut it = s.iter();
17501749
// assert_eq!(it.next(), Some(&Foo("a", 2)));
17511750
// assert_eq!(it.next(), None);

0 commit comments

Comments
 (0)