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> {}