1use crate::*;
2
3#[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 pub fn begin(&self) -> usize {
34 self.0.begin()
35 }
36
37 pub fn as_inner(&self) -> &T {
41 self.0.as_inner()
42 }
43
44 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}