#![forbid(missing_docs)]
pub mod arc {
use std::ops::{Deref, DerefMut};
use std::sync::Arc;
use std::any::Any;
pub struct Bytes {
ptr: *mut u8,
len: usize,
sequestered: Arc<dyn Any>,
}
unsafe impl Send for Bytes { }
impl Bytes {
pub fn from<B>(bytes: B) -> Bytes where B : DerefMut<Target=[u8]>+'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();
Bytes {
ptr,
len,
sequestered,
}
}
pub fn extract_to(&mut self, index: usize) -> Bytes {
assert!(index <= self.len);
let result = Bytes {
ptr: self.ptr,
len: index,
sequestered: self.sequestered.clone(),
};
unsafe { self.ptr = self.ptr.offset(index as isize); }
self.len -= index;
result
}
pub fn try_regenerate<B>(&mut self) -> bool where B: DerefMut<Target=[u8]>+'static {
if let Some(boxed) = Arc::get_mut(&mut self.sequestered) {
let downcast = boxed.downcast_mut::<B>().expect("Downcast failed");
self.ptr = downcast.as_mut_ptr();
self.len = downcast.len();
true
}
else {
false
}
}
pub fn try_merge(&mut self, other: Bytes) -> Result<(), Bytes> {
if Arc::ptr_eq(&self.sequestered, &other.sequestered) && ::std::ptr::eq(unsafe { self.ptr.offset(self.len as isize) }, other.ptr) {
self.len += other.len;
Ok(())
}
else {
Err(other)
}
}
}
impl Deref for Bytes {
type Target = [u8];
fn deref(&self) -> &[u8] {
unsafe { ::std::slice::from_raw_parts(self.ptr, self.len) }
}
}
impl DerefMut for Bytes {
fn deref_mut(&mut self) -> &mut [u8] {
unsafe { ::std::slice::from_raw_parts_mut(self.ptr, self.len) }
}
}
}