@@ -535,6 +535,62 @@ 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
+ let mut res = self . front + index;
589
+ if res >= N {
590
+ res -= N ;
591
+ }
592
+ res
593
+ }
538
594
}
539
595
540
596
// Trait implementations
@@ -1099,4 +1155,52 @@ mod tests {
1099
1155
// Deque contains: 5, 6, 7, 8
1100
1156
assert_eq ! ( q. as_slices( ) , ( [ 5 , 6 , 7 , 8 ] . as_slice( ) , [ ] . as_slice( ) ) ) ;
1101
1157
}
1158
+
1159
+ #[ test]
1160
+ fn get ( ) {
1161
+ let mut q: Deque < i32 , 4 > = Deque :: new ( ) ;
1162
+ assert_eq ! ( q. get( 0 ) , None ) ;
1163
+
1164
+ q. push_back ( 0 ) . unwrap ( ) ;
1165
+ assert_eq ! ( q. get( 0 ) , Some ( & 0 ) ) ;
1166
+ assert_eq ! ( q. get( 1 ) , None ) ;
1167
+
1168
+ q. push_back ( 1 ) . unwrap ( ) ;
1169
+ assert_eq ! ( q. get( 0 ) , Some ( & 0 ) ) ;
1170
+ assert_eq ! ( q. get( 1 ) , Some ( & 1 ) ) ;
1171
+ assert_eq ! ( q. get( 2 ) , None ) ;
1172
+
1173
+ q. pop_front ( ) . unwrap ( ) ;
1174
+ assert_eq ! ( q. get( 0 ) , Some ( & 1 ) ) ;
1175
+ assert_eq ! ( q. get( 1 ) , None ) ;
1176
+
1177
+ q. push_back ( 2 ) . unwrap ( ) ;
1178
+ q. push_back ( 3 ) . unwrap ( ) ;
1179
+ q. push_back ( 4 ) . unwrap ( ) ;
1180
+ assert_eq ! ( q. get( 0 ) , Some ( & 1 ) ) ;
1181
+ assert_eq ! ( q. get( 1 ) , Some ( & 2 ) ) ;
1182
+ assert_eq ! ( q. get( 2 ) , Some ( & 3 ) ) ;
1183
+ assert_eq ! ( q. get( 3 ) , Some ( & 4 ) ) ;
1184
+ }
1185
+
1186
+ #[ test]
1187
+ fn get_mut ( ) {
1188
+ let mut q: Deque < i32 , 4 > = Deque :: new ( ) ;
1189
+ assert_eq ! ( q. get( 0 ) , None ) ;
1190
+
1191
+ q. push_back ( 0 ) . unwrap ( ) ;
1192
+ assert_eq ! ( q. get_mut( 0 ) , Some ( & mut 0 ) ) ;
1193
+ assert_eq ! ( q. get_mut( 1 ) , None ) ;
1194
+
1195
+ q. push_back ( 1 ) . unwrap ( ) ;
1196
+ assert_eq ! ( q. get_mut( 0 ) , Some ( & mut 0 ) ) ;
1197
+ assert_eq ! ( q. get_mut( 1 ) , Some ( & mut 1 ) ) ;
1198
+ assert_eq ! ( q. get_mut( 2 ) , None ) ;
1199
+ * q. get_mut ( 0 ) . unwrap ( ) = 42 ;
1200
+ * q. get_mut ( 1 ) . unwrap ( ) = 43 ;
1201
+
1202
+ assert_eq ! ( q. pop_front( ) , Some ( 42 ) ) ;
1203
+ assert_eq ! ( q. pop_front( ) , Some ( 43 ) ) ;
1204
+ assert_eq ! ( q. pop_front( ) , None ) ;
1205
+ }
1102
1206
}
0 commit comments