data_view/
view.rs

1use super::*;
2
3/// A data view for reading and writing data in byte array.
4///
5/// # Examples
6///
7/// ```
8/// use data_view::View;
9///
10/// let mut buf = [0; 16];
11///
12/// buf.write_at(1, 42_u16);
13/// assert_eq!(buf.read_at::<u16>(1).unwrap(), 42);
14/// ```
15pub trait View {
16    /// Reads a value of type `E: Endian` from view.
17    ///
18    /// # Examples
19    ///
20    /// ```
21    /// use data_view::View;
22    ///
23    /// let buf = [42];
24    ///
25    /// assert_eq!(buf.read_at::<u8>(0), Some(42));
26    /// assert_eq!(buf.read_at::<u16>(1), None);
27    /// ```
28    fn read_at<E: Endian>(&self, offset: usize) -> Option<E>;
29
30    /// Writes a value of type `E: Endian` to data view.
31    ///
32    /// # Examples
33    ///
34    /// ```
35    /// use data_view::View;
36    ///
37    /// let mut buf = [0];
38    ///
39    /// assert_eq!(buf.write_at(0, 42_u8), Ok(()));
40    /// assert_eq!(buf.write_at(1, 123_u16), Err(()));
41    /// ```
42    fn write_at<E: Endian>(&mut self, offset: usize, num: E) -> Result<(), ()>;
43}
44
45impl View for [u8] {
46    #[inline]
47    fn read_at<E: Endian>(&self, offset: usize) -> Option<E> {
48        if offset + size_of::<E>() > self.len() {
49            return None;
50        }
51        Some(unsafe { E::__read_at__(self.as_ptr().add(offset)) })
52    }
53
54    #[inline]
55    fn write_at<E: Endian>(&mut self, offset: usize, num: E) -> Result<(), ()> {
56        if offset + size_of::<E>() > self.len() {
57            return Err(());
58        }
59        unsafe { E::__write_at__(num, self.as_mut_ptr().add(offset)) };
60        Ok(())
61    }
62}