Crates.io | dyn_partial_eq |
lib.rs | dyn_partial_eq |
version | 0.1.2 |
source | src |
created_at | 2021-05-15 23:45:12.777842 |
updated_at | 2021-05-16 06:37:17.588248 |
description | PartialEq macros for trait objects |
homepage | |
repository | https://github.com/AaronFriel/dyn_partial_eq |
max_upload_size | |
id | 398028 |
size | 16,567 |
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);