Skip to content

Commit f01fc75

Browse files
committedFeb 6, 2022
make explicit
1 parent 45c7a3c commit f01fc75

File tree

4 files changed

+47
-46
lines changed

4 files changed

+47
-46
lines changed
 

‎src/lib.rs

-2
Original file line numberDiff line numberDiff line change
@@ -993,9 +993,7 @@ impl<'a, K: 'a + Eq + Hash, V: 'a, S: 'a + BuildHasher + Clone> Map<'a, K, V, S>
993993
if let Some((kptr, vptr)) = shard.get_key_value(&key) {
994994
unsafe {
995995
let kptr = util::change_lifetime_const(kptr);
996-
997996
let vptr = &mut *vptr.as_ptr();
998-
999997
Entry::Occupied(OccupiedEntry::new(shard, key, (kptr, vptr)))
1000998
}
1001999
} else {

‎src/mapref/entry.rs

+12-13
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ impl<'a, K: Eq + Hash, V, S: BuildHasher> VacantEntry<'a, K, V, S> {
132132

133133
pub struct OccupiedEntry<'a, K, V, S> {
134134
shard: RwLockWriteGuard<'a, HashMap<K, V, S>>,
135-
elem: (&'a K, &'a mut V),
135+
elem: (*const K, *mut V),
136136
key: K,
137137
}
138138

@@ -147,21 +147,21 @@ impl<'a, K: Eq + Hash, V, S: BuildHasher> OccupiedEntry<'a, K, V, S> {
147147
pub(crate) fn new(
148148
shard: RwLockWriteGuard<'a, HashMap<K, V, S>>,
149149
key: K,
150-
elem: (&'a K, &'a mut V),
150+
elem: (*const K, *mut V),
151151
) -> Self {
152152
Self { shard, elem, key }
153153
}
154154

155155
pub fn get(&self) -> &V {
156-
self.elem.1
156+
unsafe { &*self.elem.1 }
157157
}
158158

159159
pub fn get_mut(&mut self) -> &mut V {
160-
self.elem.1
160+
unsafe { &mut *self.elem.1 }
161161
}
162162

163163
pub fn insert(&mut self, value: V) -> V {
164-
mem::replace(self.elem.1, value)
164+
mem::replace(self.get_mut(), value)
165165
}
166166

167167
pub fn into_ref(self) -> RefMut<'a, K, V, S> {
@@ -173,26 +173,25 @@ impl<'a, K: Eq + Hash, V, S: BuildHasher> OccupiedEntry<'a, K, V, S> {
173173
}
174174

175175
pub fn key(&self) -> &K {
176-
self.elem.0
176+
unsafe { &*self.elem.0 }
177177
}
178178

179179
pub fn remove(mut self) -> V {
180-
self.shard.remove(self.elem.0).unwrap().into_inner()
180+
let key = unsafe { &*self.elem.0 };
181+
self.shard.remove(key).unwrap().into_inner()
181182
}
182183

183184
pub fn remove_entry(mut self) -> (K, V) {
184-
let (k, v) = self.shard.remove_entry(self.elem.0).unwrap();
185-
185+
let key = unsafe { &*self.elem.0 };
186+
let (k, v) = self.shard.remove_entry(key).unwrap();
186187
(k, v.into_inner())
187188
}
188189

189190
pub fn replace_entry(mut self, value: V) -> (K, V) {
190191
let nk = self.key;
191-
192-
let (k, v) = self.shard.remove_entry(self.elem.0).unwrap();
193-
192+
let key = unsafe { &*self.elem.0 };
193+
let (k, v) = self.shard.remove_entry(key).unwrap();
194194
self.shard.insert(nk, SharedValue::new(value));
195-
196195
(k, v.into_inner())
197196
}
198197
}

‎src/mapref/multiple.rs

+16-16
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ use std::sync::Arc;
88

99
pub struct RefMulti<'a, K, V, S = RandomState> {
1010
_guard: Arc<RwLockReadGuard<'a, HashMap<K, V, S>>>,
11-
k: &'a K,
12-
v: &'a V,
11+
k: *const K,
12+
v: *const V,
1313
}
1414

