|
1 | 1 | // from tokio uring |
2 | 2 |
|
3 | | -use std::mem::{size_of, MaybeUninit}; |
| 3 | +use std::{ |
| 4 | + borrow::Borrow, |
| 5 | + marker::PhantomData, |
| 6 | + mem::{size_of, MaybeUninit}, |
| 7 | +}; |
4 | 8 |
|
5 | | -use bytes::BytesMut; |
| 9 | +use bytes::{Bytes, BytesMut}; |
6 | 10 | use zerocopy::{AsBytes, FromBytes}; |
7 | 11 |
|
8 | 12 | pub unsafe trait IoBuf: Unpin + 'static { |
@@ -90,6 +94,20 @@ unsafe impl IoBuf for BytesMut { |
90 | 94 | } |
91 | 95 | } |
92 | 96 |
|
| 97 | +unsafe impl IoBuf for Bytes { |
| 98 | + fn stable_ptr(&self) -> *const u8 { |
| 99 | + self.as_ptr() |
| 100 | + } |
| 101 | + |
| 102 | + fn bytes_init(&self) -> usize { |
| 103 | + self.len() |
| 104 | + } |
| 105 | + |
| 106 | + fn bytes_total(&self) -> usize { |
| 107 | + self.len() |
| 108 | + } |
| 109 | +} |
| 110 | + |
93 | 111 | unsafe impl IoBufMut for BytesMut { |
94 | 112 | fn stable_mut_ptr(&mut self) -> *mut u8 { |
95 | 113 | self.as_mut_ptr() |
@@ -185,11 +203,11 @@ impl<T> ZeroCopyBuf<T> { |
185 | 203 | } |
186 | 204 | } |
187 | 205 |
|
188 | | - pub fn map_slice<F>(self, f: F) -> MapSlice<T, F> |
| 206 | + pub fn map_slice<F>(self, f: F) -> MapSlice<Self, F, T> |
189 | 207 | where |
190 | 208 | for<'a> F: Fn(&'a Self) -> &'a [u8] + Unpin + 'static, |
191 | 209 | { |
192 | | - MapSlice { inner: self, f } |
| 210 | + MapSlice::new(self, f) |
193 | 211 | } |
194 | 212 |
|
195 | 213 | #[inline] |
@@ -220,32 +238,42 @@ impl<T> ZeroCopyBuf<T> { |
220 | 238 | } |
221 | 239 | } |
222 | 240 |
|
223 | | -pub struct MapSlice<T, F> { |
224 | | - inner: ZeroCopyBuf<T>, |
| 241 | +pub struct MapSlice<T, F, U> { |
| 242 | + inner: T, |
225 | 243 | f: F, |
| 244 | + _p: PhantomData<U>, |
226 | 245 | } |
227 | 246 |
|
228 | | -impl<T, F> MapSlice<T, F> { |
229 | | - pub(crate) fn into_inner(self) -> ZeroCopyBuf<T> { |
| 247 | +impl<T, F, U> MapSlice<T, F, U> { |
| 248 | + pub(crate) fn into_inner(self) -> T { |
230 | 249 | self.inner |
231 | 250 | } |
| 251 | + |
| 252 | + pub(crate) fn new(inner: T, f: F) -> Self { |
| 253 | + Self { |
| 254 | + inner, |
| 255 | + f, |
| 256 | + _p: PhantomData, |
| 257 | + } |
| 258 | + } |
232 | 259 | } |
233 | 260 |
|
234 | | -unsafe impl<T, F> IoBuf for MapSlice<T, F> |
| 261 | +unsafe impl<T, F, U> IoBuf for MapSlice<T, F, U> |
235 | 262 | where |
236 | | - for<'a> F: Fn(&'a ZeroCopyBuf<T>) -> &'a [u8] + Unpin + 'static, |
237 | | - T: Unpin + 'static + AsBytes, |
| 263 | + for<'a> F: Fn(&'a ZeroCopyBuf<U>) -> &'a [u8] + Unpin + 'static, |
| 264 | + T: Borrow<ZeroCopyBuf<U>> + Unpin + 'static, |
| 265 | + U: AsBytes + Unpin + 'static, |
238 | 266 | { |
239 | 267 | fn stable_ptr(&self) -> *const u8 { |
240 | | - (self.f)(&self.inner).as_ptr() |
| 268 | + (self.f)(&self.inner.borrow()).as_ptr() |
241 | 269 | } |
242 | 270 |
|
243 | 271 | fn bytes_init(&self) -> usize { |
244 | | - (self.f)(&self.inner).len() |
| 272 | + (self.f)(&self.inner.borrow()).len() |
245 | 273 | } |
246 | 274 |
|
247 | 275 | fn bytes_total(&self) -> usize { |
248 | | - (self.f)(&self.inner).len() |
| 276 | + (self.f)(&self.inner.borrow()).len() |
249 | 277 | } |
250 | 278 | } |
251 | 279 |
|
|
0 commit comments