Skip to content

Commit 783f6dd

Browse files
committed
fix: allow offset to be equal to the buffer length when the source or target slice is empty
1 parent 3c23263 commit 783f6dd

File tree

3 files changed

+37
-4
lines changed

3 files changed

+37
-4
lines changed

src/lib.rs

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2248,6 +2248,22 @@ mod tests {
22482248
test_concrete!(|| AllocRingBuffer::<i32>::new(1));
22492249
}
22502250

2251+
#[test]
2252+
fn test_extend_from_slice_empty_alt() {
2253+
macro_rules! test_concrete {
2254+
($rb_init: expr) => {
2255+
let mut rb = $rb_init();
2256+
let _ = rb.enqueue(1);
2257+
rb.extend_from_slice(&[]);
2258+
assert_eq!(&rb.to_vec(), &[1]);
2259+
};
2260+
}
2261+
2262+
test_concrete!(ConstGenericRingBuffer::<i32, 1>::new);
2263+
test_concrete!(|| GrowableAllocRingBuffer::<i32>::with_capacity(1));
2264+
test_concrete!(|| AllocRingBuffer::<i32>::new(1));
2265+
}
2266+
22512267
#[test]
22522268
fn test_extend_from_slice_wrap_around() {
22532269
macro_rules! test_concrete {
@@ -2369,6 +2385,23 @@ mod tests {
23692385
test_concrete!(|| AllocRingBuffer::<i32>::new(1));
23702386
}
23712387

2388+
#[test]
2389+
fn test_drain_to_slice_empty_alt() {
2390+
macro_rules! test_concrete {
2391+
($rb_init: expr) => {
2392+
let mut rb = $rb_init();
2393+
let _ = rb.enqueue(1);
2394+
let mut slice = [];
2395+
rb.drain_to_slice(&mut slice);
2396+
assert_eq!(&slice, &[]);
2397+
};
2398+
}
2399+
2400+
test_concrete!(ConstGenericRingBuffer::<i32, 1>::new);
2401+
test_concrete!(|| GrowableAllocRingBuffer::<i32>::with_capacity(1));
2402+
test_concrete!(|| AllocRingBuffer::<i32>::new(1));
2403+
}
2404+
23722405
#[test]
23732406
fn test_drain_to_slice_wrap_around() {
23742407
macro_rules! test_concrete {

src/ringbuffer_trait.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -686,7 +686,7 @@ macro_rules! impl_ringbuffer_ext {
686686
let len = Self::ptr_len(rb);
687687
let dst_len = dst.len();
688688
assert!(
689-
(offset == 0 && len == 0) || offset < len,
689+
offset < len || (offset == len && dst_len == 0),
690690
"offset ({offset}) is out of bounds for the current buffer length ({len})"
691691
);
692692
assert!(len - offset >= dst_len, "destination slice length ({dst_len}) greater than buffer length ({len}) when considering the specified offset ({offset})");
@@ -729,7 +729,7 @@ macro_rules! impl_ringbuffer_ext {
729729
let len = Self::ptr_len(rb);
730730
let src_len = src.len();
731731
assert!(
732-
(offset == 0 && len == 0) || offset < len,
732+
offset < len || (offset == len && src_len == 0),
733733
"offset ({offset}) is out of bounds for the current buffer length ({len})"
734734
);
735735
assert!(len - offset >= src_len, "source slice length ({src_len}) greater than buffer length ({len}) when considering the specified offset ({offset})");

src/with_alloc/vecdeque.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,7 @@ unsafe impl<T> RingBuffer<T> for GrowableAllocRingBuffer<T> {
263263
let len = Self::ptr_len(rb);
264264
let dst_len = dst.len();
265265
assert!(
266-
(offset == 0 && len == 0) || offset < len,
266+
offset < len || (offset == len && dst_len == 0),
267267
"offset ({offset}) is out of bounds for the current buffer length ({len})"
268268
);
269269
assert!(len - offset >= dst_len, "destination slice length ({dst_len}) greater than buffer length ({len}) when considering the specified offset ({offset})");
@@ -295,7 +295,7 @@ unsafe impl<T> RingBuffer<T> for GrowableAllocRingBuffer<T> {
295295
let len = Self::ptr_len(rb);
296296
let src_len = src.len();
297297
assert!(
298-
(offset == 0 && len == 0) || offset < len,
298+
offset < len || (offset == len && src_len == 0),
299299
"offset ({offset}) is out of bounds for the current buffer length ({len})"
300300
);
301301
assert!(len - offset >= src_len, "source slice length ({src_len}) greater than buffer length ({len}) when considering the specified offset ({offset})");

0 commit comments

Comments
 (0)