planus/impls/
planus_vectors.rs1use crate::{
2 errors::{self, ErrorKind},
3 slice_helpers::SliceWithStartOffset,
4 traits::*,
5 vectors::Vector,
6};
7use core::marker::PhantomData;
8
9impl<'buf, T: VectorRead<'buf>, O> TryFrom<Vector<'buf, T>> for alloc::vec::Vec<O>
10where
11 O: core::convert::TryFrom<T>,
12 errors::Error: From<O::Error>,
13{
14 type Error = crate::errors::Error;
15
16 fn try_from(value: Vector<'buf, T>) -> Result<Self, Self::Error> {
17 value
18 .iter()
19 .map(|v| O::try_from(v).map_err(errors::Error::from))
20 .collect()
21 }
22 }
30
31impl<'buf, T: ?Sized + VectorRead<'buf>> TableRead<'buf> for Vector<'buf, T> {
32 fn from_buffer(
33 buffer: SliceWithStartOffset<'buf>,
34 offset: usize,
35 ) -> core::result::Result<Self, ErrorKind> {
36 let (buffer, len) = super::array_from_buffer(buffer, offset)?;
37 if len.checked_mul(T::STRIDE).ok_or(ErrorKind::InvalidLength)? <= buffer.len() {
38 Ok(Vector {
39 buffer,
40 len,
41 _marker: PhantomData,
42 })
43 } else {
44 Err(ErrorKind::InvalidLength)
45 }
46 }
47}