@@ -33,7 +33,9 @@ pub use with_const_generics::ConstGenericRingBuffer;
3333
3434/// Used internally. Computes the bitmask used to properly wrap the ringbuffers.
3535#[ inline]
36- const fn mask ( cap : usize , index : usize ) -> usize {
36+ #[ cfg( feature = "alloc" ) ]
37+ const fn mask_and ( cap : usize , index : usize ) -> usize {
38+ debug_assert ! ( cap. is_power_of_two( ) ) ;
3739 index & ( cap - 1 )
3840}
3941
@@ -63,7 +65,7 @@ mod tests {
6365 fn test_neg_index ( mut b : impl RingBuffer < usize > ) {
6466 for i in 0 ..capacity + 2 {
6567 b. push ( i) ;
66- assert_eq ! ( b. get ( -1 ) , Some ( & i) ) ;
68+ assert_eq ! ( b. get_signed ( -1 ) , Some ( & i) ) ;
6769 }
6870 }
6971
@@ -215,6 +217,60 @@ mod tests {
215217 test_iter ( ConstGenericRingBuffer :: < i32 , 8 > :: new ( ) ) ;
216218 }
217219
220+ #[ test]
221+ fn run_test_forward_iter_non_power_of_two ( ) {
222+ fn test_iter ( mut b : impl RingBuffer < i32 > ) {
223+ b. push ( 1 ) ;
224+ b. push ( 2 ) ;
225+ b. push ( 3 ) ;
226+ b. push ( 4 ) ;
227+ b. push ( 5 ) ;
228+ b. push ( 6 ) ;
229+ b. push ( 7 ) ;
230+
231+ let mut iter = b. iter ( ) ;
232+ assert_eq ! ( & 1 , iter. next( ) . unwrap( ) ) ;
233+ assert_eq ! ( & 2 , iter. next( ) . unwrap( ) ) ;
234+ assert_eq ! ( & 3 , iter. next( ) . unwrap( ) ) ;
235+ assert_eq ! ( & 4 , iter. next( ) . unwrap( ) ) ;
236+ assert_eq ! ( & 5 , iter. next( ) . unwrap( ) ) ;
237+ assert_eq ! ( & 6 , iter. next( ) . unwrap( ) ) ;
238+ assert_eq ! ( & 7 , iter. next( ) . unwrap( ) ) ;
239+ assert_eq ! ( None , iter. next( ) ) ;
240+ }
241+
242+ test_iter ( AllocRingBuffer :: new ( 7 ) ) ;
243+ test_iter ( GrowableAllocRingBuffer :: with_capacity ( 7 ) ) ;
244+ test_iter ( ConstGenericRingBuffer :: < i32 , 7 > :: new ( ) ) ;
245+ }
246+
247+ #[ test]
248+ fn run_test_iter_non_power_of_two ( ) {
249+ fn test_iter ( mut b : impl RingBuffer < i32 > ) {
250+ b. push ( 1 ) ;
251+ b. push ( 2 ) ;
252+ b. push ( 3 ) ;
253+ b. push ( 4 ) ;
254+ b. push ( 5 ) ;
255+ b. push ( 6 ) ;
256+ b. push ( 7 ) ;
257+
258+ let mut iter = b. iter ( ) ;
259+ assert_eq ! ( & 1 , iter. next( ) . unwrap( ) ) ;
260+ assert_eq ! ( & 7 , iter. next_back( ) . unwrap( ) ) ;
261+ assert_eq ! ( & 2 , iter. next( ) . unwrap( ) ) ;
262+ assert_eq ! ( & 3 , iter. next( ) . unwrap( ) ) ;
263+ assert_eq ! ( & 6 , iter. next_back( ) . unwrap( ) ) ;
264+ assert_eq ! ( & 5 , iter. next_back( ) . unwrap( ) ) ;
265+ assert_eq ! ( & 4 , iter. next( ) . unwrap( ) ) ;
266+ assert_eq ! ( None , iter. next( ) ) ;
267+ }
268+
269+ test_iter ( AllocRingBuffer :: new ( 7 ) ) ;
270+ test_iter ( GrowableAllocRingBuffer :: with_capacity ( 7 ) ) ;
271+ test_iter ( ConstGenericRingBuffer :: < i32 , 7 > :: new ( ) ) ;
272+ }
273+
218274 #[ test]
219275 fn run_test_iter_ref ( ) {
220276 fn test_iter < B > ( mut b : B )
@@ -509,6 +565,33 @@ mod tests {
509565 test_index ( ConstGenericRingBuffer :: < i32 , 8 > :: new ( ) ) ;
510566 }
511567
568+ #[ test]
569+ fn run_test_get ( ) {
570+ fn test_index ( mut b : impl RingBuffer < i32 > ) {
571+ b. push ( 0 ) ;
572+ b. push ( 1 ) ;
573+ b. push ( 2 ) ;
574+ b. push ( 3 ) ;
575+ b. push ( 4 ) ;
576+ b. push ( 5 ) ;
577+ b. push ( 6 ) ;
578+ b. push ( 7 ) ;
579+
580+ assert_eq ! ( b. get( 0 ) , Some ( & 0 ) ) ;
581+ assert_eq ! ( b. get( 1 ) , Some ( & 1 ) ) ;
582+ assert_eq ! ( b. get( 2 ) , Some ( & 2 ) ) ;
583+ assert_eq ! ( b. get( 3 ) , Some ( & 3 ) ) ;
584+ assert_eq ! ( b. get( 4 ) , Some ( & 4 ) ) ;
585+ assert_eq ! ( b. get( 5 ) , Some ( & 5 ) ) ;
586+ assert_eq ! ( b. get( 6 ) , Some ( & 6 ) ) ;
587+ assert_eq ! ( b. get( 7 ) , Some ( & 7 ) ) ;
588+ }
589+
590+ test_index ( AllocRingBuffer :: new ( 8 ) ) ;
591+ test_index ( GrowableAllocRingBuffer :: with_capacity ( 8 ) ) ;
592+ test_index ( ConstGenericRingBuffer :: < i32 , 8 > :: new ( ) ) ;
593+ }
594+
512595 #[ test]
513596 fn run_test_index_mut ( ) {
514597 fn test_index_mut ( mut b : impl RingBuffer < i32 > ) {
@@ -557,11 +640,6 @@ mod tests {
557640 b. push ( 0 ) ;
558641 b. push ( 1 ) ;
559642
560- // [0, ...]
561- // ^
562- // [0, 1, ...]
563- // ^
564- // get[(index + 0) % len] = 0 (wrap to 0 because len == 2)
565643 // get[(index + 1) % len] = 1
566644 assert_eq ! ( b. get( 0 ) . unwrap( ) , & 0 ) ;
567645 assert_eq ! ( b. get( 1 ) . unwrap( ) , & 1 ) ;
@@ -729,12 +807,12 @@ mod tests {
729807 // ^
730808 // get[(index + -1) % len] = 1
731809 // get[(index + -2) % len] = 0 (wrap to 1 because len == 2)
732- assert_eq ! ( b. get ( -1 ) . unwrap( ) , & 1 ) ;
733- assert_eq ! ( b. get ( -2 ) . unwrap( ) , & 0 ) ;
810+ assert_eq ! ( b. get_signed ( -1 ) . unwrap( ) , & 1 ) ;
811+ assert_eq ! ( b. get_signed ( -2 ) . unwrap( ) , & 0 ) ;
734812
735813 // Wraps around
736- assert_eq ! ( b. get ( -3 ) . unwrap( ) , & 1 ) ;
737- assert_eq ! ( b. get ( -4 ) . unwrap( ) , & 0 ) ;
814+ assert_eq ! ( b. get_signed ( -3 ) . unwrap( ) , & 1 ) ;
815+ assert_eq ! ( b. get_signed ( -4 ) . unwrap( ) , & 0 ) ;
738816 }
739817
740818 test_get_relative_negative ( AllocRingBuffer :: new ( 8 ) ) ;
@@ -980,11 +1058,11 @@ mod tests {
9801058 fn test_large_negative_index ( mut b : impl RingBuffer < i32 > ) {
9811059 b. push ( 1 ) ;
9821060 b. push ( 2 ) ;
983- assert_eq ! ( b. get ( 1 ) , Some ( & 2 ) ) ;
984- assert_eq ! ( b. get ( 0 ) , Some ( & 1 ) ) ;
985- assert_eq ! ( b. get ( -1 ) , Some ( & 2 ) ) ;
986- assert_eq ! ( b. get ( -2 ) , Some ( & 1 ) ) ;
987- assert_eq ! ( b. get ( -3 ) , Some ( & 2 ) ) ;
1061+ assert_eq ! ( b. get_signed ( 1 ) , Some ( & 2 ) ) ;
1062+ assert_eq ! ( b. get_signed ( 0 ) , Some ( & 1 ) ) ;
1063+ assert_eq ! ( b. get_signed ( -1 ) , Some ( & 2 ) ) ;
1064+ assert_eq ! ( b. get_signed ( -2 ) , Some ( & 1 ) ) ;
1065+ assert_eq ! ( b. get_signed ( -3 ) , Some ( & 2 ) ) ;
9881066 }
9891067
9901068 test_large_negative_index ( AllocRingBuffer :: new ( 2 ) ) ;
@@ -997,11 +1075,11 @@ mod tests {
9971075 fn test_large_negative_index ( mut b : impl RingBuffer < i32 > ) {
9981076 b. push ( 1 ) ;
9991077 b. push ( 2 ) ;
1000- assert_eq ! ( b. get_mut ( 1 ) , Some ( & mut 2 ) ) ;
1001- assert_eq ! ( b. get_mut ( 0 ) , Some ( & mut 1 ) ) ;
1002- assert_eq ! ( b. get_mut ( -1 ) , Some ( & mut 2 ) ) ;
1003- assert_eq ! ( b. get_mut ( -2 ) , Some ( & mut 1 ) ) ;
1004- assert_eq ! ( b. get_mut ( -3 ) , Some ( & mut 2 ) ) ;
1078+ assert_eq ! ( b. get_mut_signed ( 1 ) , Some ( & mut 2 ) ) ;
1079+ assert_eq ! ( b. get_mut_signed ( 0 ) , Some ( & mut 1 ) ) ;
1080+ assert_eq ! ( b. get_mut_signed ( -1 ) , Some ( & mut 2 ) ) ;
1081+ assert_eq ! ( b. get_mut_signed ( -2 ) , Some ( & mut 1 ) ) ;
1082+ assert_eq ! ( b. get_mut_signed ( -3 ) , Some ( & mut 2 ) ) ;
10051083 }
10061084
10071085 test_large_negative_index ( AllocRingBuffer :: new ( 2 ) ) ;
@@ -1076,9 +1154,9 @@ mod tests {
10761154 b. push ( 1 ) ;
10771155 b. push ( 2 ) ;
10781156
1079- assert_eq ! ( b. get ( -1 ) , Some ( & 2 ) ) ;
1080- assert_eq ! ( b. get ( -2 ) , Some ( & 1 ) ) ;
1081- assert_eq ! ( b. get ( -3 ) , Some ( & 2 ) ) ;
1157+ assert_eq ! ( b. get_signed ( -1 ) , Some ( & 2 ) ) ;
1158+ assert_eq ! ( b. get_signed ( -2 ) , Some ( & 1 ) ) ;
1159+ assert_eq ! ( b. get_signed ( -3 ) , Some ( & 2 ) ) ;
10821160 }
10831161
10841162 test_push_dequeue_push_full_get ( AllocRingBuffer :: new ( 2 ) ) ;
@@ -1109,9 +1187,9 @@ mod tests {
11091187 b. push ( 1 ) ;
11101188 b. push ( 2 ) ;
11111189
1112- assert_eq ! ( b. get ( -1 ) , Some ( & 2 ) ) ;
1113- assert_eq ! ( b. get ( -2 ) , Some ( & 1 ) ) ;
1114- assert_eq ! ( b. get ( -3 ) , Some ( & 0 ) )
1190+ assert_eq ! ( b. get_signed ( -1 ) , Some ( & 2 ) ) ;
1191+ assert_eq ! ( b. get_signed ( -2 ) , Some ( & 1 ) ) ;
1192+ assert_eq ! ( b. get_signed ( -3 ) , Some ( & 0 ) )
11151193 }
11161194
11171195 #[ test]
@@ -1135,8 +1213,8 @@ mod tests {
11351213 rb. push ( 1 ) ;
11361214 rb. push ( 2 ) ;
11371215
1138- assert_eq ! ( rb. get ( -1 ) , Some ( & 2 ) ) ;
1139- assert_eq ! ( rb. get ( -2 ) , Some ( & 1 ) ) ;
1216+ assert_eq ! ( rb. get_signed ( -1 ) , Some ( & 2 ) ) ;
1217+ assert_eq ! ( rb. get_signed ( -2 ) , Some ( & 1 ) ) ;
11401218 }
11411219 }
11421220
0 commit comments