]> git.lizzy.rs Git - rust.git/commitdiff
core, collections: Implement better .is_empty() for slice and vec iterators
authorUlrik Sverdrup <bluss@users.noreply.github.com>
Tue, 22 Nov 2016 22:31:31 +0000 (23:31 +0100)
committerUlrik Sverdrup <bluss@users.noreply.github.com>
Wed, 23 Nov 2016 01:31:41 +0000 (02:31 +0100)
These iterators can use a pointer comparison instead of computing the length.

src/libcollections/lib.rs
src/libcollections/vec.rs
src/libcollectionstest/lib.rs
src/libcollectionstest/slice.rs
src/libcore/slice.rs

index 23d6edd6d794e88c86cc7b2cfc2d0267365a2ee6..f6d83b25b0d89c598468015b5fdfdb04dfd6f19e 100644 (file)
@@ -36,6 +36,7 @@
 #![cfg_attr(not(test), feature(char_escape_debug))]
 #![feature(core_intrinsics)]
 #![feature(dropck_parametricity)]
+#![feature(exact_size_is_empty)]
 #![feature(fmt_internals)]
 #![feature(fused)]
 #![feature(heap_api)]
index 24f8e3a2d918144a8cbda94dccfb1545ef292a95..f26324127003b32b12ecc7570b93ff627c19f8e6 100644 (file)
@@ -1988,7 +1988,11 @@ fn next_back(&mut self) -> Option<T> {
 }
 
 #[stable(feature = "rust1", since = "1.0.0")]
-impl<T> ExactSizeIterator for IntoIter<T> {}
+impl<T> ExactSizeIterator for IntoIter<T> {
+    fn is_empty(&self) -> bool {
+        self.ptr == self.end
+    }
+}
 
 #[unstable(feature = "fused", issue = "35602")]
 impl<T> FusedIterator for IntoIter<T> {}
@@ -2082,7 +2086,11 @@ fn drop(&mut self) {
 
 
 #[stable(feature = "drain", since = "1.6.0")]
-impl<'a, T> ExactSizeIterator for Drain<'a, T> {}
+impl<'a, T> ExactSizeIterator for Drain<'a, T> {
+    fn is_empty(&self) -> bool {
+        self.iter.is_empty()
+    }
+}
 
 #[unstable(feature = "fused", issue = "35602")]
 impl<'a, T> FusedIterator for Drain<'a, T> {}
index 14ec8d58bef61065ad669414be9eb19850670a8d..1e08074b14db8bf5d634544cdf1742df809ba7eb 100644 (file)
@@ -18,6 +18,7 @@
 #![feature(const_fn)]
 #![feature(dedup_by)]
 #![feature(enumset)]
+#![feature(exact_size_is_empty)]
 #![feature(pattern)]
 #![feature(rand)]
 #![feature(repeat_str)]
index a6230ef471cec0f69f9cb197ae8f9cd24a16c9c0..0e63e8d4a1ec8ad6a5ec32202b7841e8d2810b8e 100644 (file)
@@ -633,6 +633,16 @@ fn test_iter_clone() {
     assert_eq!(it.next(), jt.next());
 }
 
+#[test]
+fn test_iter_is_empty() {
+    let xs = [1, 2, 5, 10, 11];
+    for i in 0..xs.len() {
+        for j in i..xs.len() {
+            assert_eq!(xs[i..j].iter().is_empty(), xs[i..j].is_empty());
+        }
+    }
+}
+
 #[test]
 fn test_mut_iterator() {
     let mut xs = [1, 2, 3, 4, 5];
index 871b63145ca6d24c8981bae053aadc54bfee7a6c..ede45111ebbc587371980cd02e27129f2022d6ef 100644 (file)
@@ -983,7 +983,11 @@ fn iter_nth(&mut self, n: usize) -> Option<&'a T> {
 iterator!{struct Iter -> *const T, &'a T}
 
 #[stable(feature = "rust1", since = "1.0.0")]
-impl<'a, T> ExactSizeIterator for Iter<'a, T> {}
+impl<'a, T> ExactSizeIterator for Iter<'a, T> {
+    fn is_empty(&self) -> bool {
+        self.ptr == self.end
+    }
+}
 
 #[unstable(feature = "fused", issue = "35602")]
 impl<'a, T> FusedIterator for Iter<'a, T> {}
@@ -1107,7 +1111,11 @@ fn iter_nth(&mut self, n: usize) -> Option<&'a mut T> {
 iterator!{struct IterMut -> *mut T, &'a mut T}
 
 #[stable(feature = "rust1", since = "1.0.0")]
-impl<'a, T> ExactSizeIterator for IterMut<'a, T> {}
+impl<'a, T> ExactSizeIterator for IterMut<'a, T> {
+    fn is_empty(&self) -> bool {
+        self.ptr == self.end
+    }
+}
 
 #[unstable(feature = "fused", issue = "35602")]
 impl<'a, T> FusedIterator for IterMut<'a, T> {}