Skip to content

Commit fc60282

Browse files
sollyuckodtolnay
authored andcommitted
impl PartialEq<Vec<B>> for &[A], &mut [A]
1 parent 63b441a commit fc60282

File tree

2 files changed

+59
-0
lines changed

2 files changed

+59
-0
lines changed

src/liballoc/tests/vec.rs

+54
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::borrow::Cow;
22
use std::collections::TryReserveError::*;
3+
use std::fmt::Debug;
34
use std::mem::size_of;
45
use std::panic::{catch_unwind, AssertUnwindSafe};
56
use std::vec::{Drain, IntoIter};
@@ -1588,3 +1589,56 @@ fn test_push_growth_strategy() {
15881589
}
15891590
}
15901591
}
1592+
1593+
macro_rules! generate_assert_eq_vec_and_prim {
1594+
($name:ident<$B:ident>($type:ty)) => {
1595+
fn $name<A: PartialEq<$B> + Debug, $B: Debug>(a: Vec<A>, b: $type) {
1596+
assert!(a == b);
1597+
assert_eq!(a, b);
1598+
}
1599+
};
1600+
}
1601+
1602+
generate_assert_eq_vec_and_prim! { assert_eq_vec_and_slice <B>(&[B]) }
1603+
generate_assert_eq_vec_and_prim! { assert_eq_vec_and_array_3<B>([B; 3]) }
1604+
1605+
#[test]
1606+
fn partialeq_vec_and_prim() {
1607+
assert_eq_vec_and_slice(vec![1, 2, 3], &[1, 2, 3]);
1608+
assert_eq_vec_and_array_3(vec![1, 2, 3], [1, 2, 3]);
1609+
}
1610+
1611+
macro_rules! assert_partial_eq_valid {
1612+
($a2:ident, $a3:ident; $b2:ident, $b3: ident) => {
1613+
assert!($a2 == $b2);
1614+
assert!($a2 != $b3);
1615+
assert!($a3 != $b2);
1616+
assert!($a3 == $b3);
1617+
assert_eq!($a2, $b2);
1618+
assert_ne!($a2, $b3);
1619+
assert_ne!($a3, $b2);
1620+
assert_eq!($a3, $b3);
1621+
};
1622+
}
1623+
1624+
#[test]
1625+
fn partialeq_vec_full() {
1626+
let vec2: Vec<_> = vec![1, 2];
1627+
let vec3: Vec<_> = vec![1, 2, 3];
1628+
let slice2: &[_] = &[1, 2];
1629+
let slice3: &[_] = &[1, 2, 3];
1630+
let slicemut2: &[_] = &mut [1, 2];
1631+
let slicemut3: &[_] = &mut [1, 2, 3];
1632+
let array2: [_; 2] = [1, 2];
1633+
let array3: [_; 3] = [1, 2, 3];
1634+
let arrayref2: &[_; 2] = &[1, 2];
1635+
let arrayref3: &[_; 3] = &[1, 2, 3];
1636+
1637+
assert_partial_eq_valid!(vec2,vec3; vec2,vec3);
1638+
assert_partial_eq_valid!(vec2,vec3; slice2,slice3);
1639+
assert_partial_eq_valid!(vec2,vec3; slicemut2,slicemut3);
1640+
assert_partial_eq_valid!(slice2,slice3; vec2,vec3);
1641+
assert_partial_eq_valid!(slicemut2,slicemut3; vec2,vec3);
1642+
assert_partial_eq_valid!(vec2,vec3; array2,array3);
1643+
assert_partial_eq_valid!(vec2,vec3; arrayref2,arrayref3);
1644+
}

src/liballoc/vec.rs

+5
Original file line numberDiff line numberDiff line change
@@ -2362,6 +2362,8 @@ macro_rules! __impl_slice_eq1 {
23622362
__impl_slice_eq1! { [] Vec<A>, Vec<B>, }
23632363
__impl_slice_eq1! { [] Vec<A>, &[B], }
23642364
__impl_slice_eq1! { [] Vec<A>, &mut [B], }
2365+
__impl_slice_eq1! { [] &[A], Vec<B>, }
2366+
__impl_slice_eq1! { [] &mut [A], Vec<B>, }
23652367
__impl_slice_eq1! { [] Cow<'_, [A]>, Vec<B>, A: Clone }
23662368
__impl_slice_eq1! { [] Cow<'_, [A]>, &[B], A: Clone }
23672369
__impl_slice_eq1! { [] Cow<'_, [A]>, &mut [B], A: Clone }
@@ -2371,6 +2373,9 @@ __impl_slice_eq1! { [const N: usize] Vec<A>, &[B; N], [B; N]: LengthAtMost32 }
23712373
// NOTE: some less important impls are omitted to reduce code bloat
23722374
// FIXME(Centril): Reconsider this?
23732375
//__impl_slice_eq1! { [const N: usize] Vec<A>, &mut [B; N], [B; N]: LengthAtMost32 }
2376+
//__impl_slice_eq1! { [const N: usize] [A; N], Vec<B>, [A; N]: LengthAtMost32 }
2377+
//__impl_slice_eq1! { [const N: usize] &[A; N], Vec<B>, [A; N]: LengthAtMost32 }
2378+
//__impl_slice_eq1! { [const N: usize] &mut [A; N], Vec<B>, [A; N]: LengthAtMost32 }
23742379
//__impl_slice_eq1! { [const N: usize] Cow<'a, [A]>, [B; N], [B; N]: LengthAtMost32 }
23752380
//__impl_slice_eq1! { [const N: usize] Cow<'a, [A]>, &[B; N], [B; N]: LengthAtMost32 }
23762381
//__impl_slice_eq1! { [const N: usize] Cow<'a, [A]>, &mut [B; N], [B; N]: LengthAtMost32 }

0 commit comments

Comments
 (0)