Skip to content

Commit 2e71c18

Browse files
authored
Merge pull request #521 from dysonltd/impl_eq_for_Deque
Implements PartialEq and Eq for Deque
2 parents 346525f + fc75aed commit 2e71c18

File tree

2 files changed

+100
-0
lines changed

2 files changed

+100
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
4040
- Added implementation of `Borrow` and `BorrowMut` for `String` and `Vec`.
4141
- Added `Deque::{swap, swap_unchecked, swap_remove_front, swap_remove_back}`.
4242
- Make `String::from_utf8_unchecked` const.
43+
- Implemented `PartialEq` and `Eq` for `Deque`.
4344

4445
### Changed
4546

src/deque.rs

Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@
3434
//! ```
3535
3636
use core::borrow::{Borrow, BorrowMut};
37+
use core::cmp::Ordering;
3738
use core::fmt;
3839
use core::iter::FusedIterator;
3940
use core::mem::MaybeUninit;
@@ -950,6 +951,48 @@ where
950951
}
951952
}
952953

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+
953996
#[cfg(test)]
954997
mod tests {
955998
use static_assertions::assert_not_impl_any;
@@ -1440,4 +1483,60 @@ mod tests {
14401483
q.pop_front().unwrap();
14411484
q.swap(0, 2);
14421485
}
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+
}
14431542
}

0 commit comments

Comments
 (0)