Skip to content

Commit b70400c

Browse files
committed
Add Ref/RefMut::map_split
Closes xacrimon#337
1 parent 366ce7e commit b70400c

File tree

2 files changed

+67
-15
lines changed

2 files changed

+67
-15
lines changed

src/mapref/multiple.rs

+13-13
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@ use core::hash::Hash;
33
use core::ops::{Deref, DerefMut};
44
use std::sync::Arc;
55

6-
pub struct RefMulti<'a, K, V> {
7-
_guard: Arc<RwLockReadGuardDetached<'a>>,
8-
k: &'a K,
9-
v: &'a V,
6+
pub struct RefMulti<'a, K, V: ?Sized> {
7+
pub(super) _guard: Arc<RwLockReadGuardDetached<'a>>,
8+
pub(super) k: &'a K,
9+
pub(super) v: &'a V,
1010
}
1111

12-
impl<'a, K: Eq + Hash, V> RefMulti<'a, K, V> {
12+
impl<'a, K: Eq + Hash, V: ?Sized> RefMulti<'a, K, V> {
1313
pub(crate) fn new(guard: Arc<RwLockReadGuardDetached<'a>>, k: &'a K, v: &'a V) -> Self {
1414
Self {
1515
_guard: guard,
@@ -31,21 +31,21 @@ impl<'a, K: Eq + Hash, V> RefMulti<'a, K, V> {
3131
}
3232
}
3333

34-
impl<'a, K: Eq + Hash, V> Deref for RefMulti<'a, K, V> {
34+
impl<'a, K: Eq + Hash, V: ?Sized> Deref for RefMulti<'a, K, V> {
3535
type Target = V;
3636

3737
fn deref(&self) -> &V {
3838
self.value()
3939
}
4040
}
4141

42-
pub struct RefMutMulti<'a, K, V> {
43-
_guard: Arc<RwLockWriteGuardDetached<'a>>,
44-
k: &'a K,
45-
v: &'a mut V,
42+
pub struct RefMutMulti<'a, K, V: ?Sized> {
43+
pub(super) _guard: Arc<RwLockWriteGuardDetached<'a>>,
44+
pub(super) k: &'a K,
45+
pub(super) v: &'a mut V,
4646
}
4747

48-
impl<'a, K: Eq + Hash, V> RefMutMulti<'a, K, V> {
48+
impl<'a, K: Eq + Hash, V: ?Sized> RefMutMulti<'a, K, V> {
4949
pub(crate) fn new(guard: Arc<RwLockWriteGuardDetached<'a>>, k: &'a K, v: &'a mut V) -> Self {
5050
Self {
5151
_guard: guard,
@@ -75,15 +75,15 @@ impl<'a, K: Eq + Hash, V> RefMutMulti<'a, K, V> {
7575
}
7676
}
7777

78-
impl<'a, K: Eq + Hash, V> Deref for RefMutMulti<'a, K, V> {
78+
impl<'a, K: Eq + Hash, V: ?Sized> Deref for RefMutMulti<'a, K, V> {
7979
type Target = V;
8080

8181
fn deref(&self) -> &V {
8282
self.value()
8383
}
8484
}
8585

86-
impl<'a, K: Eq + Hash, V> DerefMut for RefMutMulti<'a, K, V> {
86+
impl<'a, K: Eq + Hash, V: ?Sized> DerefMut for RefMutMulti<'a, K, V> {
8787
fn deref_mut(&mut self) -> &mut V {
8888
self.value_mut()
8989
}

src/mapref/one.rs

+54-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,13 @@
1-
use crate::lock::{RwLockReadGuardDetached, RwLockWriteGuardDetached};
1+
use crate::{
2+
lock::{RwLockReadGuardDetached, RwLockWriteGuardDetached},
3+
mapref::multiple::{RefMulti, RefMutMulti},
4+
};
25
use core::hash::Hash;
36
use core::ops::{Deref, DerefMut};
4-
use std::fmt::{Debug, Formatter};
7+
use std::{
8+
fmt::{Debug, Formatter},
9+
sync::Arc,
10+
};
511

612
pub struct Ref<'a, K, V> {
713
_guard: RwLockReadGuardDetached<'a>,
@@ -55,6 +61,29 @@ impl<'a, K: Eq + Hash, V> Ref<'a, K, V> {
5561
Err(self)
5662
}
5763
}
64+
65+
pub fn map_split<F, A: ?Sized, B: ?Sized>(
66+
self,
67+
f: F,
68+
) -> (RefMulti<'a, K, A>, RefMulti<'a, K, B>)
69+
where
70+
F: FnOnce(&V) -> (&A, &B),
71+
{
72+
let (a, b) = f(self.v);
73+
let guard = Arc::new(self._guard);
74+
(
75+
RefMulti {
76+
_guard: guard.clone(),
77+
k: self.k,
78+
v: a,
79+
},
80+
RefMulti {
81+
_guard: guard,
82+
k: self.k,
83+
v: b,
84+
},
85+
)
86+
}
5887
}
5988

6089
impl<'a, K: Eq + Hash + Debug, V: Debug> Debug for Ref<'a, K, V> {
@@ -140,6 +169,29 @@ impl<'a, K: Eq + Hash, V> RefMut<'a, K, V> {
140169
v,
141170
})
142171
}
172+
173+
pub fn map_split<F, A: ?Sized, B: ?Sized>(
174+
self,
175+
f: F,
176+
) -> (RefMutMulti<'a, K, A>, RefMutMulti<'a, K, B>)
177+
where
178+
F: FnOnce(&mut V) -> (&mut A, &mut B),
179+
{
180+
let (a, b) = f(self.v);
181+
let guard = Arc::new(self.guard);
182+
(
183+
RefMutMulti {
184+
_guard: guard.clone(),
185+
k: self.k,
186+
v: a,
187+
},
188+
RefMutMulti {
189+
_guard: guard,
190+
k: self.k,
191+
v: b,
192+
},
193+
)
194+
}
143195
}
144196

145197
impl<'a, K: Eq + Hash + Debug, V: Debug> Debug for RefMut<'a, K, V> {

0 commit comments

Comments
 (0)