@@ -162,14 +162,14 @@ impl<T, const N: usize> Deque<T, N> {
162
162
163
163
/// Returns the maximum number of elements the deque can hold.
164
164
///
165
- /// This method is not available on a `DequeView`, use [`storage_len `](DequeInner::storage_capacity) instead
165
+ /// This method is not available on a `DequeView`, use [`storage_capacity `](DequeInner::storage_capacity) instead.
166
166
pub const fn capacity ( & self ) -> usize {
167
167
N
168
168
}
169
169
170
170
/// Returns the number of elements currently in the deque.
171
171
///
172
- /// This method is not available on a `DequeView`, use [`storage_len`](DequeInner::storage_len) instead
172
+ /// This method is not available on a `DequeView`, use [`storage_len`](DequeInner::storage_len) instead.
173
173
pub const fn len ( & self ) -> usize {
174
174
if self . full {
175
175
N
@@ -650,6 +650,7 @@ impl<T, S: Storage> DequeInner<T, S> {
650
650
self . full = true ;
651
651
}
652
652
}
653
+
653
654
/// Returns a reference to the element at the given index.
654
655
///
655
656
/// Index 0 is the front of the `Deque`.
@@ -706,6 +707,76 @@ impl<T, S: Storage> DequeInner<T, S> {
706
707
. assume_init_mut ( )
707
708
}
708
709
710
+ /// Swaps elements at indices `i` and `j`.
711
+ ///
712
+ /// # Panics
713
+ ///
714
+ /// Panics if either `i` or `j` are out of bounds.
715
+ pub fn swap ( & mut self , i : usize , j : usize ) {
716
+ let len = self . storage_len ( ) ;
717
+ assert ! ( i < len) ;
718
+ assert ! ( j < len) ;
719
+ unsafe { self . swap_unchecked ( i, j) }
720
+ }
721
+
722
+ /// Swaps elements at indices `i` and `j` without checking that they exist.
723
+ ///
724
+ /// # Safety
725
+ ///
726
+ /// Elements at indexes `i` and `j` must exist (i.e. `i < self.len()` and `j < self.len()`).
727
+ pub unsafe fn swap_unchecked ( & mut self , i : usize , j : usize ) {
728
+ debug_assert ! ( i < self . storage_len( ) ) ;
729
+ debug_assert ! ( j < self . storage_len( ) ) ;
730
+ let idx_i = self . to_physical_index ( i) ;
731
+ let idx_j = self . to_physical_index ( j) ;
732
+
733
+ let buffer = self . buffer . borrow_mut ( ) ;
734
+ let buffer_ptr = buffer. as_mut_ptr ( ) ;
735
+ let ptr_i = buffer_ptr. add ( idx_i) ;
736
+ let ptr_j = buffer_ptr. add ( idx_j) ;
737
+ ptr:: swap ( ptr_i, ptr_j) ;
738
+ }
739
+
740
+ /// Removes an element from anywhere in the deque and returns it, replacing it with the first
741
+ /// element.
742
+ ///
743
+ /// This does not preserve ordering, but is *O*(1).
744
+ ///
745
+ /// Returns `None` if `index` is out of bounds.
746
+ ///
747
+ /// Element at index 0 is the front of the queue.
748
+ pub fn swap_remove_front ( & mut self , index : usize ) -> Option < T > {
749
+ let len = self . storage_len ( ) ;
750
+ if len > 0 && index < len {
751
+ Some ( unsafe {
752
+ self . swap_unchecked ( index, 0 ) ;
753
+ self . pop_front_unchecked ( )
754
+ } )
755
+ } else {
756
+ None
757
+ }
758
+ }
759
+
760
+ /// Removes an element from anywhere in the deque and returns it, replacing it with the last
761
+ /// element.
762
+ ///
763
+ /// This does not preserve ordering, but is *O*(1).
764
+ ///
765
+ /// Returns `None` if `index` is out of bounds.
766
+ ///
767
+ /// Element at index 0 is the front of the queue.
768
+ pub fn swap_remove_back ( & mut self , index : usize ) -> Option < T > {
769
+ let len = self . storage_len ( ) ;
770
+ if len > 0 && index < len {
771
+ Some ( unsafe {
772
+ self . swap_unchecked ( index, len - 1 ) ;
773
+ self . pop_back_unchecked ( )
774
+ } )
775
+ } else {
776
+ None
777
+ }
778
+ }
779
+
709
780
fn to_physical_index ( & self , index : usize ) -> usize {
710
781
let mut res = self . front + index;
711
782
if res >= self . storage_capacity ( ) {
@@ -1283,4 +1354,90 @@ mod tests {
1283
1354
assert_eq ! ( q. pop_front( ) , Some ( 43 ) ) ;
1284
1355
assert_eq ! ( q. pop_front( ) , None ) ;
1285
1356
}
1357
+
1358
+ #[ test]
1359
+ fn swap ( ) {
1360
+ let mut q: Deque < i32 , 4 > = Deque :: new ( ) ;
1361
+ q. push_back ( 40 ) . unwrap ( ) ;
1362
+ q. push_back ( 41 ) . unwrap ( ) ;
1363
+ q. push_back ( 42 ) . unwrap ( ) ;
1364
+ q. pop_front ( ) . unwrap ( ) ;
1365
+ q. push_back ( 43 ) . unwrap ( ) ;
1366
+ assert_eq ! ( * q. get( 0 ) . unwrap( ) , 41 ) ;
1367
+ assert_eq ! ( * q. get( 1 ) . unwrap( ) , 42 ) ;
1368
+ assert_eq ! ( * q. get( 2 ) . unwrap( ) , 43 ) ;
1369
+
1370
+ q. swap ( 0 , 1 ) ;
1371
+ assert_eq ! ( * q. get( 0 ) . unwrap( ) , 42 ) ;
1372
+ assert_eq ! ( * q. get( 1 ) . unwrap( ) , 41 ) ;
1373
+ assert_eq ! ( * q. get( 2 ) . unwrap( ) , 43 ) ;
1374
+
1375
+ q. swap ( 1 , 2 ) ;
1376
+ assert_eq ! ( * q. get( 0 ) . unwrap( ) , 42 ) ;
1377
+ assert_eq ! ( * q. get( 1 ) . unwrap( ) , 43 ) ;
1378
+ assert_eq ! ( * q. get( 2 ) . unwrap( ) , 41 ) ;
1379
+
1380
+ q. swap ( 1 , 1 ) ;
1381
+ assert_eq ! ( * q. get( 0 ) . unwrap( ) , 42 ) ;
1382
+ assert_eq ! ( * q. get( 1 ) . unwrap( ) , 43 ) ;
1383
+ assert_eq ! ( * q. get( 2 ) . unwrap( ) , 41 ) ;
1384
+ }
1385
+
1386
+ #[ test]
1387
+ fn swap_remove_front ( ) {
1388
+ let mut q: Deque < i32 , 4 > = Deque :: new ( ) ;
1389
+ q. push_back ( 40 ) . unwrap ( ) ;
1390
+ q. push_back ( 41 ) . unwrap ( ) ;
1391
+ q. push_back ( 42 ) . unwrap ( ) ;
1392
+ q. push_back ( 43 ) . unwrap ( ) ;
1393
+
1394
+ assert_eq ! ( q. swap_remove_front( 2 ) , Some ( 42 ) ) ;
1395
+ assert_eq ! ( q. swap_remove_front( 1 ) , Some ( 40 ) ) ;
1396
+ assert_eq ! ( q. swap_remove_front( 0 ) , Some ( 41 ) ) ;
1397
+ assert_eq ! ( q. swap_remove_front( 1 ) , None ) ;
1398
+ assert_eq ! ( q. swap_remove_front( 4 ) , None ) ;
1399
+ assert_eq ! ( q. swap_remove_front( 6 ) , None ) ;
1400
+ assert_eq ! ( q. swap_remove_front( 0 ) , Some ( 43 ) ) ;
1401
+ }
1402
+
1403
+ #[ test]
1404
+ fn swap_remove_back ( ) {
1405
+ let mut q: Deque < i32 , 4 > = Deque :: new ( ) ;
1406
+ q. push_back ( 40 ) . unwrap ( ) ;
1407
+ q. push_back ( 41 ) . unwrap ( ) ;
1408
+ q. push_back ( 42 ) . unwrap ( ) ;
1409
+ q. push_back ( 43 ) . unwrap ( ) ;
1410
+ q. pop_front ( ) . unwrap ( ) ;
1411
+ q. push_back ( 44 ) . unwrap ( ) ;
1412
+
1413
+ assert_eq ! ( q. swap_remove_back( 1 ) , Some ( 42 ) ) ;
1414
+ assert_eq ! ( q. swap_remove_front( 1 ) , Some ( 44 ) ) ;
1415
+ assert_eq ! ( q. swap_remove_front( 0 ) , Some ( 41 ) ) ;
1416
+ assert_eq ! ( q. swap_remove_front( 1 ) , None ) ;
1417
+ assert_eq ! ( q. swap_remove_front( 4 ) , None ) ;
1418
+ assert_eq ! ( q. swap_remove_front( 6 ) , None ) ;
1419
+ assert_eq ! ( q. swap_remove_front( 0 ) , Some ( 43 ) ) ;
1420
+ }
1421
+
1422
+ #[ test]
1423
+ #[ should_panic = "i < len" ]
1424
+ fn swap_i_out_of_bounds ( ) {
1425
+ let mut q: Deque < i32 , 4 > = Deque :: new ( ) ;
1426
+ q. push_back ( 40 ) . unwrap ( ) ;
1427
+ q. push_back ( 41 ) . unwrap ( ) ;
1428
+ q. push_back ( 42 ) . unwrap ( ) ;
1429
+ q. pop_front ( ) . unwrap ( ) ;
1430
+ q. swap ( 2 , 0 ) ;
1431
+ }
1432
+
1433
+ #[ test]
1434
+ #[ should_panic = "j < len" ]
1435
+ fn swap_j_out_of_bounds ( ) {
1436
+ let mut q: Deque < i32 , 4 > = Deque :: new ( ) ;
1437
+ q. push_back ( 40 ) . unwrap ( ) ;
1438
+ q. push_back ( 41 ) . unwrap ( ) ;
1439
+ q. push_back ( 42 ) . unwrap ( ) ;
1440
+ q. pop_front ( ) . unwrap ( ) ;
1441
+ q. swap ( 0 , 2 ) ;
1442
+ }
1286
1443
}
0 commit comments