use crate::{ FullName, FullNameRef, Namespace, PartialName, PartialNameRef, Reference, bstr::{BStr, BString, ByteSlice}, file, packed, }; macro_rules! impl_partial_eq { ($left_type:ty, $right_type:ty, $left:ident => $left_bytes:expr, $right:ident => $right_bytes:expr) => { impl PartialEq<$right_type> for $left_type { fn eq(&self, other: &$right_type) -> bool { let $left = self; let $right = other; $left_bytes == $right_bytes } } }; } macro_rules! impl_partial_eq_pair { ($left_type:ty, $right_type:ty, $left:ident => $left_bytes:expr, $right:ident => $right_bytes:expr) => { impl_partial_eq!($left_type, $right_type, $left => $left_bytes, $right => $right_bytes); impl_partial_eq!($right_type, $left_type, $right => $right_bytes, $left => $left_bytes); }; } macro_rules! impl_partial_eq_bytes { ($type:ty, $value:ident => $bytes:expr) => { impl_partial_eq_pair!($type, str, $value => $bytes.as_bytes(), other => other.as_bytes()); impl_partial_eq_pair!($type, &str, $value => $bytes.as_bytes(), other => other.as_bytes()); impl_partial_eq_pair!($type, String, $value => $bytes.as_bytes(), other => other.as_bytes()); impl_partial_eq_pair!($type, BStr, $value => $bytes.as_bytes(), other => other.as_bytes()); impl_partial_eq_pair!($type, &BStr, $value => $bytes.as_bytes(), other => other.as_bytes()); impl_partial_eq_pair!($type, BString, $value => $bytes.as_bytes(), other => other.as_bytes()); }; } macro_rules! impl_partial_eq_reference { ($type:ty, $value:ident => $name:expr) => { impl_partial_eq!($type, str, $value => $name.as_bytes(), other => other.as_bytes()); impl_partial_eq!($type, &str, $value => $name.as_bytes(), other => other.as_bytes()); impl_partial_eq!($type, String, $value => $name.as_bytes(), other => other.as_bytes()); impl_partial_eq!($type, BStr, $value => $name.as_bytes(), other => other.as_bytes()); impl_partial_eq!($type, &BStr, $value => $name.as_bytes(), other => other.as_bytes()); impl_partial_eq!($type, BString, $value => $name.as_bytes(), other => other.as_bytes()); impl_partial_eq!( $type, FullName, $value => $name.as_bytes(), other => other.as_bstr().as_bytes() ); impl_partial_eq!( $type, FullNameRef, $value => $name.as_bytes(), other => other.as_bstr().as_bytes() ); impl_partial_eq!( $type, &FullNameRef, $value => $name.as_bytes(), other => other.as_bstr().as_bytes() ); }; } impl_partial_eq_bytes!(FullName, value => value.as_bstr()); impl_partial_eq_bytes!(FullNameRef, value => value.as_bstr()); impl_partial_eq_bytes!(PartialName, value => value.as_ref().as_bstr()); impl_partial_eq_bytes!(PartialNameRef, value => value.as_bstr()); impl_partial_eq_bytes!(Namespace, value => value.as_bstr()); impl_partial_eq_pair!( &FullNameRef, String, name => name.as_bstr().as_bytes(), text => text.as_bytes() ); impl_partial_eq_pair!( &FullNameRef, BString, name => name.as_bstr().as_bytes(), text => text.as_bytes() ); impl_partial_eq_pair!( &PartialNameRef, String, name => name.as_bstr().as_bytes(), text => text.as_bytes() ); impl_partial_eq_pair!( &PartialNameRef, BString, name => name.as_bstr().as_bytes(), text => text.as_bytes() ); impl_partial_eq_pair!( FullName, FullNameRef, owned => owned.as_bstr().as_bytes(), borrowed => borrowed.as_bstr().as_bytes() ); impl_partial_eq_pair!( FullName, &FullNameRef, owned => owned.as_bstr().as_bytes(), borrowed => borrowed.as_bstr().as_bytes() ); impl_partial_eq_pair!( PartialName, PartialNameRef, owned => owned.as_ref().as_bstr().as_bytes(), borrowed => borrowed.as_bstr().as_bytes() ); impl_partial_eq_pair!( PartialName, &PartialNameRef, owned => owned.as_ref().as_bstr().as_bytes(), borrowed => borrowed.as_bstr().as_bytes() ); // Keep these comparisons one-way: same-type reference equality is structural, so reverse // implementations would let references with different targets form a non-transitive chain through their name. impl_partial_eq_reference!(Reference, value => value.name.as_bstr()); impl_partial_eq_reference!(file::loose::Reference, value => value.name.as_bstr()); impl_partial_eq_reference!(packed::Reference<'_>, value => value.name.as_bstr());