Add Send/Sync traits on Iter struct in hash/table

This commit is contained in:
Guillaume Gomez 2015-08-09 21:04:22 +02:00
parent a5d33d8911
commit a4e4233828
3 changed files with 28 additions and 1 deletions

View file

@ -11,7 +11,7 @@
use borrow::Borrow;
use clone::Clone;
use cmp::{Eq, PartialEq};
use core::marker::Sized;
use core::marker::{Sized, Send, Sync};
use default::Default;
use fmt::Debug;
use fmt;
@ -764,18 +764,27 @@ 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> {
@ -785,6 +794,9 @@ 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> {
@ -794,18 +806,27 @@ 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

View file

@ -741,6 +741,9 @@ 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> {

View file

@ -25,6 +25,7 @@ use collections::String;
use collections::Vec;
use collections::VecDeque;
use collections::VecMap;
use std::collections::HashMap;
use collections::Bound::Included;
use collections::enum_set::CLike;
@ -77,6 +78,8 @@ 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!(LinkedList::<usize>::new(), iter, iter_mut, into_iter);
#[derive(Copy, Clone)]