1use crate::{
24 delegate_reflect,
25 reflect::{blank_reflect, prelude::*},
26 sstorage::ImmutableString,
27 uuid::Uuid,
28};
29use fyrox_core_derive::impl_reflect;
30use std::{
31 any::Any,
32 cell::{Cell, RefCell},
33 collections::HashMap,
34 fmt::Debug,
35 hash::{BuildHasher, Hash},
36 ops::{Deref, DerefMut, Range},
37 rc::Rc,
38 sync::Arc,
39 time::{Duration, Instant},
40};
41
42macro_rules! impl_blank_reflect {
43 ( $( $ty:ty ),* $(,)? ) => {
44 $(
45 impl Reflect for $ty {
46 blank_reflect!();
47 }
48 )*
49 }
50}
51
52impl_blank_reflect! {
53 f32, f64,
54 usize, u8, u16, u32, u64,
55 isize, i8, i16, i32, i64,
56 bool, char,
57 String,
58 std::path::PathBuf,
59 Duration, Instant,
60 ImmutableString
61}
62
63macro_rules! impl_reflect_tuple {
64 (
65 $(
66 ( $($t:ident,)* );
67 )*
68 ) => {
69 $(
70 impl< $($t: Reflect),* > Reflect for ( $($t,)* ) {
71 blank_reflect!();
72 }
73 )*
74 }
75}
76
77impl_reflect_tuple! {
78 (T0,);
79 (T0, T1, );
80 (T0, T1, T2, );
81 (T0, T1, T2, T3,);
82 (T0, T1, T2, T3, T4,);
83}
84
85impl<const N: usize, T: Reflect> Reflect for [T; N] {
86 blank_reflect!();
87
88 fn as_array(&self, func: &mut dyn FnMut(Option<&dyn ReflectArray>)) {
89 func(Some(self))
90 }
91
92 fn as_array_mut(&mut self, func: &mut dyn FnMut(Option<&mut dyn ReflectArray>)) {
93 func(Some(self))
94 }
95}
96
97impl<const N: usize, T: Reflect> ReflectArray for [T; N] {
98 fn reflect_index(&self, index: usize) -> Option<&dyn Reflect> {
99 if let Some(item) = self.get(index) {
100 Some(item)
101 } else {
102 None
103 }
104 }
105
106 fn reflect_index_mut(&mut self, index: usize) -> Option<&mut dyn Reflect> {
107 if let Some(item) = self.get_mut(index) {
108 Some(item)
109 } else {
110 None
111 }
112 }
113
114 fn reflect_len(&self) -> usize {
115 self.len()
116 }
117}
118
119impl_reflect! {
120 #[reflect(ReflectList, ReflectArray)]
121 pub struct Vec<T: Reflect + 'static>;
122}
123
124impl<T: Reflect + 'static> ReflectArray for Vec<T> {
125 fn reflect_index(&self, index: usize) -> Option<&dyn Reflect> {
126 self.get(index).map(|x| x as &dyn Reflect)
127 }
128
129 fn reflect_index_mut(&mut self, index: usize) -> Option<&mut dyn Reflect> {
130 self.get_mut(index).map(|x| x as &mut dyn Reflect)
131 }
132
133 fn reflect_len(&self) -> usize {
134 self.len()
135 }
136}
137
138impl<T: Reflect + 'static> ReflectList for Vec<T> {
140 fn reflect_push(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>> {
141 self.push(*value.downcast::<T>()?);
142 Ok(())
143 }
144
145 fn reflect_pop(&mut self) -> Option<Box<dyn Reflect>> {
146 if let Some(item) = self.pop() {
147 Some(Box::new(item))
148 } else {
149 None
150 }
151 }
152
153 fn reflect_remove(&mut self, index: usize) -> Option<Box<dyn Reflect>> {
154 if index < self.len() {
155 Some(Box::new(self.remove(index)))
156 } else {
157 None
158 }
159 }
160
161 fn reflect_insert(
162 &mut self,
163 index: usize,
164 value: Box<dyn Reflect>,
165 ) -> Result<(), Box<dyn Reflect>> {
166 self.insert(index, *value.downcast::<T>()?);
167 Ok(())
168 }
169}
170
171impl<K, V, S> Reflect for HashMap<K, V, S>
172where
173 K: Reflect + Debug + Eq + Hash + 'static,
174 V: Reflect + Debug + 'static,
175 S: BuildHasher + 'static,
176{
177 blank_reflect!();
178
179 fn as_hash_map(&self, func: &mut dyn FnMut(Option<&dyn ReflectHashMap>)) {
180 func(Some(self))
181 }
182
183 fn as_hash_map_mut(&mut self, func: &mut dyn FnMut(Option<&mut dyn ReflectHashMap>)) {
184 func(Some(self))
185 }
186}
187
188impl<K, V, S> ReflectHashMap for HashMap<K, V, S>
189where
190 K: Reflect + Debug + Eq + Hash + 'static,
191 V: Reflect + Debug + 'static,
192 S: BuildHasher + 'static,
193{
194 fn reflect_insert(
195 &mut self,
196 key: Box<dyn Reflect>,
197 value: Box<dyn Reflect>,
198 ) -> Option<Box<dyn Reflect>> {
199 if let Ok(key) = key.downcast::<K>() {
200 if let Ok(value) = value.downcast::<V>() {
201 if let Some(previous) = self.insert(*key, *value) {
202 return Some(Box::new(previous));
203 }
204 }
205 }
206
207 None
208 }
209
210 fn reflect_len(&self) -> usize {
211 self.len()
212 }
213
214 fn reflect_get(&self, key: &dyn Reflect, func: &mut dyn FnMut(Option<&dyn Reflect>)) {
215 key.downcast_ref::<K>(&mut |result| match result {
216 Some(key) => match self.get(key) {
217 Some(value) => func(Some(value as &dyn Reflect)),
218 None => func(None),
219 },
220 None => func(None),
221 })
222 }
223
224 fn reflect_get_mut(
225 &mut self,
226 key: &dyn Reflect,
227 func: &mut dyn FnMut(Option<&mut dyn Reflect>),
228 ) {
229 key.downcast_ref::<K>(&mut |result| match result {
230 Some(key) => match self.get_mut(key) {
231 Some(value) => func(Some(value as &mut dyn Reflect)),
232 None => func(None),
233 },
234 None => func(None),
235 })
236 }
237
238 fn reflect_get_nth_value_ref(&self, index: usize) -> Option<&dyn Reflect> {
239 self.values().nth(index).map(|v| v as &dyn Reflect)
240 }
241
242 fn reflect_get_nth_value_mut(&mut self, index: usize) -> Option<&mut dyn Reflect> {
243 self.values_mut().nth(index).map(|v| v as &mut dyn Reflect)
244 }
245
246 fn reflect_get_at(&self, index: usize) -> Option<(&dyn Reflect, &dyn Reflect)> {
247 self.iter()
248 .nth(index)
249 .map(|(k, v)| (k as &dyn Reflect, v as &dyn Reflect))
250 }
251
252 fn reflect_get_at_mut(&mut self, index: usize) -> Option<(&dyn Reflect, &mut dyn Reflect)> {
253 self.iter_mut()
254 .nth(index)
255 .map(|(k, v)| (k as &dyn Reflect, v as &mut dyn Reflect))
256 }
257
258 fn reflect_remove(
259 &mut self,
260 key: &dyn Reflect,
261 func: &mut dyn FnMut(Option<Box<dyn Reflect>>),
262 ) {
263 key.downcast_ref::<K>(&mut |result| match result {
264 Some(key) => func(
265 self.remove(key)
266 .map(|value| Box::new(value) as Box<dyn Reflect>),
267 ),
268 None => func(None),
269 })
270 }
271}
272
273impl Reflect for () {
274 blank_reflect!();
275}
276
277impl_reflect! { pub struct Uuid; }
278
279impl_reflect! {
280 pub struct Cell<T: Debug + Copy>;
281}
282
283impl_reflect! {
284 pub enum Option<T> {
285 Some(T),
286 None
287 }
288}
289
290impl_reflect! {
291 pub struct Range<Idx> {
292 pub start: Idx,
293 pub end: Idx,
294 }
295}
296
297impl<T: ?Sized + Reflect> Reflect for Box<T> {
298 delegate_reflect!();
299}
300
301macro_rules! impl_reflect_inner_mutability {
302 ($self:ident, $acquire_lock_guard:block, $into_inner:block) => {
303 fn source_path() -> &'static str {
304 file!()
305 }
306
307 fn type_name(&$self) -> &'static str {
308 std::any::type_name::<T>()
309 }
310
311 fn doc(&$self) -> &'static str {
312 ""
313 }
314
315 fn assembly_name(&self) -> &'static str {
316 env!("CARGO_PKG_NAME")
317 }
318
319 fn type_assembly_name() -> &'static str {
320 env!("CARGO_PKG_NAME")
321 }
322
323 fn fields_info(&$self, func: &mut dyn FnMut(&[FieldInfo])) {
324 let guard = $acquire_lock_guard;
325 guard.fields_info(func)
326 }
327
328 fn into_any($self: Box<Self>) -> Box<dyn Any> {
329 let inner = $into_inner;
330 Box::new(inner)
331 }
332
333 fn as_any(&$self, func: &mut dyn FnMut(&dyn Any)) {
334 let guard = $acquire_lock_guard;
335 (*guard).as_any(func)
336 }
337
338 fn as_any_mut(&mut $self, func: &mut dyn FnMut(&mut dyn Any)) {
339 let mut guard = $acquire_lock_guard;
340 (*guard).as_any_mut(func)
341 }
342
343 fn as_reflect(&$self, func: &mut dyn FnMut(&dyn Reflect)) {
344 let guard = $acquire_lock_guard;
345 (*guard).as_reflect(func)
346 }
347
348 fn as_reflect_mut(&mut $self, func: &mut dyn FnMut(&mut dyn Reflect)) {
349 let mut guard = $acquire_lock_guard;
350 (*guard).as_reflect_mut(func)
351 }
352
353 fn set(&mut $self, value: Box<dyn Reflect>) -> Result<Box<dyn Reflect>, Box<dyn Reflect>> {
354 let mut guard = $acquire_lock_guard;
355 guard.set(value)
356 }
357
358 fn set_field(
359 &mut $self,
360 field: &str,
361 value: Box<dyn Reflect>,
362 func: &mut dyn FnMut(Result<Box<dyn Reflect>, Box<dyn Reflect>>),
363 ) {
364 let mut guard = $acquire_lock_guard;
365 guard.set_field(field, value, func)
366 }
367
368 fn fields(&$self, func: &mut dyn FnMut(&[&dyn Reflect])) {
369 let guard = $acquire_lock_guard;
370 guard.fields(func)
371 }
372
373 fn fields_mut(&mut $self, func: &mut dyn FnMut(&mut [&mut dyn Reflect])) {
374 let mut guard = $acquire_lock_guard;
375 guard.fields_mut(func)
376 }
377
378 fn field(&$self, name: &str, func: &mut dyn FnMut(Option<&dyn Reflect>)) {
379 let guard = $acquire_lock_guard;
380 guard.field(name, func)
381 }
382
383 fn field_mut(&mut $self, name: &str, func: &mut dyn FnMut(Option<&mut dyn Reflect>)) {
384 let mut guard = $acquire_lock_guard;
385 guard.field_mut(name, func)
386 }
387
388 fn as_array(&$self, func: &mut dyn FnMut(Option<&dyn ReflectArray>)) {
389 let guard = $acquire_lock_guard;
390 guard.as_array(func)
391 }
392
393 fn as_array_mut(&mut $self, func: &mut dyn FnMut(Option<&mut dyn ReflectArray>)) {
394 let mut guard = $acquire_lock_guard;
395 guard.as_array_mut(func)
396 }
397
398 fn as_list(&$self, func: &mut dyn FnMut(Option<&dyn ReflectList>)) {
399 let guard = $acquire_lock_guard;
400 guard.as_list(func)
401 }
402
403 fn as_list_mut(&mut $self, func: &mut dyn FnMut(Option<&mut dyn ReflectList>)) {
404 let mut guard = $acquire_lock_guard;
405 guard.as_list_mut(func)
406 }
407
408 fn as_inheritable_variable(
409 &$self,
410 func: &mut dyn FnMut(Option<&dyn ReflectInheritableVariable>),
411 ) {
412 let guard = $acquire_lock_guard;
413 guard.as_inheritable_variable(func)
414 }
415
416 fn as_inheritable_variable_mut(
417 &mut $self,
418 func: &mut dyn FnMut(Option<&mut dyn ReflectInheritableVariable>),
419 ) {
420 let mut guard = $acquire_lock_guard;
421 guard.as_inheritable_variable_mut(func)
422 }
423
424 fn as_hash_map(&$self, func: &mut dyn FnMut(Option<&dyn ReflectHashMap>)) {
425 let guard = $acquire_lock_guard;
426 guard.as_hash_map(func)
427 }
428
429 fn as_hash_map_mut(&mut $self, func: &mut dyn FnMut(Option<&mut dyn ReflectHashMap>)) {
430 let mut guard = $acquire_lock_guard;
431 guard.as_hash_map_mut(func)
432 }
433 };
434}
435
436impl<T: Reflect> Reflect for parking_lot::Mutex<T> {
437 impl_reflect_inner_mutability!(self, { self.lock() }, { self.into_inner() });
438}
439
440impl<T: Reflect> Reflect for parking_lot::RwLock<T> {
441 impl_reflect_inner_mutability!(self, { self.write() }, { self.into_inner() });
442}
443
444#[allow(clippy::mut_mutex_lock)]
445impl<T: Reflect> Reflect for std::sync::Mutex<T> {
446 impl_reflect_inner_mutability!(self, { self.lock().unwrap() }, { self.into_inner() });
447}
448
449impl<T: Reflect> Reflect for std::sync::RwLock<T> {
450 impl_reflect_inner_mutability!(self, { self.write().unwrap() }, { self.into_inner() });
451}
452
453impl<T: Reflect> Reflect for Arc<parking_lot::Mutex<T>> {
454 impl_reflect_inner_mutability!(self, { self.lock() }, {
455 Arc::into_inner(*self)
456 .expect("Value cannot be shared!")
457 .into_inner()
458 });
459}
460
461impl<T: Reflect> Reflect for Arc<std::sync::Mutex<T>> {
462 impl_reflect_inner_mutability!(self, { self.lock().unwrap() }, {
463 Arc::into_inner(*self)
464 .expect("Value cannot be shared!")
465 .into_inner()
466 });
467}
468
469impl<T: Reflect> Reflect for Arc<std::sync::RwLock<T>> {
470 impl_reflect_inner_mutability!(self, { self.write().unwrap() }, {
471 Arc::into_inner(*self)
472 .expect("Value cannot be shared!")
473 .into_inner()
474 });
475}
476
477impl<T: Reflect> Reflect for Arc<parking_lot::RwLock<T>> {
478 impl_reflect_inner_mutability!(self, { self.write() }, {
479 Arc::into_inner(*self)
480 .expect("Value cannot be shared!")
481 .into_inner()
482 });
483}
484
485impl<T: Reflect> Reflect for RefCell<T> {
486 impl_reflect_inner_mutability!(self, { self.borrow_mut() }, { self.into_inner() });
487}
488
489impl<T: Reflect> Reflect for Rc<RefCell<T>> {
490 impl_reflect_inner_mutability!(self, { self.borrow_mut() }, {
491 Rc::into_inner(*self)
492 .expect("Value cannot be shared!")
493 .into_inner()
494 });
495}