about summary refs log tree commit diff
diff options
context:
space:
mode:
authorGuillaume Gomez <guillaume1.gomez@gmail.com>2015-08-09 23:38:04 +0200
committerGuillaume Gomez <guillaume1.gomez@gmail.com>2015-08-11 18:44:39 +0200
commitf2f4a5c8621811c81d98f567e2505017aea94bce (patch)
treeee5e12ddc20b2579ee7940321551af7c9574e139
parenta4e4233828f0a8cb30278245d53dcb25b2e26a01 (diff)
downloadrust-f2f4a5c8621811c81d98f567e2505017aea94bce.tar.gz
rust-f2f4a5c8621811c81d98f567e2505017aea94bce.zip
Add HashSet and HashMap tests
-rw-r--r--src/libstd/collections/hash/set.rs23
-rw-r--r--src/libstd/collections/hash/table.rs17
-rw-r--r--src/test/run-pass/sync-send-iterators-in-libcollections.rs8
3 files changed, 22 insertions, 26 deletions
diff --git a/src/libstd/collections/hash/set.rs b/src/libstd/collections/hash/set.rs
index 445391bbe3a..fb594dadd73 100644
--- a/src/libstd/collections/hash/set.rs
+++ b/src/libstd/collections/hash/set.rs
@@ -11,7 +11,7 @@
 use borrow::Borrow;
 use clone::Clone;
 use cmp::{Eq, PartialEq};
-use core::marker::{Sized, Send, Sync};
+use core::marker::Sized;
 use default::Default;
 use fmt::Debug;
 use fmt;
@@ -764,27 +764,18 @@ pub struct Iter<'a, K: 'a> {
     iter: Keys<'a, K, ()>
 }
 
-unsafe impl<'a, K: Send> Send for Iter<'a, K> {}
-unsafe impl<'a, K: Sync> Sync for Iter<'a, K> {}
-
 /// HashSet move iterator
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct IntoIter<K> {
     iter: Map<map::IntoIter<K, ()>, fn((K, ())) -> K>
 }
 
-unsafe impl<K: Send> Send for IntoIter<K> {}
-unsafe impl<K: Sync> Sync for IntoIter<K> {}
-
 /// HashSet drain iterator
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct Drain<'a, K: 'a> {
     iter: Map<map::Drain<'a, K, ()>, fn((K, ())) -> K>,
 }
 
-unsafe impl<'a, K: Send> Send for Drain<'a, K> {}
-unsafe impl<'a, K: Sync> Sync for Drain<'a, K> {}
-
 /// Intersection iterator
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct Intersection<'a, T: 'a, S: 'a> {
@@ -794,9 +785,6 @@ pub struct Intersection<'a, T: 'a, S: 'a> {
     other: &'a HashSet<T, S>,
 }
 
-unsafe impl<'a, K: Send, S: Send> Send for Intersection<'a, K, S> {}
-unsafe impl<'a, K: Sync, S: Send> Sync for Intersection<'a, K, S> {}
-
 /// Difference iterator
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct Difference<'a, T: 'a, S: 'a> {
@@ -806,27 +794,18 @@ pub struct Difference<'a, T: 'a, S: 'a> {
     other: &'a HashSet<T, S>,
 }
 
-unsafe impl<'a, K: Send, S: Send> Send for Difference<'a, K, S> {}
-unsafe impl<'a, K: Sync, S: Send> Sync for Difference<'a, K, S> {}
-
 /// Symmetric difference iterator.
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct SymmetricDifference<'a, T: 'a, S: 'a> {
     iter: Chain<Difference<'a, T, S>, Difference<'a, T, S>>
 }
 
-unsafe impl<'a, K: Send, S: Send> Send for SymmetricDifference<'a, K, S> {}
-unsafe impl<'a, K: Sync, S: Send> Sync for SymmetricDifference<'a, K, S> {}
-
 /// Set union iterator.
 #[stable(feature = "rust1", since = "1.0.0")]
 pub struct Union<'a, T: 'a, S: 'a> {
     iter: Chain<Iter<'a, T>, Difference<'a, T, S>>
 }
 
-unsafe impl<'a, K: Send, S: Send> Send for Union<'a, K, S> {}
-unsafe impl<'a, K: Sync, S: Send> Sync for Union<'a, K, S> {}
-
 #[stable(feature = "rust1", since = "1.0.0")]
 impl<'a, T, S> IntoIterator for &'a HashSet<T, S>
     where T: Eq + Hash, S: HashState
