compio_driver/buffer_pool/
fusion.rs1use std::{
2 borrow::{Borrow, BorrowMut},
3 fmt::{Debug, Formatter},
4 ops::{Deref, DerefMut},
5};
6
7pub use fallback::BufferPool as FallbackBufferPool;
8pub(crate) use fallback::OwnedBuffer as FallbackOwnedBuffer;
9pub use iour::BufferPool as IoUringBufferPool;
10pub(crate) use iour::OwnedBuffer as IoUringOwnedBuffer;
11
12use super::{fallback, iour};
13
14pub struct BufferPool {
19 inner: BufferPollInner,
20}
21
22impl Debug for BufferPool {
23 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
24 f.debug_struct("BufferPool").finish_non_exhaustive()
25 }
26}
27
28impl BufferPool {
29 pub(crate) fn is_io_uring(&self) -> bool {
30 matches!(&self.inner, BufferPollInner::IoUring(_))
31 }
32
33 pub(crate) fn new_io_uring(buffer_pool: iour::BufferPool) -> Self {
34 Self {
35 inner: BufferPollInner::IoUring(buffer_pool),
36 }
37 }
38
39 pub(crate) fn as_io_uring(&self) -> &iour::BufferPool {
40 match &self.inner {
41 BufferPollInner::IoUring(inner) => inner,
42 BufferPollInner::Poll(_) => panic!("BufferPool type is not poll type"),
43 }
44 }
45
46 pub(crate) fn as_poll(&self) -> &fallback::BufferPool {
47 match &self.inner {
48 BufferPollInner::Poll(inner) => inner,
49 BufferPollInner::IoUring(_) => panic!("BufferPool type is not io-uring type"),
50 }
51 }
52
53 pub(crate) fn new_poll(buffer_pool: fallback::BufferPool) -> Self {
54 Self {
55 inner: BufferPollInner::Poll(buffer_pool),
56 }
57 }
58
59 pub(crate) fn into_io_uring(self) -> iour::BufferPool {
60 match self.inner {
61 BufferPollInner::IoUring(inner) => inner,
62 BufferPollInner::Poll(_) => panic!("BufferPool type is not poll type"),
63 }
64 }
65}
66
67enum BufferPollInner {
68 IoUring(iour::BufferPool),
69 Poll(fallback::BufferPool),
70}
71
72pub struct BorrowedBuffer<'a> {
77 inner: BorrowedBufferInner<'a>,
78}
79
80impl<'a> BorrowedBuffer<'a> {
81 pub(crate) fn new_io_uring(buffer: iour::BorrowedBuffer<'a>) -> Self {
82 Self {
83 inner: BorrowedBufferInner::IoUring(buffer),
84 }
85 }
86
87 pub(crate) fn new_poll(buffer: fallback::BorrowedBuffer<'a>) -> Self {
88 Self {
89 inner: BorrowedBufferInner::Poll(buffer),
90 }
91 }
92}
93
94enum BorrowedBufferInner<'a> {
95 IoUring(iour::BorrowedBuffer<'a>),
96 Poll(fallback::BorrowedBuffer<'a>),
97}
98
99impl Debug for BorrowedBuffer<'_> {
100 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
101 f.debug_struct("BorrowedBuffer").finish_non_exhaustive()
102 }
103}
104
105impl Deref for BorrowedBuffer<'_> {
106 type Target = [u8];
107
108 fn deref(&self) -> &Self::Target {
109 match &self.inner {
110 BorrowedBufferInner::IoUring(inner) => inner.deref(),
111 BorrowedBufferInner::Poll(inner) => inner.deref(),
112 }
113 }
114}
115
116impl DerefMut for BorrowedBuffer<'_> {
117 fn deref_mut(&mut self) -> &mut Self::Target {
118 match &mut self.inner {
119 BorrowedBufferInner::IoUring(inner) => inner.deref_mut(),
120 BorrowedBufferInner::Poll(inner) => inner.deref_mut(),
121 }
122 }
123}
124
125impl AsRef<[u8]> for BorrowedBuffer<'_> {
126 fn as_ref(&self) -> &[u8] {
127 self.deref()
128 }
129}
130
131impl AsMut<[u8]> for BorrowedBuffer<'_> {
132 fn as_mut(&mut self) -> &mut [u8] {
133 self.deref_mut()
134 }
135}
136
137impl Borrow<[u8]> for BorrowedBuffer<'_> {
138 fn borrow(&self) -> &[u8] {
139 self.deref()
140 }
141}
142
143impl BorrowMut<[u8]> for BorrowedBuffer<'_> {
144 fn borrow_mut(&mut self) -> &mut [u8] {
145 self.deref_mut()
146 }
147}