1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
use super::*;
use std::cell::RefMut;
use std::fmt::{self, Display};
use std::ops::Deref;
#[derive(Debug, Clone, Getters, CopyGetters, MutGetters)]
pub struct SparseValue<'a, S> {
#[getset(get_copy = "pub")]
metadata: Option<&'a SparseMetadata>,
sref: &'a S,
}
impl<'a, S> fmt::Display for SparseValue<'a, S>
where
S: DeserializeOwned + Serialize + SparsableTrait + Display,
{
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "{}", self.sref)
}
}
impl<'a, S> Deref for SparseValue<'a, S>
where
S: DeserializeOwned + Serialize + SparsableTrait,
{
type Target = S;
fn deref(&self) -> &Self::Target {
self.sref
}
}
impl<'a, S> SparseValue<'a, S>
where
S: DeserializeOwned + Serialize + SparsableTrait,
{
pub fn try_deref_raw_pointer<T: 'static + DeserializeOwned + Serialize + SparsableTrait>(
curr: &SparseValue<'_, S>,
ptr: String,
state_cell: Rc<RefCell<SparseState>>,
) -> Result<SparseSelector<T>, SparseError> {
let current_path: Option<&PathBuf> = curr.metadata().map(|v| v.pfile_path());
let (mut val, metadata): (SparseSelector<T>, SparseMetadata) = {
let mut state_mut: RefMut<'_, SparseState> = state_cell
.try_borrow_mut()
.map_err(|_e| SparseError::StateAlreadyBorrowed)?;
let metadata = SparseMetadata::new(
ptr.clone(),
current_path
.unwrap_or_else(|| state_mut.get_root_path())
.clone(),
);
let sref: SparseRef<T> =
SparseRef::new(&mut *state_mut, metadata.pfile_path().clone(), ptr, 0)?;
(SparseSelector::Obj(SparsePointedValue::Ref(sref)), metadata)
};
let mut state_mut: RefMut<'_, SparseState> = state_cell
.try_borrow_mut()
.map_err(|_e| SparseError::StateAlreadyBorrowed)?;
val.sparse_init(&mut *state_mut, &metadata, 0)?;
Ok(val)
}
pub(crate) fn new(sref: &'a S, metadata: Option<&'a SparseMetadata>) -> Self {
SparseValue { sref, metadata }
}
}