1515
unsafe impl<'a, K: Eq + Hash + Send, V: Send, S: BuildHasher> Send for RefMulti<'a, K, V, S> {}
@@ -22,8 +22,8 @@ unsafe impl<'a, K: Eq + Hash + Send + Sync, V: Send + Sync, S: BuildHasher> Sync
2222
impl<'a, K: Eq + Hash, V, S: BuildHasher> RefMulti<'a, K, V, S> {
2323
pub(crate) fn new(
2424
guard: Arc<RwLockReadGuard<'a, HashMap<K, V, S>>>,
25-
k: &'a K,
26-
v: &'a V,
25+
k: *const K,
26+
v: *const V,
2727
) -> Self {
2828
Self {
2929
_guard: guard,
@@ -33,15 +33,15 @@ impl<'a, K: Eq + Hash, V, S: BuildHasher> RefMulti<'a, K, V, S> {
3333
}
3434

3535
pub fn key(&self) -> &K {
36-
self.k
36+
self.pair().0
3737
}
3838

3939
pub fn value(&self) -> &V {
40-
self.v
40+
self.pair().1
4141
}
4242

4343
pub fn pair(&self) -> (&K, &V) {
44-
(self.k, self.v)
44+
unsafe { (&*self.k, &*self.v) }
4545
}
4646
}
4747

@@ -55,8 +55,8 @@ impl<'a, K: Eq + Hash, V, S: BuildHasher> Deref for RefMulti<'a, K, V, S> {
5555

5656
pub struct RefMutMulti<'a, K, V, S = RandomState> {
5757
_guard: Arc<RwLockWriteGuard<'a, HashMap<K, V, S>>>,
58-
k: &'a K,
59-
v: &'a mut V,
58+
k: *const K,
59+
v: *mut V,
6060
}
6161

6262
unsafe impl<'a, K: Eq + Hash + Send, V: Send, S: BuildHasher> Send for RefMutMulti<'a, K, V, S> {}
@@ -69,8 +69,8 @@ unsafe impl<'a, K: Eq + Hash + Send + Sync, V: Send + Sync, S: BuildHasher> Sync
6969
impl<'a, K: Eq + Hash, V, S: BuildHasher> RefMutMulti<'a, K, V, S> {
7070
pub(crate) fn new(
7171
guard: Arc<RwLockWriteGuard<'a, HashMap<K, V, S>>>,
72-
k: &'a K,
73-
v: &'a mut V,
72+
k: *const K,
73+
v: *mut V,
7474
) -> Self {
7575
Self {
7676
_guard: guard,
@@ -80,23 +80,23 @@ impl<'a, K: Eq + Hash, V, S: BuildHasher> RefMutMulti<'a, K, V, S> {
8080
}
8181

8282
pub fn key(&self) -> &K {
83-
self.k
83+
self.pair().0
8484
}
8585

8686
pub fn value(&self) -> &V {
87-
self.v
87+
self.pair().1
8888
}
8989

9090
pub fn value_mut(&mut self) -> &mut V {
91-
self.v
91+
self.pair_mut().1
9292
}
9393

9494
pub fn pair(&self) -> (&K, &V) {
95-
(self.k, self.v)
95+
unsafe { (&*self.k, &*self.v) }
9696
}
9797

9898
pub fn pair_mut(&mut self) -> (&K, &mut V) {
99-
(self.k, self.v)
99+
unsafe { (&*self.k, &mut *self.v) }
100100
}
101101
}
102102

‎src/mapref/one.rs

+19-15
Original file line numberDiff line numberDiff line change
@@ -6,8 +6,8 @@ use std::collections::hash_map::RandomState;
66

77
pub struct Ref<'a, K, V, S = RandomState> {
88
_guard: RwLockReadGuard<'a, HashMap<K, V, S>>,
9-
k: &'a K,
10-
v: &'a V,
9+
k: *const K,
10+
v: *const V,
1111
}
1212

1313
unsafe impl<'a, K: Eq + Hash + Send, V: Send, S: BuildHasher> Send for Ref<'a, K, V, S> {}
@@ -18,7 +18,11 @@ unsafe impl<'a, K: Eq + Hash + Send + Sync, V: Send + Sync, S: BuildHasher> Sync
1818
}
1919

2020
impl<'a, K: Eq + Hash, V, S: BuildHasher> Ref<'a, K, V, S> {
21-
pub(crate) fn new(guard: RwLockReadGuard<'a, HashMap<K, V, S>>, k: &'a K, v: &'a V) -> Self {
21+
pub(crate) fn new(
22+
guard: RwLockReadGuard<'a, HashMap<K, V, S>>,
23+
k: *const K,
24+
v: *const V,
25+
) -> Self {
2226
Self {
2327
_guard: guard,
2428
k,
@@ -27,15 +31,15 @@ impl<'a, K: Eq + Hash, V, S: BuildHasher> Ref<'a, K, V, S> {
2731
}
2832

2933
pub fn key(&self) -> &K {
30-
self.k
34+
self.pair().0
3135
}
3236

3337
pub fn value(&self) -> &V {
34-
self.v
38+
self.pair().1
3539
}
3640

3741
pub fn pair(&self) -> (&K, &V) {
38-
(self.k, self.v)
42+
unsafe { (&*self.k, &*self.v) }
3943
}
4044
}
4145

@@ -49,8 +53,8 @@ impl<'a, K: Eq + Hash, V, S: BuildHasher> Deref for Ref<'a, K, V, S> {
4953

5054
pub struct RefMut<'a, K, V, S = RandomState> {
5155
guard: RwLockWriteGuard<'a, HashMap<K, V, S>>,
52-
k: &'a K,
53-
v: &'a mut V,
56+
k: *const K,
57+
v: *mut V,
5458
}
5559

5660
unsafe impl<'a, K: Eq + Hash + Send, V: Send, S: BuildHasher> Send for RefMut<'a, K, V, S> {}
@@ -63,30 +67,30 @@ unsafe impl<'a, K: Eq + Hash + Send + Sync, V: Send + Sync, S: BuildHasher> Sync
6367
impl<'a, K: Eq + Hash, V, S: BuildHasher> RefMut<'a, K, V, S> {
6468
pub(crate) fn new(
6569
guard: RwLockWriteGuard<'a, HashMap<K, V, S>>,
66-
k: &'a K,
67-
v: &'a mut V,
70+
k: *const K,
71+
v: *mut V,
6872
) -> Self {
6973
Self { guard, k, v }
7074
}
7175

7276
pub fn key(&self) -> &K {
73-
self.k
77+
self.pair().0
7478
}
7579

7680
pub fn value(&self) -> &V {
77-
self.v
81+
self.pair().1
7882
}
7983

8084
pub fn value_mut(&mut self) -> &mut V {
81-
self.v
85+
self.pair_mut().1
8286
}
8387

8488
pub fn pair(&self) -> (&K, &V) {
85-
(self.k, self.v)
89+
unsafe { (&*self.k, &*self.v) }
8690
}
8791

8892
pub fn pair_mut(&mut self) -> (&K, &mut V) {
89-
(self.k, self.v)
93+
unsafe { (&*self.k, &mut *self.v) }
9094
}
9195

9296
pub fn downgrade(self) -> Ref<'a, K, V, S> {

0 commit comments

Comments
 (0)
Please sign in to comment.