#![forbid(missing_docs)]
pub mod arc {
use std::ops::{Deref, DerefMut};
use std::sync::Arc;
use std::any::Any;
pub struct BytesMut {
ptr: *mut u8,
len: usize,
sequestered: Arc<dyn Any>,
}
impl BytesMut {
pub fn from<B>(bytes: B) -> BytesMut where B : DerefMut<Target=[u8]>+Send+'static {
let mut sequestered = Arc::new(bytes) as Arc<dyn Any>;
let (ptr, len) =
Arc::get_mut(&mut sequestered)
.unwrap()
.downcast_mut::<B>()
.map(|a| (a.as_mut_ptr(), a.len()))
.unwrap();
BytesMut {
ptr,
len,
sequestered,
}
}
pub fn extract_to(&mut self, index: usize) -> Bytes {
assert!(index <= self.len);
let result = BytesMut {
ptr: self.ptr,
len: index,
sequestered: Arc::clone(&self.sequestered),
};
self.ptr = self.ptr.wrapping_add(index);
self.len -= index;
result.freeze()
}
pub fn try_regenerate<B>(&mut self) -> Option<bool> where B: DerefMut<Target=[u8]>+'static {
if let Some(boxed) = Arc::get_mut(&mut self.sequestered) {
let downcast = boxed.downcast_mut::<B>()?;
self.ptr = downcast.as_mut_ptr();
self.len = downcast.len();
Some(true)
}
else {
Some(false)
}
}
#[inline(always)]
pub fn freeze(self) -> Bytes {
Bytes {
ptr: self.ptr,
len: self.len,
sequestered: self.sequestered,
}
}
}
impl Deref for BytesMut {
type Target = [u8];
#[inline(always)]
fn deref(&self) -> &[u8] {
unsafe { ::std::slice::from_raw_parts(self.ptr, self.len) }
}
}
impl DerefMut for BytesMut {
#[inline(always)]
fn deref_mut(&mut self) -> &mut [u8] {
unsafe { ::std::slice::from_raw_parts_mut(self.ptr, self.len) }
}
}
#[derive(Clone)]
pub struct Bytes {
ptr: *const u8,
len: usize,
sequestered: Arc<dyn Any>,
}
unsafe impl Send for Bytes { }
unsafe impl Sync for Bytes { }
impl Bytes {
pub fn extract_to(&mut self, index: usize) -> Bytes {
assert!(index <= self.len);
let result = Bytes {
ptr: self.ptr,
len: index,
sequestered: Arc::clone(&self.sequestered),
};
self.ptr = self.ptr.wrapping_add(index);
self.len -= index;
result
}
pub fn try_merge(&mut self, other: Bytes) -> Result<(), Bytes> {
if Arc::ptr_eq(&self.sequestered, &other.sequestered) && ::std::ptr::eq(self.ptr.wrapping_add(self.len), other.ptr) {
self.len += other.len;
Ok(())
}
else {
Err(other)
}
}
}
impl Deref for Bytes {
type Target = [u8];
#[inline(always)]
fn deref(&self) -> &[u8] {
unsafe { ::std::slice::from_raw_parts(self.ptr, self.len) }
}
}
}