Skip to content

Commit

Permalink
Made use of new convenience casting methods
Browse files Browse the repository at this point in the history
  • Loading branch information
MrGVSV committed Sep 15, 2024
1 parent 00be903 commit 7303200
Show file tree
Hide file tree
Showing 14 changed files with 182 additions and 217 deletions.
9 changes: 4 additions & 5 deletions crates/bevy_asset/src/reflect.rs
Original file line number Diff line number Diff line change
Expand Up @@ -242,7 +242,7 @@ mod tests {
use crate::{Asset, AssetApp, AssetPlugin, ReflectAsset, UntypedHandle};
use bevy_app::App;
use bevy_ecs::reflect::AppTypeRegistry;
use bevy_reflect::{Reflect, ReflectMut};
use bevy_reflect::Reflect;

#[derive(Asset, Reflect)]
struct AssetType {
Expand Down Expand Up @@ -271,13 +271,12 @@ mod tests {
};

let handle = reflect_asset.add(app.world_mut(), &value);
let ReflectMut::Struct(strukt) = reflect_asset
let strukt = reflect_asset
.get_mut(app.world_mut(), handle)
.unwrap()
.reflect_mut()
else {
unreachable!();
};
.as_struct()
.unwrap();
strukt
.field_mut("field")
.unwrap()
Expand Down
33 changes: 14 additions & 19 deletions crates/bevy_reflect/src/array.rs
Original file line number Diff line number Diff line change
Expand Up @@ -436,23 +436,20 @@ pub fn array_try_apply<A: Array>(
array: &mut A,
reflect: &dyn PartialReflect,
) -> Result<(), ApplyError> {
if let ReflectRef::Array(reflect_array) = reflect.reflect_ref() {
if array.len() != reflect_array.len() {
return Err(ApplyError::DifferentSize {
from_size: reflect_array.len(),
to_size: array.len(),
});
}
for (i, value) in reflect_array.iter().enumerate() {
let v = array.get_mut(i).unwrap();
v.try_apply(value)?;
}
} else {
return Err(ApplyError::MismatchedKinds {
from_kind: reflect.reflect_kind(),
to_kind: ReflectKind::Array,
let reflect_array = reflect.reflect_ref().as_array()?;

if array.len() != reflect_array.len() {
return Err(ApplyError::DifferentSize {
from_size: reflect_array.len(),
to_size: array.len(),
});
}

for (i, value) in reflect_array.iter().enumerate() {
let v = array.get_mut(i).unwrap();
v.try_apply(value)?;
}

Ok(())
}

Expand Down Expand Up @@ -507,7 +504,7 @@ pub fn array_debug(dyn_array: &dyn Array, f: &mut Formatter<'_>) -> std::fmt::Re
}
#[cfg(test)]
mod tests {
use crate::{Reflect, ReflectRef};
use crate::Reflect;
#[test]
fn next_index_increment() {
const SIZE: usize = if cfg!(debug_assertions) {
Expand All @@ -519,9 +516,7 @@ mod tests {

let b = Box::new([(); SIZE]).into_reflect();

let ReflectRef::Array(array) = b.reflect_ref() else {
panic!("Not an array...");
};
let array = b.reflect_ref().as_array().unwrap();

let mut iter = array.iter();
iter.index = SIZE - 1;
Expand Down
77 changes: 36 additions & 41 deletions crates/bevy_reflect/src/enums/dynamic_enum.rs
Original file line number Diff line number Diff line change
Expand Up @@ -322,55 +322,50 @@ impl PartialReflect for DynamicEnum {

#[inline]
fn try_apply(&mut self, value: &dyn PartialReflect) -> Result<(), ApplyError> {
if let ReflectRef::Enum(value) = value.reflect_ref() {
if Enum::variant_name(self) == value.variant_name() {
// Same variant -> just update fields
match value.variant_type() {
VariantType::Struct => {
for field in value.iter_fields() {
let name = field.name().unwrap();
if let Some(v) = Enum::field_mut(self, name) {
v.try_apply(field.value())?;
}
let value = value.reflect_ref().as_enum()?;

if Enum::variant_name(self) == value.variant_name() {
// Same variant -> just update fields
match value.variant_type() {
VariantType::Struct => {
for field in value.iter_fields() {
let name = field.name().unwrap();
if let Some(v) = Enum::field_mut(self, name) {
v.try_apply(field.value())?;
}
}
VariantType::Tuple => {
for (index, field) in value.iter_fields().enumerate() {
if let Some(v) = Enum::field_at_mut(self, index) {
v.try_apply(field.value())?;
}
}
}
_ => {}
}
} else {
// New variant -> perform a switch
let dyn_variant = match value.variant_type() {
VariantType::Unit => DynamicVariant::Unit,
VariantType::Tuple => {
let mut dyn_tuple = DynamicTuple::default();
for field in value.iter_fields() {
dyn_tuple.insert_boxed(field.value().clone_value());
VariantType::Tuple => {
for (index, field) in value.iter_fields().enumerate() {
if let Some(v) = Enum::field_at_mut(self, index) {
v.try_apply(field.value())?;
}
DynamicVariant::Tuple(dyn_tuple)
}
VariantType::Struct => {
let mut dyn_struct = DynamicStruct::default();
for field in value.iter_fields() {
dyn_struct
.insert_boxed(field.name().unwrap(), field.value().clone_value());
}
DynamicVariant::Struct(dyn_struct)
}
};
self.set_variant(value.variant_name(), dyn_variant);
}
_ => {}
}
} else {
return Err(ApplyError::MismatchedKinds {
from_kind: value.reflect_kind(),
to_kind: ReflectKind::Enum,
});
// New variant -> perform a switch
let dyn_variant = match value.variant_type() {
VariantType::Unit => DynamicVariant::Unit,
VariantType::Tuple => {
let mut dyn_tuple = DynamicTuple::default();
for field in value.iter_fields() {
dyn_tuple.insert_boxed(field.value().clone_value());
}
DynamicVariant::Tuple(dyn_tuple)
}
VariantType::Struct => {
let mut dyn_struct = DynamicStruct::default();
for field in value.iter_fields() {
dyn_struct.insert_boxed(field.name().unwrap(), field.value().clone_value());
}
DynamicVariant::Struct(dyn_struct)
}
};
self.set_variant(value.variant_name(), dyn_variant);
}

Ok(())
}

Expand Down
16 changes: 8 additions & 8 deletions crates/bevy_reflect/src/impls/smallvec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -194,15 +194,15 @@ where
T::Item: FromReflect + MaybeTyped + TypePath,
{
fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self> {
if let ReflectRef::List(ref_list) = reflect.reflect_ref() {
let mut new_list = Self::with_capacity(ref_list.len());
for field in ref_list.iter() {
new_list.push(<T as SmallArray>::Item::from_reflect(field)?);
}
Some(new_list)
} else {
None
let ref_list = reflect.reflect_ref().as_list().ok()?;

let mut new_list = Self::with_capacity(ref_list.len());

for field in ref_list.iter() {
new_list.push(<T as SmallArray>::Item::from_reflect(field)?);
}

Some(new_list)
}
}

Expand Down
106 changes: 53 additions & 53 deletions crates/bevy_reflect/src/impls/std.rs
Original file line number Diff line number Diff line change
Expand Up @@ -544,15 +544,15 @@ macro_rules! impl_reflect_for_veclike {

impl<T: FromReflect + MaybeTyped + TypePath + GetTypeRegistration> FromReflect for $ty {
fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self> {
if let ReflectRef::List(ref_list) = reflect.reflect_ref() {
let mut new_list = Self::with_capacity(ref_list.len());
for field in ref_list.iter() {
$push(&mut new_list, T::from_reflect(field)?);
}
Some(new_list)
} else {
None
let ref_list = reflect.reflect_ref().as_list().ok()?;

let mut new_list = Self::with_capacity(ref_list.len());

for field in ref_list.iter() {
$push(&mut new_list, T::from_reflect(field)?);
}

Some(new_list)
}
}
};
Expand Down Expand Up @@ -792,17 +792,17 @@ macro_rules! impl_reflect_for_hashmap {
S: TypePath + BuildHasher + Default + Send + Sync,
{
fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self> {
if let ReflectRef::Map(ref_map) = reflect.reflect_ref() {
let mut new_map = Self::with_capacity_and_hasher(ref_map.len(), S::default());
for (key, value) in ref_map.iter() {
let new_key = K::from_reflect(key)?;
let new_value = V::from_reflect(value)?;
new_map.insert(new_key, new_value);
}
Some(new_map)
} else {
None
let ref_map = reflect.reflect_ref().as_map().ok()?;

let mut new_map = Self::with_capacity_and_hasher(ref_map.len(), S::default());

for (key, value) in ref_map.iter() {
let new_key = K::from_reflect(key)?;
let new_value = V::from_reflect(value)?;
new_map.insert(new_key, new_value);
}

Some(new_map)
}
}
};
Expand Down Expand Up @@ -1013,16 +1013,16 @@ macro_rules! impl_reflect_for_hashset {
S: TypePath + BuildHasher + Default + Send + Sync,
{
fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self> {
if let ReflectRef::Set(ref_set) = reflect.reflect_ref() {
let mut new_set = Self::with_capacity_and_hasher(ref_set.len(), S::default());
for value in ref_set.iter() {
let new_value = V::from_reflect(value)?;
new_set.insert(new_value);
}
Some(new_set)
} else {
None
let ref_set = reflect.reflect_ref().as_set().ok()?;

let mut new_set = Self::with_capacity_and_hasher(ref_set.len(), S::default());

for value in ref_set.iter() {
let new_value = V::from_reflect(value)?;
new_set.insert(new_value);
}

Some(new_set)
}
}
};
Expand Down Expand Up @@ -1251,17 +1251,17 @@ where
V: FromReflect + MaybeTyped + TypePath + GetTypeRegistration,
{
fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self> {
if let ReflectRef::Map(ref_map) = reflect.reflect_ref() {
let mut new_map = Self::new();
for (key, value) in ref_map.iter() {
let new_key = K::from_reflect(key)?;
let new_value = V::from_reflect(value)?;
new_map.insert(new_key, new_value);
}
Some(new_map)
} else {
None
let ref_map = reflect.reflect_ref().as_map().ok()?;

let mut new_map = Self::new();

for (key, value) in ref_map.iter() {
let new_key = K::from_reflect(key)?;
let new_value = V::from_reflect(value)?;
new_map.insert(new_key, new_value);
}

Some(new_map)
}
}

Expand Down Expand Up @@ -1422,15 +1422,15 @@ impl<T: FromReflect + MaybeTyped + TypePath + GetTypeRegistration, const N: usiz
for [T; N]
{
fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self> {
if let ReflectRef::Array(ref_array) = reflect.reflect_ref() {
let mut temp_vec = Vec::with_capacity(ref_array.len());
for field in ref_array.iter() {
temp_vec.push(T::from_reflect(field)?);
}
temp_vec.try_into().ok()
} else {
None
let ref_array = reflect.reflect_ref().as_array().ok()?;

let mut temp_vec = Vec::with_capacity(ref_array.len());

for field in ref_array.iter() {
temp_vec.push(T::from_reflect(field)?);
}

temp_vec.try_into().ok()
}
}

Expand Down Expand Up @@ -1795,15 +1795,15 @@ impl<T: FromReflect + MaybeTyped + Clone + TypePath + GetTypeRegistration> FromR
for Cow<'static, [T]>
{
fn from_reflect(reflect: &dyn PartialReflect) -> Option<Self> {
if let ReflectRef::List(ref_list) = reflect.reflect_ref() {
let mut temp_vec = Vec::with_capacity(ref_list.len());
for field in ref_list.iter() {
temp_vec.push(T::from_reflect(field)?);
}
Some(temp_vec.into())
} else {
None
let ref_list = reflect.reflect_ref().as_list().ok()?;

let mut temp_vec = Vec::with_capacity(ref_list.len());

for field in ref_list.iter() {
temp_vec.push(T::from_reflect(field)?);
}

Some(temp_vec.into())
}
}

Expand Down
9 changes: 3 additions & 6 deletions crates/bevy_reflect/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -154,7 +154,7 @@
//! ```
//! # use bevy_reflect::{PartialReflect, ReflectRef};
//! let my_tuple: Box<dyn PartialReflect> = Box::new((1, 2, 3));
//! let ReflectRef::Tuple(my_tuple) = my_tuple.reflect_ref() else { unreachable!() };
//! let my_tuple = my_tuple.reflect_ref().as_tuple().unwrap();
//! assert_eq!(3, my_tuple.field_len());
//! ```
//!
Expand Down Expand Up @@ -768,11 +768,8 @@ mod tests {

// nested retrieval
let c = foo.field("c").unwrap();
if let ReflectRef::Struct(value) = c.reflect_ref() {
assert_eq!(*value.get_field::<u32>("x").unwrap(), 1);
} else {
panic!("Expected a struct.");
}
let value = c.reflect_ref().as_struct().unwrap();
assert_eq!(*value.get_field::<u32>("x").unwrap(), 1);

// patch Foo with a dynamic struct
let mut dynamic_struct = DynamicStruct::default();
Expand Down
Loading

0 comments on commit 7303200

Please sign in to comment.