@@ -75,8 +75,10 @@ unsafe impl<K: Sync, V: Sync> Sync for RawTable<K, V> {}
75
75
76
76
struct RawBucket < K , V > {
77
77
hash : * mut u64 ,
78
- key : * mut K ,
79
- val : * mut V ,
78
+
79
+ // We use *const to ensure covariance with respect to K and V
80
+ key : * const K ,
81
+ val : * const V ,
80
82
_marker : marker:: PhantomData < ( K , V ) > ,
81
83
}
82
84
@@ -354,8 +356,8 @@ impl<K, V, M> EmptyBucket<K, V, M> where M: Put<K, V> {
354
356
-> FullBucket < K , V , M > {
355
357
unsafe {
356
358
* self . raw . hash = hash. inspect ( ) ;
357
- ptr:: write ( self . raw . key , key) ;
358
- ptr:: write ( self . raw . val , value) ;
359
+ ptr:: write ( self . raw . key as * mut K , key) ;
360
+ ptr:: write ( self . raw . val as * mut V , value) ;
359
361
360
362
self . table . borrow_table_mut ( ) . size += 1 ;
361
363
}
@@ -453,8 +455,8 @@ impl<K, V, M> FullBucket<K, V, M> where M: Put<K, V> {
453
455
pub fn replace ( & mut self , h : SafeHash , k : K , v : V ) -> ( SafeHash , K , V ) {
454
456
unsafe {
455
457
let old_hash = ptr:: replace ( self . raw . hash as * mut SafeHash , h) ;
456
- let old_key = ptr:: replace ( self . raw . key , k) ;
457
- let old_val = ptr:: replace ( self . raw . val , v) ;
458
+ let old_key = ptr:: replace ( self . raw . key as * mut K , k) ;
459
+ let old_val = ptr:: replace ( self . raw . val as * mut V , v) ;
458
460
459
461
( old_hash, old_key, old_val)
460
462
}
@@ -465,8 +467,8 @@ impl<K, V, M> FullBucket<K, V, M> where M: Deref<Target=RawTable<K, V>> + DerefM
465
467
/// Gets mutable references to the key and value at a given index.
466
468
pub fn read_mut ( & mut self ) -> ( & mut K , & mut V ) {
467
469
unsafe {
468
- ( & mut * self . raw . key ,
469
- & mut * self . raw . val )
470
+ ( & mut * ( self . raw . key as * mut K ) ,
471
+ & mut * ( self . raw . val as * mut V ) )
470
472
}
471
473
}
472
474
}
@@ -490,8 +492,8 @@ impl<'t, K, V, M> FullBucket<K, V, M> where M: Deref<Target=RawTable<K, V>> + De
490
492
/// for mutable references into the table.
491
493
pub fn into_mut_refs ( self ) -> ( & ' t mut K , & ' t mut V ) {
492
494
unsafe {
493
- ( & mut * self . raw . key ,
494
- & mut * self . raw . val )
495
+ ( & mut * ( self . raw . key as * mut K ) ,
496
+ & mut * ( self . raw . val as * mut V ) )
495
497
}
496
498
}
497
499
}
@@ -505,8 +507,8 @@ impl<K, V, M> GapThenFull<K, V, M> where M: Deref<Target=RawTable<K, V>> {
505
507
pub fn shift ( mut self ) -> Option < GapThenFull < K , V , M > > {
506
508
unsafe {
507
509
* self . gap . raw . hash = mem:: replace ( & mut * self . full . raw . hash , EMPTY_BUCKET ) ;
508
- ptr:: copy_nonoverlapping ( self . full . raw . key , self . gap . raw . key , 1 ) ;
509
- ptr:: copy_nonoverlapping ( self . full . raw . val , self . gap . raw . val , 1 ) ;
510
+ ptr:: copy_nonoverlapping ( self . full . raw . key , self . gap . raw . key as * mut K , 1 ) ;
511
+ ptr:: copy_nonoverlapping ( self . full . raw . val , self . gap . raw . val as * mut V , 1 ) ;
510
512
}
511
513
512
514
let FullBucket { raw : prev_raw, idx : prev_idx, .. } = self . full ;
@@ -649,7 +651,7 @@ impl<K, V> RawTable<K, V> {
649
651
let hashes_size = self . capacity * size_of :: < u64 > ( ) ;
650
652
let keys_size = self . capacity * size_of :: < K > ( ) ;
651
653
652
- let buffer = * self . hashes as * mut u8 ;
654
+ let buffer = * self . hashes as * const u8 ;
653
655
let ( keys_offset, vals_offset, oflo) =
654
656
calculate_offsets ( hashes_size,
655
657
keys_size, align_of :: < K > ( ) ,
@@ -658,8 +660,8 @@ impl<K, V> RawTable<K, V> {
658
660
unsafe {
659
661
RawBucket {
660
662
hash : * self . hashes ,
661
- key : buffer. offset ( keys_offset as isize ) as * mut K ,
662
- val : buffer. offset ( vals_offset as isize ) as * mut V ,
663
+ key : buffer. offset ( keys_offset as isize ) as * const K ,
664
+ val : buffer. offset ( vals_offset as isize ) as * const V ,
663
665
_marker : marker:: PhantomData ,
664
666
}
665
667
}
@@ -707,6 +709,7 @@ impl<K, V> RawTable<K, V> {
707
709
IterMut {
708
710
iter : self . raw_buckets ( ) ,
709
711
elems_left : self . size ( ) ,
712
+ _marker : marker:: PhantomData ,
710
713
}
711
714
}
712
715
@@ -858,6 +861,8 @@ impl<'a, K, V> Clone for Iter<'a, K, V> {
858
861
pub struct IterMut < ' a , K : ' a , V : ' a > {
859
862
iter : RawBuckets < ' a , K , V > ,
860
863
elems_left : usize ,
864
+ // To ensure invariance with respect to V
865
+ _marker : marker:: PhantomData < & ' a mut V > ,
861
866
}
862
867
863
868
unsafe impl < ' a , K : Sync , V : Sync > Sync for IterMut < ' a , K , V > { }
@@ -912,7 +917,7 @@ impl<'a, K, V> Iterator for IterMut<'a, K, V> {
912
917
self . elems_left -= 1 ;
913
918
unsafe {
914
919
( & * bucket. key ,
915
- & mut * bucket. val )
920
+ & mut * ( bucket. val as * mut V ) )
916
921
}
917
922
} )
918
923
}
@@ -1003,8 +1008,8 @@ impl<K: Clone, V: Clone> Clone for RawTable<K, V> {
1003
1008
( full. hash ( ) , k. clone ( ) , v. clone ( ) )
1004
1009
} ;
1005
1010
* new_buckets. raw . hash = h. inspect ( ) ;
1006
- ptr:: write ( new_buckets. raw . key , k) ;
1007
- ptr:: write ( new_buckets. raw . val , v) ;
1011
+ ptr:: write ( new_buckets. raw . key as * mut K , k) ;
1012
+ ptr:: write ( new_buckets. raw . val as * mut V , v) ;
1008
1013
}
1009
1014
Empty ( ..) => {
1010
1015
* new_buckets. raw . hash = EMPTY_BUCKET ;
0 commit comments