Skip to content

Commit 361686a

Browse files
committed
bevy_reflect: Added PartialEq to reflected f32 & f64 (#4217)
# Objective Comparing two reflected floating points would always fail: ```rust let a: &dyn Reflect = &1.23_f32; let b: &dyn Reflect = &1.23_f32; // Panics: assert!(a.reflect_partial_eq(b).unwrap_or_default()); ``` The comparison returns `None` since `f32` (and `f64`) does not have a reflected `PartialEq` implementation. ## Solution Include `PartialEq` in the `impl_reflect_value!` macro call for both `f32` and `f64`. `Hash` is still excluded since neither implement `Hash`. Also added equality tests for some of the common types from `std` (including `f32`).
1 parent 3d36ec4 commit 361686a

File tree

1 file changed

+63
-2
lines changed
  • crates/bevy_reflect/src/impls

1 file changed

+63
-2
lines changed

crates/bevy_reflect/src/impls/std.rs

Lines changed: 63 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ impl_reflect_value!(i32(Hash, PartialEq, Serialize, Deserialize));
2828
impl_reflect_value!(i64(Hash, PartialEq, Serialize, Deserialize));
2929
impl_reflect_value!(i128(Hash, PartialEq, Serialize, Deserialize));
3030
impl_reflect_value!(isize(Hash, PartialEq, Serialize, Deserialize));
31-
impl_reflect_value!(f32(Serialize, Deserialize));
32-
impl_reflect_value!(f64(Serialize, Deserialize));
31+
impl_reflect_value!(f32(PartialEq, Serialize, Deserialize));
32+
impl_reflect_value!(f64(PartialEq, Serialize, Deserialize));
3333
impl_reflect_value!(String(Hash, PartialEq, Serialize, Deserialize));
3434
impl_reflect_value!(Option<T: Serialize + Clone + for<'de> Deserialize<'de> + Reflect + 'static>(Serialize, Deserialize));
3535
impl_reflect_value!(HashSet<T: Serialize + Hash + Eq + Clone + for<'de> Deserialize<'de> + Send + Sync + 'static>(Serialize, Deserialize));
@@ -392,9 +392,70 @@ impl FromReflect for Cow<'static, str> {
392392
#[cfg(test)]
393393
mod tests {
394394
use crate::Reflect;
395+
use bevy_utils::HashMap;
396+
use std::f32::consts::{PI, TAU};
395397

396398
#[test]
397399
fn can_serialize_duration() {
398400
assert!(std::time::Duration::ZERO.serializable().is_some());
399401
}
402+
403+
#[test]
404+
fn should_partial_eq_i32() {
405+
let a: &dyn Reflect = &123_i32;
406+
let b: &dyn Reflect = &123_i32;
407+
let c: &dyn Reflect = &321_i32;
408+
assert!(a.reflect_partial_eq(b).unwrap_or_default());
409+
assert!(!a.reflect_partial_eq(c).unwrap_or_default());
410+
}
411+
412+
#[test]
413+
fn should_partial_eq_f32() {
414+
let a: &dyn Reflect = &PI;
415+
let b: &dyn Reflect = &PI;
416+
let c: &dyn Reflect = &TAU;
417+
assert!(a.reflect_partial_eq(b).unwrap_or_default());
418+
assert!(!a.reflect_partial_eq(c).unwrap_or_default());
419+
}
420+
421+
#[test]
422+
fn should_partial_eq_string() {
423+
let a: &dyn Reflect = &String::from("Hello");
424+
let b: &dyn Reflect = &String::from("Hello");
425+
let c: &dyn Reflect = &String::from("World");
426+
assert!(a.reflect_partial_eq(b).unwrap_or_default());
427+
assert!(!a.reflect_partial_eq(c).unwrap_or_default());
428+
}
429+
430+
#[test]
431+
fn should_partial_eq_vec() {
432+
let a: &dyn Reflect = &vec![1, 2, 3];
433+
let b: &dyn Reflect = &vec![1, 2, 3];
434+
let c: &dyn Reflect = &vec![3, 2, 1];
435+
assert!(a.reflect_partial_eq(b).unwrap_or_default());
436+
assert!(!a.reflect_partial_eq(c).unwrap_or_default());
437+
}
438+
439+
#[test]
440+
fn should_partial_eq_hash_map() {
441+
let mut a = HashMap::new();
442+
a.insert(0usize, 1.23_f64);
443+
let b = a.clone();
444+
let mut c = HashMap::new();
445+
c.insert(0usize, 3.21_f64);
446+
447+
let a: &dyn Reflect = &a;
448+
let b: &dyn Reflect = &b;
449+
let c: &dyn Reflect = &c;
450+
assert!(a.reflect_partial_eq(b).unwrap_or_default());
451+
assert!(!a.reflect_partial_eq(c).unwrap_or_default());
452+
}
453+
454+
#[test]
455+
fn should_not_partial_eq_option() {
456+
// Option<T> does not contain a `PartialEq` implementation, so it should return `None`
457+
let a: &dyn Reflect = &Some(123);
458+
let b: &dyn Reflect = &Some(123);
459+
assert_eq!(None, a.reflect_partial_eq(b));
460+
}
400461
}

0 commit comments

Comments
 (0)