1use super::*;
2
3#[derive(Debug, Clone, Deserialize, Serialize, PartialEq)]
8#[serde(untagged)]
9pub enum SparsePointedValue<S> {
10 RefRaw(Box<SparseRefRaw<S>>),
11 Obj(S),
12 Ref(SparseRef<S>),
13 Null,
14}
15
16impl<S> SparsableTrait for SparsePointedValue<S>
17where
18 S: DeserializeOwned + Serialize + SparsableTrait,
19{
20 fn sparse_init(
21 &mut self,
22 state: &mut SparseState,
23 metadata: &SparseMetadata,
24 depth: u32,
25 ) -> Result<(), SparseError> {
26 self.check_depth(depth)?;
27 match self {
28 SparsePointedValue::Null => self.self_reset(state, metadata, depth)?,
29 _ => {
30 if let Some(SparseError::OutdatedPointer) = self.check_version(state).err() {
31 self.self_reset(state, metadata, depth)?;
32 }
33 }
34 }
35 match self {
36 SparsePointedValue::RefRaw(x) => x.sparse_init(state, metadata, depth + 1),
37 SparsePointedValue::Obj(x) => x.sparse_init(state, metadata, depth + 1),
38 SparsePointedValue::Ref(x) => x.sparse_init(state, metadata, depth + 1),
39 SparsePointedValue::Null => Err(SparseError::BadPointer),
40 }
41 }
42
43 fn sparse_updt<'a>(
44 &mut self,
45 state: &mut SparseState,
46 metadata: &SparseMetadata,
47 depth: u32,
48 ) -> Result<(), SparseError> {
49 self.check_depth(depth)?;
50 let vcheck = self.check_version(state);
51 match vcheck {
52 Ok(()) => (),
53 Err(SparseError::OutdatedPointer) => self.sparse_init(state, metadata, depth + 1)?,
54 Err(_) => return vcheck,
55 };
56 match self {
57 SparsePointedValue::RefRaw(x) => x.sparse_updt(state, metadata, depth + 1),
58 SparsePointedValue::Obj(x) => x.sparse_updt(state, metadata, depth + 1),
59 SparsePointedValue::Ref(x) => x.sparse_updt(state, metadata, depth + 1),
60 SparsePointedValue::Null => Err(SparseError::BadPointer),
61 }
62 }
63}
64
65impl<S> std::default::Default for SparsePointedValue<S> {
66 fn default() -> Self {
67 SparsePointedValue::Null
68 }
69}
70
71impl<S> SparsePointedValue<S> {
72 pub fn default_boxed() -> Box<Self> {
73 Box::new(SparsePointedValue::<S>::default())
74 }
75}
76
77impl<S> SparsePointerRaw<S> for SparsePointedValue<S>
78where
79 S: DeserializeOwned + Serialize + SparsableTrait,
80{
81 fn check_version<'a>(&'a self, state: &'a SparseState) -> Result<(), SparseError> {
82 match self {
83 SparsePointedValue::RefRaw(x) => Ok(x.check_version(state)?),
84 SparsePointedValue::Ref(x) => Ok(x.check_version(state)?),
85 SparsePointedValue::Obj(_x) => Ok(()),
86 SparsePointedValue::Null => Err(SparseError::BadPointer),
87 }
88 }
89
90 fn get<'a>(
91 &'a self,
92 metadata: Option<&'a SparseMetadata>,
93 ) -> Result<SparseValue<'a, S>, SparseError> {
94 match self {
95 SparsePointedValue::Ref(x) => Ok(x.get()?),
96 SparsePointedValue::Obj(x) => Ok(SparseValue::new(x, metadata)),
97 SparsePointedValue::RefRaw(x) => Ok(x.get(metadata)?),
98 SparsePointedValue::Null => Err(SparseError::BadPointer),
99 }
100 }
101
102 fn get_mut<'a>(
103 &'a mut self,
104 state_cell: Rc<RefCell<SparseState>>,
105 metadata: Option<&'a SparseMetadata>,
106 ) -> Result<SparseValueMut<'a, S>, SparseError> {
107 {
108 let state = state_cell
109 .try_borrow()
110 .map_err(|_e| SparseError::StateAlreadyBorrowed)?;
111 self.check_version(&state)?;
112 }
113 match self {
114 SparsePointedValue::Ref(x) => Ok(x.get_mut(state_cell)?),
115 SparsePointedValue::Obj(x) => Ok(SparseValueMut::new(&mut *x, state_cell, metadata)),
116 SparsePointedValue::RefRaw(x) => Ok(x.get_mut(state_cell, metadata)?),
117 SparsePointedValue::Null => Err(SparseError::BadPointer),
118 }
119 }
120
121 fn self_reset<'a>(
122 &mut self,
123 state: &mut SparseState,
124 metadata: &'a SparseMetadata,
125 depth: u32,
126 ) -> Result<(), SparseError> {
127 self.check_depth(depth)?;
128 match self {
129 SparsePointedValue::Ref(x) => Ok(x.self_reset(state, metadata, depth + 1)?),
130 SparsePointedValue::Obj(_x) => Ok(()),
131 SparsePointedValue::RefRaw(x) => Ok(x.self_reset(state, metadata, depth + 1)?),
132 SparsePointedValue::Null => Ok(()),
133 }
134 }
135}