diff --git a/src/libstd/collections/hash/table.rs b/src/libstd/collections/hash/table.rs
index ee63e29e6c9..8a822057bbf 100644
--- a/src/libstd/collections/hash/table.rs
+++ b/src/libstd/collections/hash/table.rs
@@ -741,9 +741,6 @@ struct RawBuckets<'a, K, V> {
     marker: marker::PhantomData<&'a ()>,
 }
 
-unsafe impl<'a, K: Send, V: Send> Send for RawBuckets<'a, K, V> {}
-unsafe impl<'a, K: Sync, V: Sync> Sync for RawBuckets<'a, K, V> {}
-
 // FIXME(#19839) Remove in favor of `#[derive(Clone)]`
 impl<'a, K, V> Clone for RawBuckets<'a, K, V> {
     fn clone(&self) -> RawBuckets<'a, K, V> {
@@ -821,6 +818,9 @@ pub struct Iter<'a, K: 'a, V: 'a> {
     elems_left: usize,
 }
 
+unsafe impl<'a, K: Sync, V: Sync> Sync for Iter<'a, K, V> {}
+unsafe impl<'a, K: Sync, V: Sync> Send for Iter<'a, K, V> {}
+
 // FIXME(#19839) Remove in favor of `#[derive(Clone)]`
 impl<'a, K, V> Clone for Iter<'a, K, V> {
     fn clone(&self) -> Iter<'a, K, V> {
@@ -838,18 +838,29 @@ pub struct IterMut<'a, K: 'a, V: 'a> {
     elems_left: usize,
 }
 
+unsafe impl<'a, K: Sync, V: Sync> Sync for IterMut<'a, K, V> {}
+// Both K: Sync and K: Send are correct for IterMut's Send impl,
+// but Send is the more useful bound
+unsafe impl<'a, K: Send, V: Send> Send for IterMut<'a, K, V> {}
+
 /// Iterator over the entries in a table, consuming the table.
 pub struct IntoIter<K, V> {
     table: RawTable<K, V>,
     iter: RawBuckets<'static, K, V>
 }
 
+unsafe impl<K: Sync, V: Sync> Sync for IntoIter<K, V> {}
+unsafe impl<K: Send, V: Send> Send for IntoIter<K, V> {}
+
 /// Iterator over the entries in a table, clearing the table.
 pub struct Drain<'a, K: 'a, V: 'a> {
     table: &'a mut RawTable<K, V>,
     iter: RawBuckets<'static, K, V>,
 }
 
+unsafe impl<'a, K: Sync, V: Sync> Sync for Drain<'a, K, V> {}
+unsafe impl<'a, K: Send, V: Send> Send for Drain<'a, K, V> {}
+
 impl<'a, K, V> Iterator for Iter<'a, K, V> {
     type Item = (&'a K, &'a V);
 
diff --git a/src/test/run-pass/sync-send-iterators-in-libcollections.rs b/src/test/run-pass/sync-send-iterators-in-libcollections.rs
index ffa5c611777..cdfc4d32027 100644
--- a/src/test/run-pass/sync-send-iterators-in-libcollections.rs
+++ b/src/test/run-pass/sync-send-iterators-in-libcollections.rs
@@ -26,6 +26,7 @@ use collections::Vec;
 use collections::VecDeque;
 use collections::VecMap;
 use std::collections::HashMap;
+use std::collections::HashSet;
 
 use collections::Bound::Included;
 use collections::enum_set::CLike;
@@ -78,7 +79,12 @@ fn main() {
     is_sync_send!(BTreeSet::<usize>::new(), intersection(&BTreeSet::<usize>::new()));
     is_sync_send!(BTreeSet::<usize>::new(), union(&BTreeSet::<usize>::new()));
 
-    all_sync_send!(HashMap::<usize, usize>::new(), keys, values, iter, iter_mut);
+    all_sync_send!(HashMap::<usize, usize>::new(), iter, iter_mut, drain, into_iter, keys, values);
+    all_sync_send!(HashSet::<usize>::new(), iter, drain, into_iter);
+    is_sync_send!(HashSet::<usize>::new(), difference(&HashSet::<usize>::new()));
+    is_sync_send!(HashSet::<usize>::new(), symmetric_difference(&HashSet::<usize>::new()));
+    is_sync_send!(HashSet::<usize>::new(), intersection(&HashSet::<usize>::new()));
+    is_sync_send!(HashSet::<usize>::new(), union(&HashSet::<usize>::new()));
 
     all_sync_send!(LinkedList::<usize>::new(), iter, iter_mut, into_iter);