swamp_app/
system_types.rs1use std::mem::transmute;
6use std::ops::{Deref, DerefMut};
7use swamp_message::{Message, Messages};
8use swamp_resource::{Resource, ResourceStorage};
9use swamp_system::SystemParam;
10use swamp_system_state::State;
11
12pub struct ReM<'a, T: 'static> {
14 value: &'a mut T,
15}
16
17impl<'a, T> ReM<'a, T> {
18 pub fn new(value: &'a mut T) -> Self {
19 Self { value }
20 }
21}
22
23impl<'a, T> Deref for ReM<'a, T> {
24 type Target = T;
25
26 fn deref(&self) -> &Self::Target {
27 self.value
28 }
29}
30
31impl<'a, T> DerefMut for ReM<'a, T> {
32 fn deref_mut(&mut self) -> &mut Self::Target {
33 self.value
34 }
35}
36
37pub struct Re<'a, T: 'static> {
39 value: &'a T,
40}
41
42impl<'a, T> Re<'a, T> {
43 pub fn new(value: &'a T) -> Self {
44 Self { value }
45 }
46}
47
48impl<'a, T> Deref for Re<'a, T> {
49 type Target = T;
50
51 fn deref(&self) -> &Self::Target {
52 self.value
53 }
54}
55
56impl<T: Resource + 'static> SystemParam for ReM<'static, T> {
57 type Item = Self;
58
59 fn fetch(world: &mut State) -> Self::Item {
60 let actual_ref: &mut T = world.resource_mut::<T>();
61 let static_ref: &'static mut T = unsafe { transmute(actual_ref) };
62 ReM::new(static_ref)
63 }
64}
65
66impl<T: Resource + 'static> SystemParam for Re<'static, T> {
67 type Item = Self;
68
69 fn fetch(world: &mut State) -> Self::Item {
70 let actual_ref: &mut T = world.resource_mut::<T>();
71 let static_ref: &'static mut T = unsafe { transmute(actual_ref) };
72 Re::new(static_ref)
73 }
74}
75
76impl<T: 'static + Message> SystemParam for Msg<'static, T> {
77 type Item = Self;
78
79 fn fetch(world: &mut State) -> Self::Item {
80 let actual_ref = world.message::<T>();
81 let static_ref: &'static Messages<T> = unsafe { transmute(actual_ref) };
82 Msg::new(static_ref)
83 }
84}
85
86impl<T: 'static + Message> SystemParam for MsgM<'static, T> {
87 type Item = Self;
88
89 fn fetch(world: &mut State) -> Self::Item {
90 let actual_ref = world.message_mut::<T>();
91 let static_ref: &'static mut Messages<T> = unsafe { transmute(actual_ref) };
92 MsgM::new(static_ref)
93 }
94}
95
96pub struct ReAll<'a> {
97 value: &'a mut ResourceStorage,
98}
99impl<'a> ReAll<'a> {
100 pub fn new(value: &'a mut ResourceStorage) -> Self {
101 Self { value }
102 }
103}
104
105impl<'a> Deref for ReAll<'a> {
106 type Target = ResourceStorage;
107
108 fn deref(&self) -> &Self::Target {
109 self.value
110 }
111}
112
113impl<'a> DerefMut for ReAll<'a> {
114 fn deref_mut(&mut self) -> &mut Self::Target {
115 self.value
116 }
117}
118
119impl SystemParam for ReAll<'static> {
120 type Item = Self;
121
122 fn fetch(world: &mut State) -> Self::Item {
123 let actual_ref: &mut ResourceStorage = world.resources_mut();
124 let static_ref: &'static mut ResourceStorage = unsafe { transmute(actual_ref) };
125 ReAll::new(static_ref)
126 }
127}
128
129pub struct Msg<'a, T: 'static + Message> {
132 value: &'a Messages<T>,
133}
134
135impl<'a, T: Message> Msg<'a, T> {
136 #[must_use]
137 pub const fn new(value: &'a Messages<T>) -> Self {
138 Self { value }
139 }
140}
141
142impl<'a, T: Message> Deref for Msg<'a, T> {
143 type Target = Messages<T>;
144
145 fn deref(&self) -> &Self::Target {
146 self.value
147 }
148}
149
150pub struct MsgM<'a, T: 'static + Message> {
152 value: &'a mut Messages<T>,
153}
154
155impl<'a, T: Message> crate::system_types::MsgM<'a, T> {
156 pub fn new(value: &'a mut Messages<T>) -> Self {
157 Self { value }
158 }
159}
160
161impl<'a, T: Message> Deref for crate::system_types::MsgM<'a, T> {
162 type Target = Messages<T>;
163
164 fn deref(&self) -> &Self::Target {
165 self.value
166 }
167}
168
169impl<'a, T: Message> DerefMut for crate::system_types::MsgM<'a, T> {
170 fn deref_mut(&mut self) -> &mut Self::Target {
171 self.value
172 }
173}