fluke_maybe_uring/io/
buf_or_slice.rs

1use crate::buf::IoBuf;
2
3pub(crate) enum BufOrSlice<B: IoBuf> {
4    Buf(B),
5    Slice(crate::buf::Slice<B>),
6}
7
8unsafe impl<B: IoBuf> IoBuf for BufOrSlice<B> {
9    #[inline(always)]
10    fn stable_ptr(&self) -> *const u8 {
11        match self {
12            BufOrSlice::Buf(b) => b.stable_ptr(),
13            BufOrSlice::Slice(s) => s.stable_ptr(),
14        }
15    }
16
17    #[inline(always)]
18    fn bytes_init(&self) -> usize {
19        match self {
20            BufOrSlice::Buf(b) => b.bytes_init(),
21            BufOrSlice::Slice(s) => s.bytes_init(),
22        }
23    }
24
25    #[inline(always)]
26    fn bytes_total(&self) -> usize {
27        match self {
28            BufOrSlice::Buf(b) => b.bytes_total(),
29            BufOrSlice::Slice(s) => s.bytes_total(),
30        }
31    }
32}
33
34impl<B: IoBuf> BufOrSlice<B> {
35    #[inline(always)]
36    pub(crate) fn len(&self) -> usize {
37        match self {
38            BufOrSlice::Buf(b) => b.bytes_init(),
39            BufOrSlice::Slice(s) => s.len(),
40        }
41    }
42
43    /// Consume the first `n` bytes of the buffer (assuming they've been written).
44    /// This turns a `BufOrSlice::Buf` into a `BufOrSlice::Slice`
45    pub(crate) fn consume(self, n: usize) -> Self {
46        assert!(n <= self.len());
47
48        match self {
49            BufOrSlice::Buf(b) => BufOrSlice::Slice(b.slice(n..)),
50            BufOrSlice::Slice(s) => {
51                let n = s.begin() + n;
52                BufOrSlice::Slice(s.into_inner().slice(n..))
53            }
54        }
55    }
56}