@@ -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) ]
954994mod 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