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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
use super::*;
use serde::{Deserialize, Serialize};
use std::any::Any;
#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
#[serde(untagged)]
pub enum SparseSelector<T> {
Ref(SparseRefRaw<T>),
Obj(SparsePointedValue<T>),
Null,
}
impl<T> SparsableTrait for SparseSelector<T>
where
T: Any + DeserializeOwned + Serialize + SparsableTrait,
{
fn sparse_init<'a>(
&mut self,
state: &mut SparseState,
metadata: &SparseMetadata,
depth: u32,
) -> Result<(), SparseError> {
self.check_depth(depth)?;
self.self_reset(state, metadata, depth)?;
self.check_version(state)?;
match self {
SparseSelector::Ref(x) => Ok(x.sparse_init(state, metadata, depth + 1)?),
SparseSelector::Obj(x) => Ok(x.sparse_init(state, metadata, depth + 1)?),
SparseSelector::Null => Err(SparseError::BadPointer),
}
}
fn sparse_updt<'a>(
&mut self,
state: &mut SparseState,
metadata: &SparseMetadata,
depth: u32,
) -> Result<(), SparseError> {
self.check_depth(depth)?;
let vcheck = self.check_version(state);
match vcheck {
Ok(()) => (),
Err(SparseError::OutdatedPointer) => self.sparse_updt(state, metadata, depth)?,
Err(_) => return vcheck,
};
match self {
SparseSelector::Ref(x) => Ok(x.sparse_init(state, metadata, depth + 1)?),
SparseSelector::Obj(x) => Ok(x.sparse_init(state, metadata, depth + 1)?),
SparseSelector::Null => Err(SparseError::BadPointer),
}
}
}
impl<T> std::default::Default for SparseSelector<T>
where
T: Any + DeserializeOwned + Serialize + SparsableTrait,
{
fn default() -> Self {
SparseSelector::Null
}
}
impl<T> SparsePointer<T> for SparseSelector<T>
where
T: Any + DeserializeOwned + Serialize + SparsableTrait,
{
fn check_version<'a>(&'a self, state: &'a SparseState) -> Result<(), SparseError> {
match self {
SparseSelector::Obj(x) => Ok(x.check_version(state)?),
SparseSelector::Ref(x) => Ok(x.check_version(state)?),
SparseSelector::Null => Err(SparseError::BadPointer),
}
}
fn get(&self) -> Result<SparseValue<'_, T>, SparseError> {
match self {
SparseSelector::Obj(x) => Ok(x.get(None)?),
SparseSelector::Ref(x) => Ok(x.get(None)?),
SparseSelector::Null => Err(SparseError::BadPointer),
}
}
fn get_mut(
&mut self,
root: Rc<RefCell<SparseState>>,
) -> Result<SparseValueMut<'_, T>, SparseError> {
match self {
SparseSelector::Obj(x) => Ok(x.get_mut(root, None)?),
SparseSelector::Ref(x) => Ok(x.get_mut(root, None)?),
SparseSelector::Null => Err(SparseError::BadPointer),
}
}
fn self_reset(
&mut self,
state: &mut SparseState,
metadata: &SparseMetadata,
depth: u32,
) -> Result<(), SparseError> {
self.check_depth(depth)?;
match self {
SparseSelector::Obj(x) => Ok(x.self_reset(state, metadata, depth)?),
SparseSelector::Ref(x) => Ok(x.self_reset(state, metadata, depth)?),
SparseSelector::Null => Err(SparseError::BadPointer),
}
}
}