compio_buf/
uninit.rs

1use crate::*;
2
3/// A [`Slice`] that only exposes uninitialized bytes.
4///
5/// [`Uninit`] can be created with [`IoBuf::uninit`].
6///
7/// # Examples
8///
9/// Creating an uninit slice
10///
11/// ```
12/// use compio_buf::IoBuf;
13///
14/// let mut buf = Vec::from(b"hello world");
15/// buf.reserve_exact(10);
16/// let slice = buf.uninit();
17///
18/// assert_eq!(slice.as_slice(), b"");
19/// assert_eq!(slice.buf_capacity(), 10);
20/// ```
21#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
22pub struct Uninit<T>(Slice<T>);
23
24impl<T: IoBuf> Uninit<T> {
25    pub(crate) fn new(buffer: T) -> Self {
26        let len = buffer.buf_len();
27        Self(buffer.slice(len..))
28    }
29}
30
31impl<T> Uninit<T> {
32    /// Offset in the underlying buffer at which uninitialized bytes starts.
33    pub fn begin(&self) -> usize {
34        self.0.begin()
35    }
36
37    /// Gets a reference to the underlying buffer.
38    ///
39    /// This method escapes the slice's view.
40    pub fn as_inner(&self) -> &T {
41        self.0.as_inner()
42    }
43
44    /// Gets a mutable reference to the underlying buffer.
45    ///
46    /// This method escapes the slice's view.
47    pub fn as_inner_mut(&mut self) -> &mut T {
48        self.0.as_inner_mut()
49    }
50}
51
52unsafe impl<T: IoBuf> IoBuf for Uninit<T> {
53    fn as_buf_ptr(&self) -> *const u8 {
54        self.0.as_buf_ptr()
55    }
56
57    fn buf_len(&self) -> usize {
58        debug_assert!(self.0.buf_len() == 0, "Uninit buffer should have length 0");
59        0
60    }
61
62    fn buf_capacity(&self) -> usize {
63        self.0.buf_capacity()
64    }
65
66    fn as_slice(&self) -> &[u8] {
67        &[]
68    }
69}
70
71unsafe impl<T: IoBufMut> IoBufMut for Uninit<T> {
72    fn as_buf_mut_ptr(&mut self) -> *mut u8 {
73        self.0.as_buf_mut_ptr()
74    }
75}
76
77impl<T: SetBufInit + IoBuf> SetBufInit for Uninit<T> {
78    unsafe fn set_buf_init(&mut self, len: usize) {
79        self.0.set_buf_init(self.0.buf_len() + len);
80        let inner = self.0.as_inner();
81        self.0.set_range(inner.buf_len(), inner.buf_capacity());
82    }
83}
84
85impl<T> IntoInner for Uninit<T> {
86    type Inner = T;
87
88    fn into_inner(self) -> Self::Inner {
89        self.0.into_inner()
90    }
91}