Skip to content

Commit 4180793

Browse files
committed
fix advance_by impl for vec_deque and add tests
1 parent 9cd9da2 commit 4180793

File tree

2 files changed

+30
-7
lines changed

2 files changed

+30
-7
lines changed

library/alloc/src/collections/vec_deque/into_iter.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ impl<T, A: Allocator> Iterator for IntoIter<T, A> {
5656

5757
#[inline]
5858
fn advance_by(&mut self, n: usize) -> Result<(), NonZeroUsize> {
59-
let rem = if self.inner.len < n {
60-
let len = self.inner.len;
59+
let len = self.inner.len;
60+
let rem = if len < n {
6161
self.inner.clear();
62-
len - n
62+
n - len
6363
} else {
6464
self.inner.drain(..n);
6565
0
@@ -186,12 +186,12 @@ impl<T, A: Allocator> DoubleEndedIterator for IntoIter<T, A> {
186186
#[inline]
187187
fn advance_back_by(&mut self, n: usize) -> Result<(), NonZeroUsize> {
188188
let len = self.inner.len;
189-
let rem = if len >= n {
190-
self.inner.truncate(len - n);
191-
0
192-
} else {
189+
let rem = if len < n {
193190
self.inner.clear();
194191
n - len
192+
} else {
193+
self.inner.truncate(len - n);
194+
0
195195
};
196196
NonZeroUsize::new(rem).map_or(Ok(()), Err)
197197
}

library/alloc/tests/vec_deque.rs

+23
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
use core::num::NonZeroUsize;
12
use std::assert_matches::assert_matches;
23
use std::collections::TryReserveErrorKind::*;
34
use std::collections::{vec_deque::Drain, VecDeque};
@@ -426,6 +427,28 @@ fn test_into_iter() {
426427
assert_eq!(it.next(), Some(7));
427428
assert_eq!(it.size_hint(), (5, Some(5)));
428429
}
430+
431+
// advance_by
432+
{
433+
let mut d = VecDeque::new();
434+
for i in 0..=4 {
435+
d.push_back(i);
436+
}
437+
for i in 6..=8 {
438+
d.push_front(i);
439+
}
440+
441+
let mut it = d.into_iter();
442+
assert_eq!(it.advance_by(1), Ok(()));
443+
assert_eq!(it.next(), Some(7));
444+
assert_eq!(it.advance_back_by(1), Ok(()));
445+
assert_eq!(it.next_back(), Some(3));
446+
447+
let mut it = VecDeque::from(vec![1, 2, 3, 4, 5]).into_iter();
448+
assert_eq!(it.advance_by(10), Err(NonZeroUsize::new(5).unwrap()));
449+
let mut it = VecDeque::from(vec![1, 2, 3, 4, 5]).into_iter();
450+
assert_eq!(it.advance_back_by(10), Err(NonZeroUsize::new(5).unwrap()));
451+
}
429452
}
430453

431454
#[test]

0 commit comments

Comments
 (0)