From 98e4b982e70317cf08aefd9ff8461f5d1ad7e80b Mon Sep 17 00:00:00 2001 From: Nick Krichevsky Date: Sat, 8 Aug 2026 13:38:29 -0400 Subject: [PATCH] Add FromIterator implementation for Deque --- CHANGELOG.md | 1 + src/deque.rs | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 7de9cfabdc..b6bc05009d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -17,6 +17,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/). - Bump MSRV to 1.88 (requires by trybuild dev dependency). - Fixed unsoundness in `Vec::IntoIter::drop` and `HistoryBuf::write`in the context of panicking drop implementations. - Added `push_mut` to `Vec`. +- Implemented `FromIterator` for `Deque`. - Fixed unsoundness in `IndexMap:insert`. - Limited max size of `IndexMap` to u16::MAX + 1. The implementation for sizes higher than u16::MAX were unsound anyway. diff --git a/src/deque.rs b/src/deque.rs index a1e4ddf9dd..c6b7655f7e 100644 --- a/src/deque.rs +++ b/src/deque.rs @@ -1246,6 +1246,18 @@ impl<'a, T: 'a + Copy, S: VecStorage + ?Sized> Extend<&'a T> for DequeInner FromIterator for Deque { + fn from_iter(iter: I) -> Self + where + I: IntoIterator, + { + let mut deque = Self::new(); + deque.extend(iter); + + deque + } +} + /// An iterator that moves out of a [`Deque`]. /// /// This struct is created by calling the `into_iter` method. @@ -1553,6 +1565,30 @@ mod tests { v.extend(&[1, 2, 3, 4, 5]); } + #[test] + fn from_iter() { + // Iterator is empty. + let deq: Deque = core::iter::empty().collect(); + assert!(deq.is_empty()); + + // Iterator is under limit. + let deq: Deque = [1, 2, 3].into_iter().collect(); + assert!(!deq.is_full()); + assert_eq!(deq.as_slices(), (&[1, 2, 3][..], &[][..])); + + // Iterator is at limit. + let deq: Deque = [1, 2, 3, 4].into_iter().collect(); + assert!(deq.is_full()); + assert_eq!(deq.as_slices(), (&[1, 2, 3, 4][..], &[][..])); + } + + #[test] + #[should_panic] + fn from_iter_panic() { + // Too many elements (4 vs 5) + let _: Deque = [1, 2, 3, 4, 5].into_iter().collect(); + } + #[test] fn iter() { let mut v: Deque = Deque::new();