bump_scope/
partial_eq.rs

1use crate::{
2    BumpAllocatorExt, BumpString, BumpVec, FixedBumpVec, MutBumpAllocatorExt, MutBumpString, MutBumpVec, MutBumpVecRev,
3};
4
5macro_rules! impl_slice_eq {
6    ([$($vars:tt)*] $lhs:ty, $rhs:ty $(where $ty:ty: $bound:ident)?) => {
7        impl<T, U, $($vars)*> PartialEq<$rhs> for $lhs
8        where
9            T: PartialEq<U>,
10            $($ty: $bound)?
11        {
12            #[inline]
13            fn eq(&self, other: &$rhs) -> bool { self[..] == other[..] }
14            #[inline]
15            fn ne(&self, other: &$rhs) -> bool { self[..] != other[..] }
16        }
17    }
18}
19
20impl_slice_eq! { [] FixedBumpVec<'_, T>, FixedBumpVec<'_, U> }
21impl_slice_eq! { [] FixedBumpVec<'_, T>, [U] }
22impl_slice_eq! { [] FixedBumpVec<'_, T>, &[U] }
23impl_slice_eq! { [] FixedBumpVec<'_, T>, &mut [U] }
24impl_slice_eq! { [] [T], FixedBumpVec<'_, U> }
25impl_slice_eq! { [] &[T], FixedBumpVec<'_, U> }
26impl_slice_eq! { [] &mut [T], FixedBumpVec<'_, U> }
27impl_slice_eq! { [const N: usize] FixedBumpVec<'_, T>, [U; N] }
28impl_slice_eq! { [const N: usize] FixedBumpVec<'_, T>, &[U; N] }
29impl_slice_eq! { [const N: usize] FixedBumpVec<'_, T>, &mut [U; N] }
30
31impl_slice_eq! { [A1: BumpAllocatorExt, A2: BumpAllocatorExt] BumpVec<T, A1>, BumpVec<U, A2> }
32impl_slice_eq! { [A: BumpAllocatorExt] BumpVec<T, A>, [U] }
33impl_slice_eq! { [A: BumpAllocatorExt] BumpVec<T, A>, &[U] }
34impl_slice_eq! { [A: BumpAllocatorExt] BumpVec<T, A>, &mut [U] }
35impl_slice_eq! { [A: BumpAllocatorExt] [T], BumpVec<U, A> }
36impl_slice_eq! { [A: BumpAllocatorExt] &[T], BumpVec<U, A> }
37impl_slice_eq! { [A: BumpAllocatorExt] &mut [T], BumpVec<U, A> }
38impl_slice_eq! { [A: BumpAllocatorExt, const N: usize] BumpVec<T, A>, [U; N] }
39impl_slice_eq! { [A: BumpAllocatorExt, const N: usize] BumpVec<T, A>, &[U; N] }
40impl_slice_eq! { [A: BumpAllocatorExt, const N: usize] BumpVec<T, A>, &mut [U; N] }
41
42impl_slice_eq! { [A1: MutBumpAllocatorExt, A2: MutBumpAllocatorExt] MutBumpVec<T, A1>, MutBumpVec<U, A2> }
43impl_slice_eq! { [A: MutBumpAllocatorExt] MutBumpVec<T, A>, [U] }
44impl_slice_eq! { [A: MutBumpAllocatorExt] MutBumpVec<T, A>, &[U] }
45impl_slice_eq! { [A: MutBumpAllocatorExt] MutBumpVec<T, A>, &mut [U] }
46impl_slice_eq! { [A: MutBumpAllocatorExt] [T], MutBumpVec<U, A> }
47impl_slice_eq! { [A: MutBumpAllocatorExt] &[T], MutBumpVec<U, A> }
48impl_slice_eq! { [A: MutBumpAllocatorExt] &mut [T], MutBumpVec<U, A> }
49impl_slice_eq! { [A: MutBumpAllocatorExt, const N: usize] MutBumpVec<T, A>, [U; N] }
50impl_slice_eq! { [A: MutBumpAllocatorExt, const N: usize] MutBumpVec<T, A>, &[U; N] }
51impl_slice_eq! { [A: MutBumpAllocatorExt, const N: usize] MutBumpVec<T, A>, &mut [U; N] }
52
53impl_slice_eq! { [A1: MutBumpAllocatorExt, A2: MutBumpAllocatorExt] MutBumpVecRev<T, A1>, MutBumpVecRev<U, A2> }
54impl_slice_eq! { [A: MutBumpAllocatorExt] MutBumpVecRev<T, A>, [U] }
55impl_slice_eq! { [A: MutBumpAllocatorExt] MutBumpVecRev<T, A>, &[U] }
56impl_slice_eq! { [A: MutBumpAllocatorExt] MutBumpVecRev<T, A>, &mut [U] }
57impl_slice_eq! { [A: MutBumpAllocatorExt] [T], MutBumpVecRev<U, A> }
58impl_slice_eq! { [A: MutBumpAllocatorExt] &[T], MutBumpVecRev<U, A> }
59impl_slice_eq! { [A: MutBumpAllocatorExt] &mut [T], MutBumpVecRev<U, A> }
60impl_slice_eq! { [A: MutBumpAllocatorExt, const N: usize] MutBumpVecRev<T, A>, [U; N] }
61impl_slice_eq! { [A: MutBumpAllocatorExt, const N: usize] MutBumpVecRev<T, A>, &[U; N] }
62impl_slice_eq! { [A: MutBumpAllocatorExt, const N: usize] MutBumpVecRev<T, A>, &mut [U; N] }
63
64macro_rules! impl_str_eq {
65    ([$($vars:tt)*] $lhs:ty, $rhs:ty $(where $ty:ty: $bound:ident)?) => {
66        impl<$($vars)*> PartialEq<$rhs> for $lhs
67        where
68            $($ty: $bound)?
69        {
70            #[inline]
71            fn eq(&self, other: &$rhs) -> bool { &self[..] == &other[..] }
72            #[inline]
73            fn ne(&self, other: &$rhs) -> bool { &self[..] != &other[..] }
74        }
75    }
76}
77
78impl_str_eq! { [A1: BumpAllocatorExt, A2: BumpAllocatorExt] BumpString<A1>, BumpString<A2> }
79impl_str_eq! { [A: BumpAllocatorExt] BumpString<A>, str }
80impl_str_eq! { [A: BumpAllocatorExt] BumpString<A>, &str }
81impl_str_eq! { [A: BumpAllocatorExt] BumpString<A>, &mut str }
82impl_str_eq! { [A: BumpAllocatorExt] str, BumpString<A> }
83impl_str_eq! { [A: BumpAllocatorExt] &str, BumpString<A> }
84impl_str_eq! { [A: BumpAllocatorExt] &mut str, BumpString<A> }
85
86impl_str_eq! { [A1, A2] MutBumpString<A1>, MutBumpString<A2> }
87impl_str_eq! { [A] MutBumpString<A>, str }
88impl_str_eq! { [A] MutBumpString<A>, &str }
89impl_str_eq! { [A] MutBumpString<A>, &mut str }
90impl_str_eq! { [A] str, MutBumpString<A> }
91impl_str_eq! { [A] &str, MutBumpString<A> }
92impl_str_eq! { [A] &mut str, MutBumpString<A> }
93
94#[cfg(feature = "alloc")]
95mod alloc_impl {
96    use super::*;
97
98    use alloc_crate::{borrow::Cow, string::String};
99
100    impl_str_eq! { [A: BumpAllocatorExt] BumpString<A>, String }
101    impl_str_eq! { [A: BumpAllocatorExt] String, BumpString<A> }
102    impl_str_eq! { [A: BumpAllocatorExt] BumpString<A>, Cow<'_, str> }
103    impl_str_eq! { [A: BumpAllocatorExt] Cow<'_, str>, BumpString<A> }
104
105    impl_str_eq! { [A] MutBumpString<A>, String }
106    impl_str_eq! { [A] String, MutBumpString<A> }
107    impl_str_eq! { [A] MutBumpString<A>, Cow<'_, str> }
108    impl_str_eq! { [A] Cow<'_, str>, MutBumpString<A> }
109}