use collection_heapless_vec::HeaplessVec; use kwap_common::{Array, GetSize, Reserve}; use kwap_msg::*; fn main() { type StackMsg = Message, HeaplessVec, HeaplessVec>, 1>>; let stack_msg = StackMsg { code: Code { class: 2, detail: 5 }, ty: Type::Con, ver: Default::default(), id: Id(0), opts: Default::default(), payload: Payload(Default::default()), token: Token(Default::default()) }; println!("created {}b message using heapless::Vec", stack_msg.get_size()); let bytes = stack_msg.clone() .try_into_bytes::>() .unwrap(); println!("message -> bytes success!"); let roundtrip = StackMsg::try_from_bytes(bytes).unwrap(); println!("bytes -> message success!"); assert_eq!(roundtrip, stack_msg); } pub(crate) mod collection_heapless_vec { use std::ops::{Deref, DerefMut, Index, IndexMut}; use std::ptr; use super::*; #[derive(Debug, Default, PartialEq, Clone)] pub struct HeaplessVec(heapless::Vec); impl Array for HeaplessVec { type Item = T; fn insert_at(&mut self, index: usize, value: T) { if index == self.0.len() { self.push(value); return; } // please do NOT use this code, // this is a terrible implementation of `insert_at` just for demonstration purposes. let me: Self = unsafe { ptr::read(self as *const Self) }; let mut value_container = Some(value); let buffer = me.into_iter() .enumerate() .fold(heapless::Vec::::new(), |mut buf, (ix, val)| { if ix == index { buf.push(value_container.take().unwrap()).ok(); } else { buf.push(val).ok(); } buf }); *self = Self(buffer); } fn remove(&mut self, index: usize) -> Option<::Item> { Some(()).filter(|_| self.0.len() > index) .map(|_| self.0.swap_remove(index)) } fn push(&mut self, value: ::Item) { self.0.push(value).unwrap_or(()); } } impl Deref for HeaplessVec { type Target = [T]; fn deref(&self) -> &[T] { &self.0 } } impl DerefMut for HeaplessVec { fn deref_mut(&mut self) -> &mut [T] { &mut self.0 } } impl Index for HeaplessVec { type Output = T; fn index(&self, index: usize) -> &Self::Output { &self.0[index] } } impl IndexMut for HeaplessVec { fn index_mut(&mut self, index: usize) -> &mut Self::Output { &mut self.0[index] } } impl Reserve for HeaplessVec {} impl GetSize for HeaplessVec { fn get_size(&self) -> usize { self.0.len() } fn max_size(&self) -> Option { Some(N) } } impl Extend for HeaplessVec { fn extend>(&mut self, iter: I) { self.0.extend(iter); } } impl FromIterator for HeaplessVec { fn from_iter>(iter: I) -> Self { Self(heapless::Vec::from_iter(iter)) } } impl IntoIterator for HeaplessVec { type Item = T; type IntoIter = as IntoIterator>::IntoIter; fn into_iter(self) -> Self::IntoIter { self.0.into_iter() } } impl<'a, T: Default, const N: usize> IntoIterator for &'a HeaplessVec { type Item = &'a T; type IntoIter = core::slice::Iter<'a, T>; fn into_iter(self) -> Self::IntoIter { self.0.iter() } } }