use crate::io::{Buffer, FixedBuffer, FixedBufferMut, SendableSlice, SendableSliceMut};
use crate::utils::Sealed;
use std::collections::Bound;
use std::ops::{Deref, DerefMut, RangeBounds};
pub struct SendableBuffer {
buf: Buffer,
}
impl SendableBuffer {
pub unsafe fn from_buffer(buffer: Buffer) -> Self {
Self { buf: buffer }
}
pub fn slice<R: RangeBounds<u32>>(&self, range: R) -> SendableSlice {
let start = match range.start_bound() {
Bound::Included(s) => *s,
Bound::Unbounded => 0,
Bound::Excluded(s) => *s + 1,
};
let end = match range.end_bound() {
Bound::Included(e) => *e + 1,
Bound::Excluded(e) => *e,
Bound::Unbounded => self.len_u32(),
};
SendableSlice::new(self, start, end)
}
pub fn slice_mut<R: RangeBounds<u32>>(&mut self, range: R) -> SendableSliceMut {
let start = match range.start_bound() {
Bound::Included(s) => *s,
Bound::Unbounded => 0,
Bound::Excluded(s) => *s + 1,
};
let end = match range.end_bound() {
Bound::Included(e) => *e + 1,
Bound::Excluded(e) => *e,
Bound::Unbounded => self.len_u32(),
};
SendableSliceMut::new(self, start, end)
}
}
#[allow(
clippy::non_send_fields_in_send_ty,
reason = "The caller guarantees that `SendableBuffer` is `Send`."
)]
unsafe impl Send for SendableBuffer {}
unsafe impl Sync for SendableBuffer {}
impl Deref for SendableBuffer {
type Target = Buffer;
fn deref(&self) -> &Self::Target {
&self.buf
}
}
impl DerefMut for SendableBuffer {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.buf
}
}
impl Sealed for SendableBuffer {}
impl FixedBuffer for SendableBuffer {
fn as_ptr(&self) -> *const u8 {
self.buf.as_ptr()
}
fn len_u32(&self) -> u32 {
self.buf.len_u32()
}
fn fixed_index(&self) -> u16 {
self.buf.fixed_index()
}
fn is_fixed(&self) -> bool {
self.buf.is_fixed()
}
}
impl FixedBufferMut for SendableBuffer {
fn as_mut_ptr(&mut self) -> *mut u8 {
self.buf.as_mut_ptr()
}
}