|
34 | 34 | //! ```
|
35 | 35 |
|
36 | 36 | use core::borrow::{Borrow, BorrowMut};
|
| 37 | +use core::cmp::Ordering; |
37 | 38 | use core::fmt;
|
38 | 39 | use core::iter::FusedIterator;
|
39 | 40 | use core::mem::MaybeUninit;
|
@@ -950,6 +951,48 @@ where
|
950 | 951 | }
|
951 | 952 | }
|
952 | 953 |
|
| 954 | +impl<T: PartialEq, const N: usize> PartialEq for Deque<T, N> { |
| 955 | + fn eq(&self, other: &Self) -> bool { |
| 956 | + if self.len() != other.len() { |
| 957 | + return false; |
| 958 | + } |
| 959 | + let (sa, sb) = self.as_slices(); |
| 960 | + let (oa, ob) = other.as_slices(); |
| 961 | + match sa.len().cmp(&oa.len()) { |
| 962 | + Ordering::Equal => sa == oa && sb == ob, |
| 963 | + Ordering::Less => { |
| 964 | + // Always divisible in three sections, for example: |
| 965 | + // self: [a b c|d e f] |
| 966 | + // other: [0 1 2 3|4 5] |
| 967 | + // front = 3, mid = 1, |
| 968 | + // [a b c] == [0 1 2] && [d] == [3] && [e f] == [4 5] |
| 969 | + let front = sa.len(); |
| 970 | + let mid = oa.len() - front; |
| 971 | + |
| 972 | + let (oa_front, oa_mid) = oa.split_at(front); |
| 973 | + let (sb_mid, sb_back) = sb.split_at(mid); |
| 974 | + debug_assert_eq!(sa.len(), oa_front.len()); |
| 975 | + debug_assert_eq!(sb_mid.len(), oa_mid.len()); |
| 976 | + debug_assert_eq!(sb_back.len(), ob.len()); |
| 977 | + sa == oa_front && sb_mid == oa_mid && sb_back == ob |
| 978 | + } |
| 979 | + Ordering::Greater => { |
| 980 | + let front = oa.len(); |
| 981 | + let mid = sa.len() - front; |
| 982 | + |
| 983 | + let (sa_front, sa_mid) = sa.split_at(front); |
| 984 | + let (ob_mid, ob_back) = ob.split_at(mid); |
| 985 | + debug_assert_eq!(sa_front.len(), oa.len()); |
| 986 | + debug_assert_eq!(sa_mid.len(), ob_mid.len()); |
| 987 | + debug_assert_eq!(sb.len(), ob_back.len()); |
| 988 | + sa_front == oa && sa_mid == ob_mid && sb == ob_back |
| 989 | + } |
| 990 | + } |
| 991 | + } |
| 992 | +} |
| 993 | + |
| 994 | +impl<T: Eq, const N: usize> Eq for Deque<T, N> {} |
| 995 | + |
953 | 996 | #[cfg(test)]
|
954 | 997 | mod tests {
|
955 | 998 | use static_assertions::assert_not_impl_any;
|
@@ -1440,4 +1483,60 @@ mod tests {
|
1440 | 1483 | q.pop_front().unwrap();
|
1441 | 1484 | q.swap(0, 2);
|
1442 | 1485 | }
|
| 1486 | + |
| 1487 | + #[test] |
| 1488 | + fn equality() { |
| 1489 | + let mut a: Deque<i32, 7> = Deque::new(); |
| 1490 | + let mut b: Deque<i32, 7> = Deque::new(); |
| 1491 | + |
| 1492 | + assert_eq!(a, b); |
| 1493 | + |
| 1494 | + a.push_back(1).unwrap(); |
| 1495 | + a.push_back(2).unwrap(); |
| 1496 | + a.push_back(3).unwrap(); |
| 1497 | + |
| 1498 | + assert_ne!(a, b); |
| 1499 | + |
| 1500 | + b.push_back(1).unwrap(); |
| 1501 | + b.push_back(2).unwrap(); |
| 1502 | + b.push_back(3).unwrap(); |
| 1503 | + |
| 1504 | + assert_eq!(a, b); |
| 1505 | + |
| 1506 | + a.push_back(1).unwrap(); |
| 1507 | + a.push_back(2).unwrap(); |
| 1508 | + a.push_back(3).unwrap(); |
| 1509 | + |
| 1510 | + assert_ne!(a, b); |
| 1511 | + |
| 1512 | + b.push_front(3).unwrap(); |
| 1513 | + b.push_front(2).unwrap(); |
| 1514 | + b.push_front(1).unwrap(); |
| 1515 | + |
| 1516 | + assert_eq!(a, b); |
| 1517 | + |
| 1518 | + a.push_back(4).unwrap(); |
| 1519 | + b.push_back(4).unwrap(); |
| 1520 | + |
| 1521 | + assert_eq!(a, b); |
| 1522 | + |
| 1523 | + a.clear(); |
| 1524 | + b.clear(); |
| 1525 | + |
| 1526 | + a.push_back(1).unwrap(); |
| 1527 | + a.push_back(2).unwrap(); |
| 1528 | + a.push_back(3).unwrap(); |
| 1529 | + a.push_front(3).unwrap(); |
| 1530 | + a.push_front(2).unwrap(); |
| 1531 | + a.push_front(1).unwrap(); |
| 1532 | + |
| 1533 | + b.push_back(2).unwrap(); |
| 1534 | + b.push_back(3).unwrap(); |
| 1535 | + b.push_back(1).unwrap(); |
| 1536 | + b.push_back(2).unwrap(); |
| 1537 | + b.push_back(3).unwrap(); |
| 1538 | + b.push_front(1).unwrap(); |
| 1539 | + |
| 1540 | + assert_eq!(a, b); |
| 1541 | + } |
1443 | 1542 | }
|
0 commit comments