inc_complete/storage/
singleton.rs

1use serde::{Deserialize, ser::SerializeTuple};
2
3use super::{OutputType, StorageFor};
4use crate::Cell;
5
6/// Helper to store a simple computation type which has no fields and thus
7/// does not require a HashMap to cache each possible value.
8///
9/// Examples include `struct SourceFile;` or `struct Time;`
10#[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}