about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2016-04-20 04:58:44 -0700
committerbors <bors@rust-lang.org>2016-04-20 04:58:44 -0700
commit133f60f82012ad92c40693bf1ae28419b60146a7 (patch)
tree3bbb49eca49537bd9ceb893d8598edaa1e370c29
parent9bba2907ee712753e44d7e248560031c190724e0 (diff)
parentbf3aefeba0bc72d1e26d36a7d88e2995e460bc1d (diff)
downloadrust-133f60f82012ad92c40693bf1ae28419b60146a7.tar.gz
rust-133f60f82012ad92c40693bf1ae28419b60146a7.zip
Auto merge of #32951 - LukasKalbertodt:collection_contains_rfc1552, r=brson
Add `contains` to `VecDeque` and `LinkedList` (+ tests)

This implements [RFC 1552](https://github.com/rust-lang/rfcs/blob/master/text/1552-contains-method-for-various-collections.md). Tracking issue: #32630

Sorry for the late response. This is my first contribution, so please tell me if anything isn't optimal!
-rw-r--r--src/libcollections/linked_list.rs10
-rw-r--r--src/libcollections/vec_deque.rs11
-rw-r--r--src/libcollectionstest/lib.rs2
-rw-r--r--src/libcollectionstest/linked_list.rs13
-rw-r--r--src/libcollectionstest/vec_deque.rs13
5 files changed, 49 insertions, 0 deletions
diff --git a/src/libcollections/linked_list.rs b/src/libcollections/linked_list.rs
index c974be54bd0..406b979a370 100644
--- a/src/libcollections/linked_list.rs
+++ b/src/libcollections/linked_list.rs
@@ -403,6 +403,16 @@ impl<T> LinkedList<T> {
         *self = LinkedList::new()
     }
 
+    /// Returns `true` if the `LinkedList` contains an element equal to the
+    /// given value.
+    #[unstable(feature = "linked_list_contains", reason = "recently added",
+               issue = "32630")]
+    pub fn contains(&self, x: &T) -> bool
+        where T: PartialEq<T>
+    {
+        self.iter().any(|e| e == x)
+    }
+
     /// Provides a reference to the front element, or `None` if the list is
     /// empty.
     ///
diff --git a/src/libcollections/vec_deque.rs b/src/libcollections/vec_deque.rs
index 6e8f4391eeb..84a0bbbd249 100644
--- a/src/libcollections/vec_deque.rs
+++ b/src/libcollections/vec_deque.rs
@@ -873,6 +873,17 @@ impl<T> VecDeque<T> {
         self.drain(..);
     }
 
+    /// Returns `true` if the `VecDeque` contains an element equal to the
+    /// given value.
+    #[unstable(feature = "vec_deque_contains", reason = "recently added",
+               issue = "32630")]
+    pub fn contains(&self, x: &T) -> bool
+        where T: PartialEq<T>
+    {
+        let (a, b) = self.as_slices();
+        a.contains(x) || b.contains(x)
+    }
+
     /// Provides a reference to the front element, or `None` if the sequence is
     /// empty.
     ///
diff --git a/src/libcollectionstest/lib.rs b/src/libcollectionstest/lib.rs
index 4e08cab6db9..056ac13585c 100644
--- a/src/libcollectionstest/lib.rs
+++ b/src/libcollectionstest/lib.rs
@@ -20,6 +20,7 @@
 #![feature(fn_traits)]
 #![feature(enumset)]
 #![feature(iter_arith)]
+#![feature(linked_list_contains)]
 #![feature(map_entry_keys)]
 #![feature(map_values_mut)]
 #![feature(pattern)]
@@ -30,6 +31,7 @@
 #![feature(test)]
 #![feature(unboxed_closures)]
 #![feature(unicode)]
+#![feature(vec_deque_contains)]
 
 extern crate collections;
 extern crate test;
diff --git a/src/libcollectionstest/linked_list.rs b/src/libcollectionstest/linked_list.rs
index 3ad4790d36a..7265d53be48 100644
--- a/src/libcollectionstest/linked_list.rs
+++ b/src/libcollectionstest/linked_list.rs
@@ -429,3 +429,16 @@ fn bench_iter_mut_rev(b: &mut test::Bencher) {
         assert!(m.iter_mut().rev().count() == 128);
     })
 }
+
+#[test]
+fn test_contains() {
+    let mut l = LinkedList::new();
+    l.extend(&[2, 3, 4]);
+
+    assert!(l.contains(&3));
+    assert!(!l.contains(&1));
+
+    l.clear();
+
+    assert!(!l.contains(&3));
+}
diff --git a/src/libcollectionstest/vec_deque.rs b/src/libcollectionstest/vec_deque.rs
index 95675a2423e..05af9bd704d 100644
--- a/src/libcollectionstest/vec_deque.rs
+++ b/src/libcollectionstest/vec_deque.rs
@@ -959,3 +959,16 @@ fn test_extend_ref() {
     assert_eq!(v[4], 5);
     assert_eq!(v[5], 6);
 }
+
+#[test]
+fn test_contains() {
+    let mut v = VecDeque::new();
+    v.extend(&[2, 3, 4]);
+
+    assert!(v.contains(&3));
+    assert!(!v.contains(&1));
+
+    v.clear();
+
+    assert!(!v.contains(&3));
+}