inc_complete/storage/
singleton.rs1use serde::{Deserialize, ser::SerializeTuple};
2
3use super::{OutputType, StorageFor};
4use crate::Cell;
5
6#[derive(Clone)]
11pub struct SingletonStorage<K: OutputType> {
12 cell: Option<Cell>,
13 key: Option<K>,
14 value: Option<K::Output>,
15}
16
17impl<K: OutputType> Default for SingletonStorage<K> {
18 fn default() -> Self {
19 Self {
20 cell: None,
21 value: None,
22 key: None,
23 }
24 }
25}
26
27impl<K> StorageFor<K> for SingletonStorage<K>
28where
29 K: OutputType,
30 K::Output: Eq,
31{
32 fn get_cell_for_computation(&self, _: &K) -> Option<Cell> {
33 self.cell
34 }
35
36 fn insert_new_cell(&mut self, cell: Cell, key: K) {
37 assert!(
38 self.cell.is_none(),
39 "Overwriting previous singleton value - are you using SingleStorage<{}> with a non-singleton type?",
40 std::any::type_name::<K>()
41 );
42 self.cell = Some(cell);
43 self.key = Some(key);
44 }
45
46 fn get_input(&self, _: Cell) -> &K {
47 self.key.as_ref().unwrap()
48 }
49
50 fn get_output(&self, _: Cell) -> Option<&K::Output> {
51 self.value.as_ref()
52 }
53
54 fn update_output(&mut self, _: Cell, new_value: K::Output) -> bool {
55 let changed = self.value.as_ref().is_none_or(|value| *value != new_value);
56 self.value = Some(new_value);
57 changed
58 }
59}
60
61impl<K> serde::Serialize for SingletonStorage<K>
62where
63 K: serde::Serialize + OutputType,
64 K::Output: serde::Serialize,
65{
66 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
67 where
68 S: serde::Serializer,
69 {
70 let mut s = serializer.serialize_tuple(3)?;
71 s.serialize_element(&self.cell)?;
72 s.serialize_element(&self.key)?;
73 s.serialize_element(&self.value)?;
74 s.end()
75 }
76}
77
78impl<'de, K> serde::Deserialize<'de> for SingletonStorage<K>
79where
80 K: serde::Deserialize<'de> + OutputType,
81 K::Output: serde::Deserialize<'de>,
82{
83 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
84 where
85 D: serde::Deserializer<'de>,
86 {
87 let (cell, key, value) = Deserialize::deserialize(deserializer)?;
88 Ok(SingletonStorage { cell, key, value })
89 }
90}