cranpose_core/snapshot_v2/
readonly.rs1use super::*;
2
3pub struct ReadonlySnapshot {
13 pub(super) state: SnapshotState,
14}
15
16impl ReadonlySnapshot {
17 pub fn new(
19 id: SnapshotId,
20 invalid: SnapshotIdSet,
21 read_observer: Option<ReadObserver>,
22 ) -> Rc<Self> {
23 Rc::new(Self {
24 state: SnapshotState::new(id, invalid, read_observer, None, false),
25 })
26 }
27
28 pub fn snapshot_id(&self) -> SnapshotId {
29 self.state.id.get()
30 }
31
32 pub fn invalid(&self) -> SnapshotIdSet {
33 self.state.invalid.borrow().clone()
34 }
35
36 pub fn read_only(&self) -> bool {
37 true
38 }
39
40 pub fn root_readonly(&self) -> Rc<Self> {
41 ReadonlySnapshot::new(
42 self.state.id.get(),
43 self.state.invalid.borrow().clone(),
44 self.state.read_observer.borrow().clone(),
45 )
46 }
47
48 pub fn enter<T>(&self, f: impl FnOnce() -> T) -> T {
49 enter_snapshot_scope(AnySnapshot::Readonly(self.root_readonly()), f)
50 }
51
52 pub fn take_nested_snapshot(&self, read_observer: Option<ReadObserver>) -> Rc<Self> {
53 let merged_observer =
54 merge_read_observers(read_observer, self.state.read_observer.borrow().clone());
55 ReadonlySnapshot::new(
56 self.state.id.get(),
57 self.state.invalid.borrow().clone(),
58 merged_observer,
59 )
60 }
61
62 pub fn has_pending_changes(&self) -> bool {
63 false
64 }
65
66 pub fn dispose(&self) {
67 self.state.dispose();
68 }
69
70 pub fn record_read(&self, state: &dyn StateObject) {
71 self.state.record_read(state);
72 }
73
74 pub fn record_write(&self, _state: Rc<dyn StateObject>) {
75 panic!("Cannot write to a read-only snapshot");
76 }
77
78 pub fn is_disposed(&self) -> bool {
79 self.state.disposed.get()
80 }
81
82 pub(crate) fn set_on_dispose<F>(&self, f: F)
83 where
84 F: FnOnce() + 'static,
85 {
86 self.state.set_on_dispose(f);
87 }
88}
89
90#[cfg(test)]
91#[path = "tests/readonly_tests.rs"]
92mod tests;