Skip to content

Commit 343b4c3

Browse files
committed
collections: Simplify VecDeque::is_empty
Improve is_empty on the VecDeque and its iterators by just comparing tail and head; this saves a few instructions (to be able to remove the `& (size - 1)` computation, it would have to know that size is a power of two).
1 parent 7ba7622 commit 343b4c3

File tree

2 files changed

+37
-4
lines changed

2 files changed

+37
-4
lines changed

src/libcollections/vec_deque.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -810,7 +810,7 @@ impl<T> VecDeque<T> {
810810
/// ```
811811
#[stable(feature = "rust1", since = "1.0.0")]
812812
pub fn is_empty(&self) -> bool {
813-
self.len() == 0
813+
self.tail == self.head
814814
}
815815

816816
/// Create a draining iterator that removes the specified range in the
@@ -1916,7 +1916,11 @@ impl<'a, T> DoubleEndedIterator for Iter<'a, T> {
19161916
}
19171917

19181918
#[stable(feature = "rust1", since = "1.0.0")]
1919-
impl<'a, T> ExactSizeIterator for Iter<'a, T> {}
1919+
impl<'a, T> ExactSizeIterator for Iter<'a, T> {
1920+
fn is_empty(&self) -> bool {
1921+
self.head == self.tail
1922+
}
1923+
}
19201924

19211925
#[unstable(feature = "fused", issue = "35602")]
19221926
impl<'a, T> FusedIterator for Iter<'a, T> {}
@@ -1980,7 +1984,11 @@ impl<'a, T> DoubleEndedIterator for IterMut<'a, T> {
19801984
}
19811985

19821986
#[stable(feature = "rust1", since = "1.0.0")]
1983-
impl<'a, T> ExactSizeIterator for IterMut<'a, T> {}
1987+
impl<'a, T> ExactSizeIterator for IterMut<'a, T> {
1988+
fn is_empty(&self) -> bool {
1989+
self.head == self.tail
1990+
}
1991+
}
19841992

19851993
#[unstable(feature = "fused", issue = "35602")]
19861994
impl<'a, T> FusedIterator for IterMut<'a, T> {}
@@ -2017,7 +2025,11 @@ impl<T> DoubleEndedIterator for IntoIter<T> {
20172025
}
20182026

20192027
#[stable(feature = "rust1", since = "1.0.0")]
2020-
impl<T> ExactSizeIterator for IntoIter<T> {}
2028+
impl<T> ExactSizeIterator for IntoIter<T> {
2029+
fn is_empty(&self) -> bool {
2030+
self.inner.is_empty()
2031+
}
2032+
}
20212033

20222034
#[unstable(feature = "fused", issue = "35602")]
20232035
impl<T> FusedIterator for IntoIter<T> {}

src/libcollectionstest/vec_deque.rs

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1007,3 +1007,24 @@ fn assert_covariance() {
10071007
d
10081008
}
10091009
}
1010+
1011+
#[test]
1012+
fn test_is_empty() {
1013+
let mut v = VecDeque::<i32>::new();
1014+
assert!(v.is_empty());
1015+
assert!(v.iter().is_empty());
1016+
assert!(v.iter_mut().is_empty());
1017+
v.extend(&[2, 3, 4]);
1018+
assert!(!v.is_empty());
1019+
assert!(!v.iter().is_empty());
1020+
assert!(!v.iter_mut().is_empty());
1021+
while let Some(_) = v.pop_front() {
1022+
assert_eq!(v.is_empty(), v.len() == 0);
1023+
assert_eq!(v.iter().is_empty(), v.iter().len() == 0);
1024+
assert_eq!(v.iter_mut().is_empty(), v.iter_mut().len() == 0);
1025+
}
1026+
assert!(v.is_empty());
1027+
assert!(v.iter().is_empty());
1028+
assert!(v.iter_mut().is_empty());
1029+
assert!(v.into_iter().is_empty());
1030+
}

0 commit comments

Comments
 (0)