@@ -535,6 +535,58 @@ impl<T, const N: usize> Deque<T, N> {
535
535
done,
536
536
}
537
537
}
538
+
539
+ /// Returns a reference to the element at the given index.
540
+ ///
541
+ /// Index 0 is the front of the `Deque`.
542
+ pub fn get ( & self , index : usize ) -> Option < & T > {
543
+ if index < self . len ( ) {
544
+ let idx = self . to_physical_index ( index) ;
545
+ Some ( unsafe { self . buffer . get_unchecked ( idx) . assume_init_ref ( ) } )
546
+ } else {
547
+ None
548
+ }
549
+ }
550
+
551
+ /// Returns a mutable reference to the element at the given index.
552
+ ///
553
+ /// Index 0 is the front of the `Deque`.
554
+ pub fn get_mut ( & mut self , index : usize ) -> Option < & mut T > {
555
+ if index < self . len ( ) {
556
+ let idx = self . to_physical_index ( index) ;
557
+ Some ( unsafe { self . buffer . get_unchecked_mut ( idx) . assume_init_mut ( ) } )
558
+ } else {
559
+ None
560
+ }
561
+ }
562
+
563
+ /// Returns a reference to the element at the given index without checking if it exists.
564
+ ///
565
+ /// # Safety
566
+ ///
567
+ /// The element at the given `index` must exist (i.e. `index < self.len()`).
568
+ pub unsafe fn get_unchecked ( & self , index : usize ) -> & T {
569
+ debug_assert ! ( index < self . len( ) ) ;
570
+
571
+ let idx = self . to_physical_index ( index) ;
572
+ self . buffer . get_unchecked ( idx) . assume_init_ref ( )
573
+ }
574
+
575
+ /// Returns a mutable reference to the element at the given index without checking if it exists.
576
+ ///
577
+ /// # Safety
578
+ ///
579
+ /// The element at the given `index` must exist (i.e. `index < self.len()`).
580
+ pub unsafe fn get_unchecked_mut ( & mut self , index : usize ) -> & mut T {
581
+ debug_assert ! ( index < self . len( ) ) ;
582
+
583
+ let idx = self . to_physical_index ( index) ;
584
+ self . buffer . get_unchecked_mut ( idx) . assume_init_mut ( )
585
+ }
586
+
587
+ fn to_physical_index ( & self , index : usize ) -> usize {
588
+ self . front . wrapping_add ( index) % N
589
+ }
538
590
}
539
591
540
592
// Trait implementations
@@ -1099,4 +1151,31 @@ mod tests {
1099
1151
// Deque contains: 5, 6, 7, 8
1100
1152
assert_eq ! ( q. as_slices( ) , ( [ 5 , 6 , 7 , 8 ] . as_slice( ) , [ ] . as_slice( ) ) ) ;
1101
1153
}
1154
+
1155
+ #[ test]
1156
+ fn get ( ) {
1157
+ let mut q: Deque < i32 , 4 > = Deque :: new ( ) ;
1158
+ assert_eq ! ( q. get( 0 ) , None ) ;
1159
+
1160
+ q. push_back ( 0 ) . unwrap ( ) ;
1161
+ assert_eq ! ( q. get( 0 ) , Some ( & 0 ) ) ;
1162
+ assert_eq ! ( q. get( 1 ) , None ) ;
1163
+
1164
+ q. push_back ( 1 ) . unwrap ( ) ;
1165
+ assert_eq ! ( q. get( 0 ) , Some ( & 0 ) ) ;
1166
+ assert_eq ! ( q. get( 1 ) , Some ( & 1 ) ) ;
1167
+ assert_eq ! ( q. get( 2 ) , None ) ;
1168
+
1169
+ q. pop_front ( ) . unwrap ( ) ;
1170
+ assert_eq ! ( q. get( 0 ) , Some ( & 1 ) ) ;
1171
+ assert_eq ! ( q. get( 1 ) , None ) ;
1172
+
1173
+ q. push_back ( 2 ) . unwrap ( ) ;
1174
+ q. push_back ( 3 ) . unwrap ( ) ;
1175
+ q. push_back ( 4 ) . unwrap ( ) ;
1176
+ assert_eq ! ( q. get( 0 ) , Some ( & 1 ) ) ;
1177
+ assert_eq ! ( q. get( 1 ) , Some ( & 2 ) ) ;
1178
+ assert_eq ! ( q. get( 2 ) , Some ( & 3 ) ) ;
1179
+ assert_eq ! ( q. get( 3 ) , Some ( & 4 ) ) ;
1180
+ }
1102
1181
}
0 commit comments