Skip to content

Commit a4387f2

Browse files
Implement Reflect for Box<dyn Reflect>
1 parent 04aedf1 commit a4387f2

File tree

3 files changed

+64
-2
lines changed

3 files changed

+64
-2
lines changed

crates/bevy_reflect/src/lib.rs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1868,6 +1868,21 @@ bevy_reflect::tests::Test {
18681868
assert_eq!("123", format!("{:?}", foo));
18691869
}
18701870

1871+
#[test]
1872+
fn box_dyn_reflect() {
1873+
#[derive(Reflect)]
1874+
struct Foo {
1875+
a: u32,
1876+
}
1877+
1878+
let boxed: Box<dyn Reflect> = Box::new(Foo { a: 1 });
1879+
1880+
assert_eq!(
1881+
boxed.type_name(),
1882+
"bevy_reflect::tests::box_dyn_reflect::Foo"
1883+
);
1884+
}
1885+
18711886
#[test]
18721887
fn recursive_typed_storage_does_not_hang() {
18731888
#[derive(Reflect)]

crates/bevy_reflect/src/list.rs

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

226226
impl List for DynamicList {
227227
fn get(&self, index: usize) -> Option<&dyn Reflect> {
228-
self.values.get(index).map(|value| &**value)
228+
self.values.get(index)
229229
}
230230

231231
fn get_mut(&mut self, index: usize) -> Option<&mut dyn Reflect> {
232-
self.values.get_mut(index).map(|value| &mut **value)
232+
self.values.get_mut(index).map(|value| &mut *value)
233233
}
234234

235235
fn insert(&mut self, index: usize, element: Box<dyn Reflect>) {

crates/bevy_reflect/src/reflect.rs

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use crate::{
66
use std::{
77
any::{Any, TypeId},
88
fmt::Debug,
9+
ops::{Deref, DerefMut},
910
};
1011

1112
use crate::utility::NonGenericTypeInfoCell;
@@ -326,3 +327,49 @@ impl dyn Reflect {
326327
self.as_any_mut().downcast_mut::<T>()
327328
}
328329
}
330+
331+
unsafe impl Reflect for Box<dyn Reflect> {
332+
fn type_name(&self) -> &str {
333+
self.deref().type_name()
334+
}
335+
336+
fn any(&self) -> &dyn Any {
337+
self.deref().any()
338+
}
339+
340+
fn any_mut(&mut self) -> &mut dyn Any {
341+
self.deref_mut().any_mut()
342+
}
343+
344+
fn apply(&mut self, value: &dyn Reflect) {
345+
self.deref_mut().apply(value)
346+
}
347+
348+
fn set(&mut self, value: Box<dyn Reflect>) -> Result<(), Box<dyn Reflect>> {
349+
self.deref_mut().set(value)
350+
}
351+
352+
fn reflect_ref(&self) -> ReflectRef {
353+
self.deref().reflect_ref()
354+
}
355+
356+
fn reflect_mut(&mut self) -> ReflectMut {
357+
self.deref_mut().reflect_mut()
358+
}
359+
360+
fn clone_value(&self) -> Box<dyn Reflect> {
361+
self.deref().clone_value()
362+
}
363+
364+
fn reflect_hash(&self) -> Option<u64> {
365+
self.deref().reflect_hash()
366+
}
367+
368+
fn reflect_partial_eq(&self, value: &dyn Reflect) -> Option<bool> {
369+
self.deref().reflect_partial_eq(value)
370+
}
371+
372+
fn serializable(&self) -> Option<Serializable> {
373+
self.deref().serializable()
374+
}
375+
}

0 commit comments

Comments
 (0)