Skip to content

Commit 98afd95

Browse files
committed
Implemented TyrFrom for Deque from slice.
1 parent 3c97d2f commit 98afd95

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
@@ -41,6 +41,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
4141
- Added `Deque::{swap, swap_unchecked, swap_remove_front, swap_remove_back}`.
4242
- Make `String::from_utf8_unchecked` const.
4343
- Implemented `PartialEq` and `Eq` for `Deque`.
44+
- Implemented `TyrFrom` for `Deque` from slice.
4445

4546
### Changed
4647

src/deque.rs

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ use core::cmp::Ordering;
3737
use core::fmt;
3838
use core::iter::FusedIterator;
3939
use core::marker::PhantomData;
40-
use core::mem::MaybeUninit;
40+
use core::mem::{ManuallyDrop, MaybeUninit};
4141
use core::{ptr, slice};
4242

4343
use crate::vec::{OwnedVecStorage, VecStorage, VecStorageInner, ViewVecStorage};
@@ -998,6 +998,50 @@ impl<T: PartialEq, const N: usize> PartialEq for Deque<T, N> {
998998

999999
impl<T: Eq, const N: usize> Eq for Deque<T, N> {}
10001000

1001+
impl<T, const NS: usize, const ND: usize> TryFrom<[T; NS]> for Deque<T, ND> {
1002+
/// Converts a `[T; NS]` into a `Deque<T, ND>`.
1003+
///
1004+
/// ```
1005+
/// use heapless::Deque;
1006+
///
1007+
/// let deq1 = Deque::<u8, 4>::try_from([1, 2, 3, 4]).unwrap();
1008+
/// let mut deq2 = Deque::<u8, 4>::new();
1009+
/// deq2.push_back(1).unwrap();
1010+
/// deq2.push_back(2).unwrap();
1011+
/// deq2.push_back(3).unwrap();
1012+
/// deq2.push_back(4).unwrap();
1013+
///
1014+
/// // todo change to `assert_eq!(deq1, deq2);` when PR #521 is merged.
1015+
/// assert_eq!(deq1.len(), deq2.len());
1016+
/// for (i, e1) in deq1.iter().enumerate() {
1017+
/// assert_eq!(Some(e1), deq2.get(i));
1018+
/// }
1019+
/// ```
1020+
type Error = ();
1021+
1022+
fn try_from(value: [T; NS]) -> Result<Self, Self::Error> {
1023+
if NS > ND {
1024+
return Err(());
1025+
}
1026+
1027+
let mut deq = Self::default();
1028+
let value = ManuallyDrop::new(value);
1029+
1030+
if size_of::<T>() != 0 {
1031+
// SAFETY: We already ensured that value fits in deq.
1032+
unsafe {
1033+
ptr::copy_nonoverlapping(value.as_ptr(), deq.buffer.as_mut_ptr() as *mut T, NS);
1034+
}
1035+
}
1036+
1037+
deq.front = 0;
1038+
deq.back = NS;
1039+
deq.full = NS == ND;
1040+
1041+
Ok(deq)
1042+
}
1043+
}
1044+
10011045
#[cfg(test)]
10021046
mod tests {
10031047
use static_assertions::assert_not_impl_any;

0 commit comments

Comments
 (0)