@@ -950,6 +950,46 @@ where
950
950
}
951
951
}
952
952
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
+
953
993
#[ cfg( test) ]
954
994
mod tests {
955
995
use static_assertions:: assert_not_impl_any;
@@ -1440,4 +1480,60 @@ mod tests {
1440
1480
q. pop_front ( ) . unwrap ( ) ;
1441
1481
q. swap ( 0 , 2 ) ;
1442
1482
}
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
+ }
1443
1539
}
0 commit comments