fluke_maybe_uring/io/
buf_or_slice.rs1use 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 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}