Skip to content

Commit 00cca2f

Browse files
Implement Reflect for Box<dyn Reflect>
1 parent 3409579 commit 00cca2f

File tree

3 files changed

+68
-3
lines changed

3 files changed

+68
-3
lines changed

crates/bevy_reflect/src/lib.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -370,4 +370,19 @@ mod tests {
370370
std::any::type_name::<TestTupleStruct>()
371371
);
372372
}
373+
374+
#[test]
375+
fn box_dyn_reflect() {
376+
#[derive(Reflect)]
377+
struct Foo {
378+
a: u32,
379+
}
380+
381+
let boxed: Box<dyn Reflect> = Box::new(Foo { a: 1 });
382+
383+
assert_eq!(
384+
boxed.type_name(),
385+
"bevy_reflect::tests::box_dyn_reflect::Foo"
386+
);
387+
}
373388
}

crates/bevy_reflect/src/list.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,11 @@ impl DynamicList {
4646

4747
impl List for DynamicList {
4848
fn get(&self, index: usize) -> Option<&dyn Reflect> {
49-
self.values.get(index).map(|value| &**value)
49+
self.values.get(index)
5050
}
5151

5252
fn get_mut(&mut self, index: usize) -> Option<&mut dyn Reflect> {
53-
self.values.get_mut(index).map(|value| &mut **value)
53+
self.values.get_mut(index).map(|value| &mut *value)
5454
}
5555

5656
fn len(&self) -> usize {

crates/bevy_reflect/src/reflect.rs

Lines changed: 51 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
use crate::{serde::Serializable, List, Map, Struct, Tuple, TupleStruct};
2-
use std::{any::Any, fmt::Debug};
2+
use std::{
3+
any::Any,
4+
fmt::Debug,
5+
ops::{Deref, DerefMut},
6+
};
37

48
pub use bevy_utils::AHasher as ReflectHasher;
59

@@ -86,3 +90,49 @@ impl dyn Reflect {
8690
self.any_mut().downcast_mut::<T>()
8791
}
8892
}
93+
94+
unsafe impl Reflect for Box<dyn Reflect> {
95+
fn type_name(&self) -> &str {
96+
self.deref().type_name()
97+
}
98+
99+
fn any(&self) -> &dyn Any {
100+
self.deref().any()
101+
}
102+
103+
fn any_mut(&mut self) -> &mut dyn Any {
104+
self.deref_mut().any_mut()
105+
}
106+
107+
fn apply(&mut self, value: &dyn Reflect) {
108+
self.deref_mut().apply(value)
109+
}
110+
111+
fn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>> {
112+
self.deref_mut().set(value)
113+
}
114+
115+
fn reflect_ref(&self) -> ReflectRef {
116+
self.deref().reflect_ref()
117+
}
118+
119+
fn reflect_mut(&mut self) -> ReflectMut {
120+
self.deref_mut().reflect_mut()
121+
}
122+
123+
fn clone_value(&self) -> Box<dyn Reflect> {
124+
self.deref().clone_value()
125+
}
126+
127+
fn reflect_hash(&self) -> Option<u64> {
128+
self.deref().reflect_hash()
129+
}
130+
131+
fn reflect_partial_eq(&self, value: &dyn Reflect) -> Option<bool> {
132+
self.deref().reflect_partial_eq(value)
133+
}
134+
135+
fn serializable(&self) -> Option<Serializable> {
136+
self.deref().serializable()
137+
}
138+
}

0 commit comments

Comments
 (0)