diff --git a/src/liballoc/collections/binary_heap/mod.rs b/src/liballoc/collections/binary_heap/mod.rs index a820a50..7168db5 100644 --- a/src/liballoc/collections/binary_heap/mod.rs +++ b/src/liballoc/collections/binary_heap/mod.rs @@ -845,7 +845,6 @@ impl, O: TotalOrder> BinaryHeap { /// /// assert_eq!(heap.into_sorted_vec(), [-10, 2, 4]) /// ``` - #[cfg(feature = "binary_heap_retain")] pub fn retain(&mut self, mut f: F) where F: FnMut(&T) -> bool, @@ -1479,6 +1478,20 @@ cfg_if! { impl FusedIterator for IntoIter {} + #[rustversion::since(1.69)] + impl Default for IntoIter { + /// Creates an empty `binary_heap::IntoIter`. + /// + /// ``` + /// # use copse::binary_heap; + /// let iter: binary_heap::IntoIter = Default::default(); + /// assert_eq!(iter.len(), 0); + /// ``` + fn default() -> Self { + IntoIter { iter: Default::default() } + } + } + // In addition to the SAFETY invariants of the following three unsafe traits // also refer to the vec::in_place_collect module documentation to get an overview #[cfg(feature = "inplace_iteration")] diff --git a/src/liballoc/collections/btree/map.rs b/src/liballoc/collections/btree/map.rs index 706a04f..ecf27b9 100644 --- a/src/liballoc/collections/btree/map.rs +++ b/src/liballoc/collections/btree/map.rs @@ -382,6 +382,19 @@ impl fmt::Debug for Iter<'_, K, V> { } } +impl<'a, K: 'a, V: 'a> Default for Iter<'a, K, V> { + /// Creates an empty `btree_map::Iter`. + /// + /// ``` + /// # use copse::btree_map; + /// let iter: btree_map::Iter<'_, u8, u8> = Default::default(); + /// assert_eq!(iter.len(), 0); + /// ``` + fn default() -> Self { + Iter { range: Default::default(), length: 0 } + } +} + /// A mutable iterator over the entries of a `BTreeMap`. /// /// This `struct` is created by the [`iter_mut`] method on [`BTreeMap`]. See its @@ -404,6 +417,19 @@ impl fmt::Debug for IterMut<'_, K, V> { } } +impl<'a, K: 'a, V: 'a> Default for IterMut<'a, K, V> { + /// Creates an empty `btree_map::IterMut`. + /// + /// ``` + /// # use copse::btree_map; + /// let iter: btree_map::IterMut<'_, u8, u8> = Default::default(); + /// assert_eq!(iter.len(), 0); + /// ``` + fn default() -> Self { + IterMut { range: Default::default(), length: 0, _marker: PhantomData {} } + } +} + /// An owning iterator over the entries of a `BTreeMap`. /// /// This `struct` is created by the [`into_iter`] method on [`BTreeMap`] @@ -433,6 +459,22 @@ impl Debug for IntoIter { } } +impl Default for IntoIter +where + A: Allocator + Default + Clone, +{ + /// Creates an empty `btree_map::IntoIter`. + /// + /// ``` + /// # use copse::btree_map; + /// let iter: btree_map::IntoIter = Default::default(); + /// assert_eq!(iter.len(), 0); + /// ``` + fn default() -> Self { + IntoIter { range: Default::default(), length: 0, alloc: Default::default() } + } +} + /// An iterator over the keys of a `BTreeMap`. /// /// This `struct` is created by the [`keys`] method on [`BTreeMap`]. See its @@ -1861,6 +1903,19 @@ impl Clone for Keys<'_, K, V> { } } +impl Default for Keys<'_, K, V> { + /// Creates an empty `btree_map::Keys`. + /// + /// ``` + /// # use copse::btree_map; + /// let iter: btree_map::Keys<'_, u8, u8> = Default::default(); + /// assert_eq!(iter.len(), 0); + /// ``` + fn default() -> Self { + Keys { inner: Default::default() } + } +} + impl<'a, K, V> Iterator for Values<'a, K, V> { type Item = &'a V; @@ -1897,6 +1952,19 @@ impl Clone for Values<'_, K, V> { } } +impl Default for Values<'_, K, V> { + /// Creates an empty `btree_map::Values`. + /// + /// ``` + /// # use copse::btree_map; + /// let iter: btree_map::Values<'_, u8, u8> = Default::default(); + /// assert_eq!(iter.len(), 0); + /// ``` + fn default() -> Self { + Values { inner: Default::default() } + } +} + decorate_if! { /// An iterator produced by calling `drain_filter` on BTreeMap. if #[cfg(feature = "btree_drain_filter")] { pub } @@ -2025,6 +2093,19 @@ impl<'a, K, V> Iterator for Range<'a, K, V> { } } +impl Default for Range<'_, K, V> { + /// Creates an empty `btree_map::Range`. + /// + /// ``` + /// # use copse::btree_map; + /// let iter: btree_map::Range<'_, u8, u8> = Default::default(); + /// assert_eq!(iter.count(), 0); + /// ``` + fn default() -> Self { + Range { inner: Default::default() } + } +} + impl<'a, K, V> Iterator for ValuesMut<'a, K, V> { type Item = &'a mut V; @@ -2093,6 +2174,22 @@ impl ExactSizeIterator for IntoKeys { impl FusedIterator for IntoKeys {} +impl Default for IntoKeys +where + A: Allocator + Default + Clone, +{ + /// Creates an empty `btree_map::IntoKeys`. + /// + /// ``` + /// # use copse::btree_map; + /// let iter: btree_map::IntoKeys = Default::default(); + /// assert_eq!(iter.len(), 0); + /// ``` + fn default() -> Self { + IntoKeys { inner: Default::default() } + } +} + impl Iterator for IntoValues { type Item = V; @@ -2123,6 +2220,22 @@ impl ExactSizeIterator for IntoValues { impl FusedIterator for IntoValues {} +impl Default for IntoValues +where + A: Allocator + Default + Clone, +{ + /// Creates an empty `btree_map::IntoValues`. + /// + /// ``` + /// # use copse::btree_map; + /// let iter: btree_map::IntoValues = Default::default(); + /// assert_eq!(iter.len(), 0); + /// ``` + fn default() -> Self { + IntoValues { inner: Default::default() } + } +} + impl<'a, K, V> DoubleEndedIterator for Range<'a, K, V> { fn next_back(&mut self) -> Option<(&'a K, &'a V)> { self.inner.next_back_checked() diff --git a/src/liballoc/collections/btree/mod.rs b/src/liballoc/collections/btree/mod.rs index 7552f2f..c7d0144 100644 --- a/src/liballoc/collections/btree/mod.rs +++ b/src/liballoc/collections/btree/mod.rs @@ -13,7 +13,6 @@ pub mod set; mod set_val; mod split; -#[doc(hidden)] trait Recover { type Key; diff --git a/src/liballoc/collections/btree/navigate.rs b/src/liballoc/collections/btree/navigate.rs index 7054799..3354ce2 100644 --- a/src/liballoc/collections/btree/navigate.rs +++ b/src/liballoc/collections/btree/navigate.rs @@ -19,6 +19,12 @@ impl<'a, K: 'a, V: 'a> Clone for LeafRange, K, V> { } } +impl Default for LeafRange { + fn default() -> Self { + LeafRange { front: None, back: None } + } +} + impl LeafRange { pub fn none() -> Self { LeafRange { front: None, back: None } @@ -124,6 +130,12 @@ pub struct LazyLeafRange { back: Option>, } +impl Default for LazyLeafRange { + fn default() -> Self { + LazyLeafRange { front: None, back: None } + } +} + impl<'a, K: 'a, V: 'a> Clone for LazyLeafRange, K, V> { fn clone(&self) -> Self { LazyLeafRange { front: self.front.clone(), back: self.back.clone() } diff --git a/src/liballoc/collections/btree/set.rs b/src/liballoc/collections/btree/set.rs index 62851ad..0d5a782 100644 --- a/src/liballoc/collections/btree/set.rs +++ b/src/liballoc/collections/btree/set.rs @@ -1,6 +1,3 @@ -// This is pretty much entirely stolen from TreeSet, since BTreeMap has an identical interface -// to TreeMap - use crate::{ default::{OrdStoredKey, OrdTotalOrder}, SortableBy, SortableByWithOrder, TotalOrder, @@ -21,8 +18,6 @@ use super::Recover; use crate::polyfill::*; -// FIXME(conventions): implement bounded iterators - /// An ordered set based on a B-Tree. /// /// See [`BTreeMap`]'s documentation for a detailed discussion of this collection's performance @@ -1598,6 +1593,20 @@ impl Iterator for IntoIter { self.iter.size_hint() } } + +impl Default for Iter<'_, T> { + /// Creates an empty `btree_set::Iter`. + /// + /// ``` + /// # use copse::btree_set; + /// let iter: btree_set::Iter<'_, u8> = Default::default(); + /// assert_eq!(iter.len(), 0); + /// ``` + fn default() -> Self { + Iter { iter: Default::default() } + } +} + impl DoubleEndedIterator for IntoIter { fn next_back(&mut self) -> Option { self.iter.next_back().map(|(k, _)| k) @@ -1611,6 +1620,22 @@ impl ExactSizeIterator for IntoIter { impl FusedIterator for IntoIter {} +impl Default for IntoIter +where + A: Allocator + Default + Clone, +{ + /// Creates an empty `btree_set::IntoIter`. + /// + /// ``` + /// # use copse::btree_set; + /// let iter: btree_set::IntoIter = Default::default(); + /// assert_eq!(iter.len(), 0); + /// ``` + fn default() -> Self { + IntoIter { iter: Default::default() } + } +} + impl Clone for Range<'_, T> { fn clone(&self) -> Self { Range { iter: self.iter.clone() } @@ -1645,6 +1670,19 @@ impl<'a, T> DoubleEndedIterator for Range<'a, T> { impl FusedIterator for Range<'_, T> {} +impl Default for Range<'_, T> { + /// Creates an empty `btree_set::Range`. + /// + /// ``` + /// # use copse::btree_set; + /// let iter: btree_set::Range<'_, u8> = Default::default(); + /// assert_eq!(iter.count(), 0); + /// ``` + fn default() -> Self { + Range { iter: Default::default() } + } +} + impl Clone for Difference<'_, T, O, A> { fn clone(&self) -> Self { Difference { diff --git a/src/polyfill.rs b/src/polyfill.rs index 6b8ad5f..edfa36d 100644 --- a/src/polyfill.rs +++ b/src/polyfill.rs @@ -39,7 +39,7 @@ mod definitions { } } - #[derive(Copy, Clone, Debug)] + #[derive(Copy, Clone, Debug, Default)] pub struct Global; impl Allocator for Global {}