Skip to content

Commit b1f040d

Browse files
authored
Merge pull request #447 from rlee287/extend_for_deque
Impl Extend for Deque
2 parents 6d62cb2 + 1d91e64 commit b1f040d

File tree

2 files changed

+40
-0
lines changed

2 files changed

+40
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1414
- Added `is_full`, `recent_index`, `oldest`, and `oldest_index` to `HistoryBuffer`
1515
- Added infallible conversions from arrays to `Vec`.
1616
- Added `Vec::spare_capacity_mut`.
17+
- Added `Extend` impls for `Deque`.
1718

1819
### Changed
1920

src/deque.rs

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -382,6 +382,20 @@ impl<T: fmt::Debug, const N: usize> fmt::Debug for Deque<T, N> {
382382
}
383383
}
384384

385+
/// As with the standard library's `VecDeque`, items are added via `push_back`.
386+
impl<T, const N: usize> Extend<T> for Deque<T, N> {
387+
fn extend<I: IntoIterator<Item = T>>(&mut self, iter: I) {
388+
for item in iter {
389+
self.push_back(item).ok().unwrap();
390+
}
391+
}
392+
}
393+
impl<'a, T: 'a + Copy, const N: usize> Extend<&'a T> for Deque<T, N> {
394+
fn extend<I: IntoIterator<Item = &'a T>>(&mut self, iter: I) {
395+
self.extend(iter.into_iter().copied())
396+
}
397+
}
398+
385399
/// An iterator that moves out of a [`Deque`].
386400
///
387401
/// This struct is created by calling the `into_iter` method.
@@ -661,6 +675,31 @@ mod tests {
661675
assert_eq!(v.back_mut(), None);
662676
}
663677

678+
#[test]
679+
fn extend() {
680+
let mut v: Deque<i32, 4> = Deque::new();
681+
v.extend(&[1, 2, 3]);
682+
assert_eq!(v.pop_front().unwrap(), 1);
683+
assert_eq!(v.pop_front().unwrap(), 2);
684+
assert_eq!(*v.front().unwrap(), 3);
685+
686+
v.push_back(4).unwrap();
687+
v.extend(&[5, 6]);
688+
assert_eq!(v.pop_front().unwrap(), 3);
689+
assert_eq!(v.pop_front().unwrap(), 4);
690+
assert_eq!(v.pop_front().unwrap(), 5);
691+
assert_eq!(v.pop_front().unwrap(), 6);
692+
assert!(v.pop_front().is_none());
693+
}
694+
695+
#[test]
696+
#[should_panic]
697+
fn extend_panic() {
698+
let mut v: Deque<i32, 4> = Deque::new();
699+
// Is too many elements -> should panic
700+
v.extend(&[1, 2, 3, 4, 5]);
701+
}
702+
664703
#[test]
665704
fn iter() {
666705
let mut v: Deque<i32, 4> = Deque::new();

0 commit comments

Comments
 (0)