Skip to content

Commit 5283276

Browse files
authored
Merge pull request #125 from NULLx76/index-with-usizes
Index with usizes
2 parents 13dc018 + 6f843ac commit 5283276

File tree

11 files changed

+327
-252
lines changed

11 files changed

+327
-252
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ fn main() {
3434
buffer.push(5);
3535

3636
// The last item we pushed is 5
37-
assert_eq!(buffer.get(-1), Some(&5));
37+
assert_eq!(buffer.back(), Some(&5));
3838

3939
// Second entry is now 42.
4040
buffer.push(42);

benches/bench.rs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
#![no_coverage]
12
use criterion::{black_box, criterion_group, criterion_main, Bencher, Criterion};
23
use ringbuffer::{AllocRingBuffer, ConstGenericRingBuffer, RingBuffer};
34

@@ -40,8 +41,8 @@ fn benchmark_push_dequeue<T: RingBuffer<i32>, F: Fn() -> T>(b: &mut Bencher, new
4041
rb.push(2);
4142
black_box(());
4243

43-
assert_eq!(black_box(rb.get(-1)), Some(&2));
44-
assert_eq!(black_box(rb.get(-2)), Some(&1));
44+
assert_eq!(black_box(rb.get_signed(-1)), Some(&2));
45+
assert_eq!(black_box(rb.get_signed(-2)), Some(&1));
4546
}
4647

4748
rb
@@ -55,7 +56,7 @@ fn benchmark_various<T: RingBuffer<i32>, F: Fn() -> T>(b: &mut Bencher, new: F)
5556
for i in 0..100_000 {
5657
rb.push(i);
5758
black_box(());
58-
black_box(rb.get(-1));
59+
black_box(rb.back());
5960
}
6061

6162
rb

src/lib.rs

Lines changed: 107 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)