Skip to content

Commit a072685

Browse files
committed
Implemented PartialEq and Eq for the heapless Deque. This implementation was copied form the colloctions VecDeque.
1 parent 346525f commit a072685

File tree

1 file changed

+96
-0
lines changed

1 file changed

+96
-0
lines changed

src/deque.rs

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -950,6 +950,46 @@ where
950950
}
951951
}
952952

953+
impl<T: PartialEq, const N: usize> PartialEq for Deque<T, N> {
954+
fn eq(&self, other: &Self) -> bool {
955+
if self.len() != other.len() {
956+
return false;
957+
}
958+
let (sa, sb) = self.as_slices();
959+
let (oa, ob) = other.as_slices();
960+
if sa.len() == oa.len() {
961+
sa == oa && sb == ob
962+
} else if sa.len() < oa.len() {
963+
// Always divisible in three sections, for example:
964+
// self: [a b c|d e f]
965+
// other: [0 1 2 3|4 5]
966+
// front = 3, mid = 1,
967+
// [a b c] == [0 1 2] && [d] == [3] && [e f] == [4 5]
968+
let front = sa.len();
969+
let mid = oa.len() - front;
970+
971+
let (oa_front, oa_mid) = oa.split_at(front);
972+
let (sb_mid, sb_back) = sb.split_at(mid);
973+
debug_assert_eq!(sa.len(), oa_front.len());
974+
debug_assert_eq!(sb_mid.len(), oa_mid.len());
975+
debug_assert_eq!(sb_back.len(), ob.len());
976+
sa == oa_front && sb_mid == oa_mid && sb_back == ob
977+
} else {
978+
let front = oa.len();
979+
let mid = sa.len() - front;
980+
981+
let (sa_front, sa_mid) = sa.split_at(front);
982+
let (ob_mid, ob_back) = ob.split_at(mid);
983+
debug_assert_eq!(sa_front.len(), oa.len());
984+
debug_assert_eq!(sa_mid.len(), ob_mid.len());
985+
debug_assert_eq!(sb.len(), ob_back.len());
986+
sa_front == oa && sa_mid == ob_mid && sb == ob_back
987+
}
988+
}
989+
}
990+
991+
impl<T: Eq, const N: usize> Eq for Deque<T, N> {}
992+
953993
#[cfg(test)]
954994
mod tests {
955995
use static_assertions::assert_not_impl_any;
@@ -1440,4 +1480,60 @@ mod tests {
14401480
q.pop_front().unwrap();
14411481
q.swap(0, 2);
14421482
}
1483+
1484+
#[test]
1485+
fn equality() {
1486+
let mut a: Deque<i32, 7> = Deque::new();
1487+
let mut b: Deque<i32, 7> = Deque::new();
1488+
1489+
assert_eq!(a, b);
1490+
1491+
a.push_back(1).unwrap();
1492+
a.push_back(2).unwrap();
1493+
a.push_back(3).unwrap();
1494+
1495+
assert_ne!(a, b);
1496+
1497+
b.push_back(1).unwrap();
1498+
b.push_back(2).unwrap();
1499+
b.push_back(3).unwrap();
1500+
1501+
assert_eq!(a, b);
1502+
1503+
a.push_back(1).unwrap();
1504+
a.push_back(2).unwrap();
1505+
a.push_back(3).unwrap();
1506+
1507+
assert_ne!(a, b);
1508+
1509+
b.push_front(3).unwrap();
1510+
b.push_front(2).unwrap();
1511+
b.push_front(1).unwrap();
1512+
1513+
assert_eq!(a, b);
1514+
1515+
a.push_back(4).unwrap();
1516+
b.push_back(4).unwrap();
1517+
1518+
assert_eq!(a, b);
1519+
1520+
a.clear();
1521+
b.clear();
1522+
1523+
a.push_back(1).unwrap();
1524+
a.push_back(2).unwrap();
1525+
a.push_back(3).unwrap();
1526+
a.push_front(3).unwrap();
1527+
a.push_front(2).unwrap();
1528+
a.push_front(1).unwrap();
1529+
1530+
b.push_back(2).unwrap();
1531+
b.push_back(3).unwrap();
1532+
b.push_back(1).unwrap();
1533+
b.push_back(2).unwrap();
1534+
b.push_back(3).unwrap();
1535+
b.push_front(1).unwrap();
1536+
1537+
assert_eq!(a, b);
1538+
}
14431539
}

0 commit comments

Comments
 (0)