#object #traits

dyn_partial_eq

PartialEq macros for trait objects

3 releases

0.1.2 May 16, 2021
0.1.1 May 15, 2021
0.1.0 May 15, 2021

#16 in #objects

Download history 401/week @ 2024-12-11 141/week @ 2024-12-18 98/week @ 2024-12-25 108/week @ 2025-01-01 301/week @ 2025-01-08 201/week @ 2025-01-15 567/week @ 2025-01-22 670/week @ 2025-01-29 370/week @ 2025-02-05 884/week @ 2025-02-12 1036/week @ 2025-02-19 1040/week @ 2025-02-26 670/week @ 2025-03-05 1043/week @ 2025-03-12 845/week @ 2025-03-19 672/week @ 2025-03-26

3,380 downloads per month
Used in 3 crates (2 directly)

MIT/Apache

7KB

dyn_partial_eq

PartialEq for trait objects

This crate provides macros for deriving PartialEq for Box<dyn Trait>, removing the boilerplate of having to provide your own implementations. Inspired by this blog post: https://dev.to/magnusstrale/rust-trait-objects-in-a-vector-non-trivial-4co5

Add the crate to your project:

cargo add dyn_partial_eq
use dyn_partial_eq::*;

// Use this to add a DynPartialEq supertrait and implement PartialEq for your trait.
#[dyn_partial_eq]
trait SomeTrait {}

// Derive DynPartialEq and PartialEq on your types that implement your trait.
#[derive(DynPartialEq, PartialEq)]
struct A(usize);
impl SomeTrait for A {}

#[derive(DynPartialEq, PartialEq)]
struct B((usize, usize));
impl SomeTrait for B {}

And voila:

let boxed_a_zero: Box<dyn SomeTrait> = Box::new(A(0));
let boxed_a_one: Box<dyn SomeTrait> = Box::new(A(1));
let boxed_b: Box<dyn SomeTrait> = Box::new(B((1, 2)));

assert_eq!(&boxed_a_zero == &boxed_a_zero, true);
assert_eq!(&boxed_a_zero == &boxed_a_one, false);
assert_eq!(&boxed_a_zero == &boxed_b, false);

assert_eq!(&boxed_a_one == &boxed_a_zero, false);
assert_eq!(&boxed_a_one == &boxed_a_one, true);
assert_eq!(&boxed_a_one == &boxed_b, false);

assert_eq!(&boxed_b == &boxed_a_zero, false);
assert_eq!(&boxed_b == &boxed_a_one, false);
assert_eq!(&boxed_b == &boxed_b, true);

Dependencies

~1.5MB
~38K SLoC