Skip to content

Commit d658362

Browse files
committed
Merge remote-tracking branch 'origin/main' into cdellacqua/main
2 parents 3a36251 + 479597a commit d658362

File tree

3 files changed

+116
-3
lines changed

3 files changed

+116
-3
lines changed

benches/bench.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,16 @@ fn benchmark_various<T: RingBuffer<i32>, F: Fn() -> T>(b: &mut Bencher, new: F)
6464
})
6565
}
6666

67+
fn benchmark_skip<T: RingBuffer<i32>, F: Fn() -> T>(b: &mut Bencher, new: F) {
68+
let mut rb = new();
69+
rb.fill(9);
70+
b.iter(|| {
71+
for i in 0..rb.len() {
72+
assert_eq!(rb.iter().skip(i).next(), Some(&9));
73+
}
74+
})
75+
}
76+
6777
fn benchmark_copy_to_slice_vs_extend<T: RingBuffer<i32>, F: Fn() -> T>(
6878
rb_size: usize,
6979
rb_type: &str,
@@ -280,6 +290,32 @@ fn criterion_benchmark(c: &mut Criterion) {
280290
8192,
281291
8195
282292
];
293+
generate_benches![
294+
typed,
295+
c,
296+
ConstGenericRingBuffer,
297+
i32,
298+
new,
299+
benchmark_skip,
300+
16,
301+
1024,
302+
4096,
303+
8192
304+
];
305+
generate_benches![
306+
called,
307+
c,
308+
AllocRingBuffer,
309+
i32,
310+
new,
311+
benchmark_skip,
312+
16,
313+
17,
314+
1024,
315+
4096,
316+
8192,
317+
8195
318+
];
283319
generate_benches![
284320
compare,
285321
c,

src/lib.rs

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1453,6 +1453,63 @@ mod tests {
14531453
test_clone!(AllocRingBuffer::<_>::new(4));
14541454
}
14551455

1456+
#[test]
1457+
fn iter_nth_override() {
1458+
macro_rules! test_concrete {
1459+
($rb_init: expr) => {
1460+
let rb = $rb_init([1, 2, 3, 4]);
1461+
assert_eq!(rb.iter().nth(0), Some(&1));
1462+
assert_eq!(rb.iter().nth(1), Some(&2));
1463+
assert_eq!(rb.iter().nth(2), Some(&3));
1464+
assert_eq!(rb.iter().nth(3), Some(&4));
1465+
assert_eq!(rb.iter().nth(4), None);
1466+
1467+
let mut rb = $rb_init([1, 2, 3, 4]);
1468+
assert_eq!(rb.iter_mut().nth(0), Some(&mut 1));
1469+
assert_eq!(rb.iter_mut().nth(1), Some(&mut 2));
1470+
assert_eq!(rb.iter_mut().nth(2), Some(&mut 3));
1471+
assert_eq!(rb.iter_mut().nth(3), Some(&mut 4));
1472+
assert_eq!(rb.iter_mut().nth(4), None);
1473+
1474+
let rb = $rb_init([1, 2, 3, 4]);
1475+
assert_eq!(rb.clone().into_iter().nth(0), Some(1));
1476+
assert_eq!(rb.clone().into_iter().nth(1), Some(2));
1477+
assert_eq!(rb.clone().into_iter().nth(2), Some(3));
1478+
assert_eq!(rb.clone().into_iter().nth(3), Some(4));
1479+
assert_eq!(rb.clone().into_iter().nth(4), None);
1480+
};
1481+
}
1482+
1483+
test_concrete!(|values: [i32; 4]| ConstGenericRingBuffer::<_, 4>::from(values));
1484+
test_concrete!(|values: [i32; 4]| GrowableAllocRingBuffer::<_>::from(values));
1485+
test_concrete!(|values: [i32; 4]| AllocRingBuffer::<_>::from(values));
1486+
}
1487+
1488+
#[test]
1489+
fn iter_nth_back_override() {
1490+
macro_rules! test_concrete {
1491+
($rb_init: expr) => {
1492+
let rb = $rb_init([1, 2, 3, 4]);
1493+
assert_eq!(rb.iter().nth_back(0), Some(&4));
1494+
assert_eq!(rb.iter().nth_back(1), Some(&3));
1495+
assert_eq!(rb.iter().nth_back(2), Some(&2));
1496+
assert_eq!(rb.iter().nth_back(3), Some(&1));
1497+
assert_eq!(rb.iter().nth_back(4), None);
1498+
1499+
let mut rb = $rb_init([1, 2, 3, 4]);
1500+
assert_eq!(rb.iter_mut().nth_back(0), Some(&mut 4));
1501+
assert_eq!(rb.iter_mut().nth_back(1), Some(&mut 3));
1502+
assert_eq!(rb.iter_mut().nth_back(2), Some(&mut 2));
1503+
assert_eq!(rb.iter_mut().nth_back(3), Some(&mut 1));
1504+
assert_eq!(rb.iter_mut().nth_back(4), None);
1505+
};
1506+
}
1507+
1508+
test_concrete!(|values: [i32; 4]| ConstGenericRingBuffer::<_, 4>::from(values));
1509+
test_concrete!(|values: [i32; 4]| GrowableAllocRingBuffer::<_>::from(values));
1510+
test_concrete!(|values: [i32; 4]| AllocRingBuffer::<_>::from(values));
1511+
}
1512+
14561513
#[test]
14571514
fn test_copy_from_slice_power_of_two() {
14581515
macro_rules! test_concrete {

src/ringbuffer_trait.rs

Lines changed: 23 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ pub unsafe trait RingBuffer<T>:
122122
/// assert_eq!(rb.len(), 0);
123123
///
124124
/// ```
125-
fn drain(&mut self) -> RingBufferDrainingIterator<T, Self> {
125+
fn drain(&mut self) -> RingBufferDrainingIterator<'_, T, Self> {
126126
RingBufferDrainingIterator::new(self)
127127
}
128128

@@ -226,14 +226,14 @@ pub unsafe trait RingBuffer<T>:
226226
/// Creates a mutable iterator over the buffer starting from the item pushed the longest ago,
227227
/// and ending at the element most recently pushed.
228228
#[inline]
229-
fn iter_mut(&mut self) -> RingBufferMutIterator<T, Self> {
229+
fn iter_mut(&mut self) -> RingBufferMutIterator<'_, T, Self> {
230230
RingBufferMutIterator::new(self)
231231
}
232232

233233
/// Creates an iterator over the buffer starting from the item pushed the longest ago,
234234
/// and ending at the element most recently pushed.
235235
#[inline]
236-
fn iter(&self) -> RingBufferIterator<T, Self> {
236+
fn iter(&self) -> RingBufferIterator<'_, T, Self> {
237237
RingBufferIterator::new(self)
238238
}
239239

@@ -342,6 +342,11 @@ mod iter {
342342
fn size_hint(&self) -> (usize, Option<usize>) {
343343
(self.len, Some(self.len))
344344
}
345+
346+
fn nth(&mut self, n: usize) -> Option<Self::Item> {
347+
self.index = (self.index + n).min(self.len);
348+
self.next()
349+
}
345350
}
346351

347352
impl<'rb, T: 'rb, RB: RingBuffer<T>> FusedIterator for RingBufferIterator<'rb, T, RB> {}
@@ -359,6 +364,11 @@ mod iter {
359364
None
360365
}
361366
}
367+
368+
fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
369+
self.len = self.len - n.min(self.len);
370+
self.next_back()
371+
}
362372
}
363373

364374
/// `RingBufferMutIterator` holds a reference to a `RingBuffer` and iterates over it. `index` is the
@@ -401,6 +411,11 @@ mod iter {
401411
None
402412
}
403413
}
414+
415+
fn nth_back(&mut self, n: usize) -> Option<Self::Item> {
416+
self.len = self.len - n.min(self.len);
417+
self.next_back()
418+
}
404419
}
405420

406421
impl<'rb, T, RB: RingBuffer<T> + 'rb> Iterator for RingBufferMutIterator<'rb, T, RB> {
@@ -420,6 +435,11 @@ mod iter {
420435
fn size_hint(&self) -> (usize, Option<usize>) {
421436
(self.len, Some(self.len))
422437
}
438+
439+
fn nth(&mut self, n: usize) -> Option<Self::Item> {
440+
self.index = (self.index + n).min(self.len);
441+
self.next()
442+
}
423443
}
424444

425445
/// `RingBufferMutIterator` holds a reference to a `RingBuffer` and iterates over it.

0 commit comments

Comments
 (0)