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}