@@ -37,7 +37,7 @@ use core::cmp::Ordering;
37
37
use core:: fmt;
38
38
use core:: iter:: FusedIterator ;
39
39
use core:: marker:: PhantomData ;
40
- use core:: mem:: MaybeUninit ;
40
+ use core:: mem:: { ManuallyDrop , MaybeUninit } ;
41
41
use core:: { ptr, slice} ;
42
42
43
43
use crate :: vec:: { OwnedVecStorage , VecStorage , VecStorageInner , ViewVecStorage } ;
@@ -998,6 +998,50 @@ impl<T: PartialEq, const N: usize> PartialEq for Deque<T, N> {
998
998
999
999
impl < T : Eq , const N : usize > Eq for Deque < T , N > { }
1000
1000
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
+
1001
1045
#[ cfg( test) ]
1002
1046
mod tests {
1003
1047
use static_assertions:: assert_not_impl_any;
0 commit comments