Add Send/Sync traits on Iter struct in hash/table
This commit is contained in:
parent
a5d33d8911
commit
a4e4233828
3 changed files with 28 additions and 1 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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> {
|
||||
|
|
|
|||
|
|
@ -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)]
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue