Skip to content

Commit 949b2d9

Browse files
committed
Implemented TyrFrom for Deque from slice.
1 parent 0ebca23 commit 949b2d9

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
3939
- Added `SortedLinkedListView`, the `!Sized` version of `SortedLinkedList`.
4040
- Added implementation of `Borrow` and `BorrowMut` for `String` and `Vec`.
4141
- Added `Deque::{swap, swap_unchecked, swap_remove_front, swap_remove_back}`.
42+
- Implemented `TyrFrom` for `Deque` from slice.
4243

4344
### Changed
4445

src/deque.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
use core::borrow::{Borrow, BorrowMut};
3737
use core::fmt;
3838
use core::iter::FusedIterator;
39-
use core::mem::MaybeUninit;
39+
use core::mem::{ManuallyDrop, MaybeUninit};
4040
use core::{ptr, slice};
4141

4242
use crate::storage::{OwnedStorage, Storage, ViewStorage};
@@ -950,6 +950,50 @@ where
950950
}
951951
}
952952

953+
impl<T, const NS: usize, const ND: usize> TryFrom<[T; NS]> for Deque<T, ND> {
954+
/// Converts a `[T; NS]` into a `Deque<T, ND>`.
955+
///
956+
/// ```
957+
/// use heapless::Deque;
958+
///
959+
/// let deq1 = Deque::<u8, 4>::try_from([1, 2, 3, 4]).unwrap();
960+
/// let mut deq2 = Deque::<u8, 4>::new();
961+
/// deq2.push_back(1).unwrap();
962+
/// deq2.push_back(2).unwrap();
963+
/// deq2.push_back(3).unwrap();
964+
/// deq2.push_back(4).unwrap();
965+
///
966+
/// // todo change to `assert_eq!(deq1, deq2);` when PR #521 is merged.
967+
/// assert_eq!(deq1.len(), deq2.len());
968+
/// for (i, e1) in deq1.iter().enumerate() {
969+
/// assert_eq!(Some(e1), deq2.get(i));
970+
/// }
971+
/// ```
972+
type Error = ();
973+
974+
fn try_from(value: [T; NS]) -> Result<Self, Self::Error> {
975+
if NS > ND {
976+
return Err(());
977+
}
978+
979+
let mut deq = Self::default();
980+
let value = ManuallyDrop::new(value);
981+
982+
if size_of::<T>() != 0 {
983+
// SAFETY: We already ensured that value fits in deq.
984+
unsafe {
985+
ptr::copy_nonoverlapping(value.as_ptr(), deq.buffer.as_mut_ptr() as *mut T, NS);
986+
}
987+
}
988+
989+
deq.front = 0;
990+
deq.back = NS;
991+
deq.full = NS == ND;
992+
993+
Ok(deq)
994+
}
995+
}
996+
953997
#[cfg(test)]
954998
mod tests {
955999
use static_assertions::assert_not_impl_any;

0 commit comments

Comments
 (0)