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