soio/
iovec.rs

1use std::{ops, mem};
2
3use sys;
4
5/// A specialized byte slice type for performing vector reads and writes.
6///
7/// # Examples
8///
9/// ```
10/// use soio::IoVec;
11///
12/// let mut data = vec![];
13/// data.extend_from_slice(b"hello");
14///
15/// let iovec: &IoVec = data.as_slice().into();
16///
17/// assert_eq!(iovec.as_bytes(), &b"hello"[..]);
18/// ```
19pub struct IoVec {
20    sys: sys::IoVec,
21}
22
23impl ops::Deref for IoVec {
24    type Target = [u8];
25
26    fn deref(&self) -> &[u8] {
27        &self.sys.as_ref()
28    }
29}
30
31impl ops::DerefMut for IoVec {
32    fn deref_mut(&mut self) -> &mut [u8] {
33        self.sys.as_mut()
34    }
35}
36
37impl<'a> From<&'a [u8]> for &'a IoVec {
38    fn from(bytes: &'a [u8]) -> &'a IoVec {
39        unsafe {
40            mem::transmute(<&sys::IoVec>::from(bytes))
41        }
42    }
43}
44
45impl<'a> From<&'a mut [u8]> for &'a mut IoVec {
46    fn from(bytes: &'a mut [u8]) -> &'a mut IoVec {
47        unsafe {
48            mem::transmute(<&mut sys::IoVec>::from(bytes))
49        }
50    }
51}
52
53impl IoVec {
54    /// Converts an `self` to a bytes slice.
55    ///
56    /// # Examples
57    ///
58    /// ```
59    /// use soio::IoVec;
60    ///
61    /// let mut data = vec![];
62    /// data.extend_from_slice(b"hello");
63    ///
64    /// let iovec: &IoVec = data.as_slice().into();
65    ///
66    /// assert_eq!(iovec.as_bytes(), &b"hello"[..]);
67    /// ```
68    pub fn as_bytes(&self) -> &[u8] {
69        //self.data.as_bytes()
70        &**self
71    }
72
73    /// Converts an `self` to a mutable bytes slice.
74    ///
75    /// # Examples
76    ///
77    /// ```
78    /// use soio::IoVec;
79    ///
80    /// let mut data = vec![];
81    /// data.extend_from_slice(b"hello");
82    ///
83    /// let iovec: &mut IoVec = data.as_mut_slice().into();
84    ///
85    /// iovec.as_mut_bytes()[0] = b'j';
86    ///
87    /// assert_eq!(iovec.as_bytes(), &b"jello"[..]);
88    /// ```
89    pub fn as_mut_bytes(&mut self) -> &mut [u8] {
90        //self.data.as_mut_bytes()
91        &mut **self
92    }
93}
94
95impl<'a> Default for &'a IoVec {
96    fn default() -> Self {
97        let b: &[u8] = Default::default();
98        b.into()
99    }
100}
101
102impl<'a> Default for &'a mut IoVec {
103    fn default() -> Self {
104        let b: &mut [u8] = Default::default();
105        b.into()
106    }
107}