polyhorn_core/
state.rs

1use std::cell::{Ref, RefMut};
2use std::marker::PhantomData;
3
4use super::{Link, Weak, WeakState};
5
6pub struct State<T>
7where
8    T: 'static,
9{
10    instance_id: usize,
11    state_id: usize,
12    marker: PhantomData<T>,
13}
14
15impl<T> State<T> {
16    pub fn new(instance_id: usize, state_id: usize) -> State<T> {
17        State {
18            instance_id,
19            state_id,
20            marker: PhantomData,
21        }
22    }
23
24    pub fn get<'a, L>(&self, link: &'a L) -> Ref<'a, T>
25    where
26        L: Link,
27    {
28        assert_eq!(self.instance_id, link.instance().id);
29
30        Ref::map(link.memory().state(self.state_id), |state| {
31            state.downcast_ref().unwrap()
32        })
33    }
34
35    pub fn replace<L>(&self, link: &L, value: T) -> T
36    where
37        L: Link,
38    {
39        assert_eq!(self.instance_id, link.instance().id);
40
41        link.instance().renderer().queue_rerender(link.instance());
42
43        let mut state = RefMut::map(link.memory().state_mut(self.state_id), |state| {
44            state.downcast_mut().unwrap()
45        });
46        std::mem::replace(&mut state, value)
47    }
48
49    pub fn weak<L>(self, link: &L) -> WeakState<L::Platform, T>
50    where
51        L: Link,
52    {
53        assert_eq!(self.instance_id, link.instance().id);
54
55        WeakState::new(Weak::new(link.instance()), self)
56    }
57}
58
59impl<T> Clone for State<T> {
60    fn clone(&self) -> Self {
61        *self
62    }
63}
64
65impl<T> Copy for State<T> {}