use std::fmt::{self, Debug, Formatter};
use std::mem;
use std::num::Int;
use std::sync::Arc;
use raw::{Allocator, RawIobuf};
use iobuf::Iobuf;
#[unsafe_no_drop_flag]
pub struct ROIobuf<'a> {
raw: RawIobuf<'a>,
}
#[test]
fn check_sane_roiobuf_size() {
assert_eq!(mem::size_of::<ROIobuf<'static>>(), mem::size_of::<*mut u8>() + 16);
}
impl<'a> Clone for ROIobuf<'a> {
#[inline(always)]
fn clone(&self) -> ROIobuf<'a> {
ROIobuf {
raw: unsafe { self.raw.clone_nonatomic() },
}
}
#[inline(always)]
fn clone_from(&mut self, source: &ROIobuf<'a>) {
unsafe { self.raw.clone_from_nonatomic(&source.raw) }
}
}
#[unsafe_destructor]
impl<'a> Drop for ROIobuf<'a> {
#[inline(always)]
fn drop(&mut self) { unsafe { self.raw.drop_nonatomic() } }
}
#[unsafe_no_drop_flag]
pub struct RWIobuf<'a> {
raw: RawIobuf<'a>,
}
#[test]
fn check_sane_rwiobuf_size() {
assert_eq!(mem::size_of::<RWIobuf<'static>>(), mem::size_of::<*mut u8>() + 16);
}
impl<'a> Clone for RWIobuf<'a> {
#[inline(always)]
fn clone(&self) -> RWIobuf<'a> {
RWIobuf {
raw: unsafe { self.raw.clone_nonatomic() },
}
}
#[inline(always)]
fn clone_from(&mut self, source: &RWIobuf<'a>) {
unsafe { self.raw.clone_from_nonatomic(&source.raw) }
}
}
#[unsafe_destructor]
impl<'a> Drop for RWIobuf<'a> {
#[inline(always)]
fn drop(&mut self) { unsafe { self.raw.drop_nonatomic() } }
}
#[unsafe_no_drop_flag]
pub struct AROIobuf {
raw: RawIobuf<'static>,
}
unsafe impl Send for AROIobuf {}
unsafe impl Sync for AROIobuf {}
impl Clone for AROIobuf {
#[inline(always)]
fn clone(&self) -> AROIobuf { AROIobuf { raw: unsafe { self.raw.clone_atomic() } } }
#[inline(always)]
fn clone_from(&mut self, source: &AROIobuf) { unsafe { self.raw.clone_from_atomic(&source.raw) } }
}
impl Drop for AROIobuf {
#[inline(always)]
fn drop(&mut self) { unsafe { self.raw.drop_atomic() } }
}
#[unsafe_no_drop_flag]
pub struct UniqueIobuf {
raw: RawIobuf<'static>,
}
unsafe impl Send for UniqueIobuf {}
unsafe impl Sync for UniqueIobuf {}
impl UniqueIobuf {
#[inline(always)]
pub fn read_only(self) -> ROIobuf<'static> {
unsafe { mem::transmute(self) }
}
#[inline(always)]
pub fn read_write(self) -> RWIobuf<'static> {
unsafe { mem::transmute(self) }
}
#[inline(always)]
pub fn atomic_read_only(self) -> AROIobuf {
unsafe { mem::transmute(self) }
}
}
impl Drop for UniqueIobuf {
#[inline(always)]
fn drop(&mut self) { unsafe { self.raw.drop_nonatomic() } }
}
impl<'a> ROIobuf<'a> {
#[inline(always)]
pub fn empty() -> ROIobuf<'static> {
ROIobuf { raw: RawIobuf::empty() }
}
#[inline(always)]
pub fn from_str(s: &'a str) -> ROIobuf<'a> {
ROIobuf { raw: RawIobuf::from_str(s) }
}
#[inline(always)]
pub fn from_str_copy(s: &str) -> ROIobuf<'static> {
ROIobuf { raw: RawIobuf::from_str_copy(s) }
}
#[inline(always)]
pub fn from_str_copy_with_allocator(s: &str, allocator: Arc<Box<Allocator>>) -> ROIobuf<'static> {
ROIobuf { raw: RawIobuf::from_str_copy_with_allocator(s, allocator) }
}
#[inline(always)]
pub fn from_slice_copy(s: &[u8]) -> ROIobuf<'static> {
ROIobuf { raw: RawIobuf::from_slice_copy(s) }
}
#[inline(always)]
pub fn from_slice_copy_with_allocator(s: &[u8], allocator: Arc<Box<Allocator>>) -> ROIobuf<'static> {
ROIobuf { raw: RawIobuf::from_slice_copy_with_allocator(s, allocator) }
}
#[inline(always)]
pub fn from_slice(s: &'a [u8]) -> ROIobuf<'a> {
ROIobuf { raw: RawIobuf::from_slice(s) }
}
}
impl<'a> RWIobuf<'a> {
#[inline(always)]
pub fn empty() -> RWIobuf<'static> {
RWIobuf { raw: RawIobuf::empty() }
}
#[inline(always)]
pub fn new(len: usize) -> RWIobuf<'static> {
RWIobuf { raw: RawIobuf::new(len) }
}
#[inline(always)]
pub fn new_with_allocator(len: usize, allocator: Arc<Box<Allocator>>) -> RWIobuf<'static> {
RWIobuf { raw: RawIobuf::new_with_allocator(len, allocator) }
}
#[inline(always)]
pub fn from_str_copy(s: &str) -> RWIobuf<'static> {
RWIobuf { raw: RawIobuf::from_str_copy(s) }
}
#[inline(always)]
pub fn from_str_copy_with_allocator(s: &str, allocator: Arc<Box<Allocator>>) -> RWIobuf<'static> {
RWIobuf { raw: RawIobuf::from_str_copy_with_allocator(s, allocator) }
}
#[inline(always)]
pub fn from_slice(s: &'a mut [u8]) -> RWIobuf<'a> {
RWIobuf { raw: RawIobuf::from_slice(s) }
}
#[inline(always)]
pub fn from_slice_copy(s: &[u8]) -> RWIobuf<'static> {
RWIobuf { raw: RawIobuf::from_slice_copy(s) }
}
#[inline(always)]
pub fn from_slice_copy_with_allocator(s: &[u8], allocator: Arc<Box<Allocator>>) -> RWIobuf<'static> {
RWIobuf { raw: RawIobuf::from_slice_copy_with_allocator(s, allocator) }
}
#[inline(always)]
pub unsafe fn as_mut_window_slice<'b>(&'b self) -> &'b mut [u8] {
self.raw.as_mut_window_slice()
}
#[inline(always)]
pub unsafe fn as_mut_limit_slice<'b>(&'b self) -> &'b mut [u8] {
self.raw.as_mut_limit_slice()
}
#[inline(always)]
pub fn read_only(&self) -> ROIobuf<'a> {
ROIobuf { raw: unsafe { self.raw.clone_nonatomic() } }
}
#[inline(always)]
pub fn compact(&mut self) { self.raw.compact() }
#[inline(always)]
pub fn poke(&self, pos: u32, src: &[u8]) -> Result<(), ()> { self.raw.poke(pos, src) }
#[inline(always)]
pub fn poke_be<T: Int>(&self, pos: u32, t: T) -> Result<(), ()> { self.raw.poke_be(pos, t) }
#[inline(always)]
pub fn poke_le<T: Int>(&self, pos: u32, t: T) -> Result<(), ()> { self.raw.poke_le(pos, t) }
#[inline(always)]
pub fn fill(&mut self, src: &[u8]) -> Result<(), ()> { self.raw.fill(src) }
#[inline(always)]
pub fn fill_be<T: Int>(&mut self, t: T) -> Result<(), ()> { self.raw.fill_be(t) }
#[inline(always)]
pub fn fill_le<T: Int>(&mut self, t: T) -> Result<(), ()> { self.raw.fill_le(t) }
#[inline(always)]
pub unsafe fn unsafe_poke(&self, pos: u32, src: &[u8]) { self.raw.unsafe_poke(pos, src) }
#[inline(always)]
pub unsafe fn unsafe_poke_be<T: Int>(&self, pos: u32, t: T) { self.raw.unsafe_poke_be(pos, t) }
#[inline(always)]
pub unsafe fn unsafe_poke_le<T: Int>(&self, pos: u32, t: T) { self.raw.unsafe_poke_le(pos, t) }
#[inline(always)]
pub unsafe fn unsafe_fill(&mut self, src: &[u8]) { self.raw.unsafe_fill(src) }
#[inline(always)]
pub unsafe fn unsafe_fill_be<T: Int>(&mut self, t: T) { self.raw.unsafe_fill_be(t) }
#[inline(always)]
pub unsafe fn unsafe_fill_le<T: Int>(&mut self, t: T) { self.raw.unsafe_fill_le(t) }
}
impl AROIobuf {
#[inline(always)]
pub fn read_only(self) -> Result<ROIobuf<'static>, AROIobuf> {
unsafe {
if self.raw.is_unique_atomic() {
Ok(mem::transmute(self))
} else {
Err(self)
}
}
}
#[inline(always)]
pub fn read_write(self) -> Result<RWIobuf<'static>, AROIobuf> {
unsafe {
if self.raw.is_unique_atomic() {
Ok(mem::transmute(self))
} else {
Err(self)
}
}
}
}
impl<'a> Iobuf for ROIobuf<'a> {
#[inline(always)]
fn deep_clone(&self) -> RWIobuf<'static> { RWIobuf { raw: self.raw.deep_clone() } }
#[inline(always)]
fn deep_clone_with_allocator(&self, allocator: Arc<Box<Allocator>>) -> RWIobuf<'static> {
RWIobuf { raw: self.raw.deep_clone_with_allocator(allocator) }
}
#[inline(always)]
fn unique(self) -> Result<UniqueIobuf, ROIobuf<'a>> {
unsafe {
if self.raw.is_unique_nonatomic() {
Ok(mem::transmute(self))
} else {
Err(self)
}
}
}
#[inline(always)]
fn atomic_read_only(self) -> Result<AROIobuf, ROIobuf<'a>> {
unsafe {
if self.raw.is_unique_nonatomic() {
Ok(mem::transmute(self))
} else {
Err(self)
}
}
}
#[inline(always)]
fn len(&self) -> u32 { self.raw.len() }
#[inline(always)]
fn cap(&self) -> u32 { self.raw.cap() }
#[inline(always)]
fn is_empty(&self) -> bool { self.raw.is_empty() }
#[inline(always)]
unsafe fn as_window_slice<'b>(&'b self) -> &'b [u8] { self.raw.as_window_slice() }
#[inline(always)]
unsafe fn as_limit_slice<'b>(&'b self) -> &'b [u8] { self.raw.as_limit_slice() }
#[inline(always)]
fn sub_window(&mut self, pos: u32, len: u32) -> Result<(), ()> { self.raw.sub_window(pos, len) }
#[inline(always)]
fn sub_window_from(&mut self, pos: u32) -> Result<(), ()> { self.raw.sub_window_from(pos) }
#[inline(always)]
fn sub_window_to(&mut self, len: u32) -> Result<(), ()> { self.raw.sub_window_to(len) }
#[inline(always)]
unsafe fn unsafe_sub_window(&mut self, pos: u32, len: u32) { self.raw.unsafe_sub_window(pos, len) }
#[inline(always)]
unsafe fn unsafe_sub_window_from(&mut self, pos: u32) { self.raw.unsafe_sub_window_from(pos) }
#[inline(always)]
unsafe fn unsafe_sub_window_to(&mut self, len: u32) { self.raw.unsafe_sub_window_to(len) }
#[inline(always)]
fn sub(&mut self, pos: u32, len: u32) -> Result<(), ()> { self.raw.sub(pos, len) }
#[inline(always)]
fn sub_from(&mut self, pos: u32) -> Result<(), ()> { self.raw.sub_from(pos) }
#[inline(always)]
fn sub_to(&mut self, len: u32) -> Result<(), ()> { self.raw.sub_to(len) }
#[inline(always)]
unsafe fn unsafe_sub(&mut self, pos: u32, len: u32) { self.raw.unsafe_sub(pos, len) }
#[inline(always)]
unsafe fn unsafe_sub_from(&mut self, pos: u32) { self.raw.unsafe_sub_from(pos) }
#[inline(always)]
unsafe fn unsafe_sub_to(&mut self, len: u32) { self.raw.unsafe_sub_to(len) }
#[inline(always)]
fn set_limits_and_window(&mut self, limits: (u32, u32), window: (u32, u32)) -> Result<(), ()> { self.raw.set_limits_and_window(limits, window) }
#[inline(always)]
fn narrow(&mut self) { self.raw.narrow() }
#[inline(always)]
fn advance(&mut self, len: u32) -> Result<(), ()> { self.raw.advance(len) }
#[inline(always)]
unsafe fn unsafe_advance(&mut self, len: u32) { self.raw.unsafe_advance(len) }
#[inline(always)]
fn extend(&mut self, len: u32) -> Result<(), ()> { self.raw.extend(len) }
#[inline(always)]
unsafe fn unsafe_extend(&mut self, len: u32) { self.raw.unsafe_extend(len) }
#[inline(always)]
fn is_extended_by<Buf: Iobuf>(&self, other: &Buf) -> bool { unsafe { self.raw.is_extended_by(other.as_raw()) } }
#[inline(always)]
fn extend_with<Buf: Iobuf>(&mut self, other: &Buf) -> Result<(), ()> { unsafe { self.raw.extend_with(other.as_raw()) } }
#[inline(always)]
fn resize(&mut self, len: u32) -> Result<(), ()> { self.raw.resize(len) }
#[inline(always)]
unsafe fn unsafe_resize(&mut self, len: u32) { self.raw.unsafe_resize(len) }
#[inline(always)]
fn split_at(&self, pos: u32) -> Result<(ROIobuf<'a>, ROIobuf<'a>), ()> {
self.raw.split_at_nonatomic(pos).map(|(a, b)| (ROIobuf { raw: a }, ROIobuf { raw: b }))
}
#[inline(always)]
unsafe fn unsafe_split_at(&self, pos: u32) -> (ROIobuf<'a>, ROIobuf<'a>) {
let (a, b) = self.raw.unsafe_split_at_nonatomic(pos);
(ROIobuf { raw: a }, ROIobuf { raw: b })
}
#[inline(always)]
fn split_start_at(&mut self, pos: u32) -> Result<ROIobuf<'a>, ()> {
self.raw.split_start_at_nonatomic(pos).map(|b| ROIobuf { raw: b })
}
#[inline(always)]
unsafe fn unsafe_split_start_at(&mut self, pos: u32) -> ROIobuf<'a> {
ROIobuf { raw: self.raw.unsafe_split_start_at_nonatomic(pos) }
}
#[inline(always)]
fn rewind(&mut self) { self.raw.rewind() }
#[inline(always)]
fn reset(&mut self) { self.raw.reset() }
#[inline(always)]
fn flip_lo(&mut self) { self.raw.flip_lo() }
#[inline(always)]
fn flip_hi(&mut self) { self.raw.flip_hi() }
#[inline(always)]
fn lo_space(&self) -> u32 { self.raw.lo_space() }
#[inline(always)]
fn hi_space(&self) -> u32 { self.raw.hi_space() }
#[inline(always)]
fn peek(&self, pos: u32, dst: &mut [u8]) -> Result<(), ()> { self.raw.peek(pos, dst) }
#[inline(always)]
fn peek_be<T: Int>(&self, pos: u32) -> Result<T, ()> { self.raw.peek_be(pos) }
#[inline(always)]
fn peek_le<T: Int>(&self, pos: u32) -> Result<T, ()> { self.raw.peek_le(pos) }
#[inline(always)]
fn consume(&mut self, dst: &mut [u8]) -> Result<(), ()> { self.raw.consume(dst) }
#[inline(always)]
fn consume_be<T: Int>(&mut self) -> Result<T, ()> { self.raw.consume_be::<T>() }
#[inline(always)]
fn consume_le<T: Int>(&mut self) -> Result<T, ()> { self.raw.consume_le::<T>() }
#[inline(always)]
fn check_range(&self, pos: u32, len: u32) -> Result<(), ()> { self.raw.check_range_u32(pos, len) }
#[inline(always)]
fn check_range_usize(&self, pos: u32, len: usize) -> Result<(), ()> { self.raw.check_range_usize(pos, len) }
#[inline(always)]
fn check_range_fail(&self, pos: u32, len: u32) { self.raw.check_range_u32_fail(pos, len) }
#[inline(always)]
fn check_range_usize_fail(&self, pos: u32, len: usize) { self.raw.check_range_usize_fail(pos, len) }
#[inline(always)]
unsafe fn unsafe_peek(&self, pos: u32, dst: &mut [u8]) { self.raw.unsafe_peek(pos, dst) }
#[inline(always)]
unsafe fn unsafe_peek_be<T: Int>(&self, pos: u32) -> T { self.raw.unsafe_peek_be(pos) }
#[inline(always)]
unsafe fn unsafe_peek_le<T: Int>(&self, pos: u32) -> T { self.raw.unsafe_peek_le(pos) }
#[inline(always)]
unsafe fn unsafe_consume(&mut self, dst: &mut [u8]) { self.raw.unsafe_consume(dst) }
#[inline(always)]
unsafe fn unsafe_consume_be<T: Int>(&mut self) -> T { self.raw.unsafe_consume_be::<T>() }
#[inline(always)]
unsafe fn unsafe_consume_le<T: Int>(&mut self) -> T { self.raw.unsafe_consume_le::<T>() }
#[inline(always)]
unsafe fn as_raw<'b>(&'b self) -> &RawIobuf<'b> { mem::transmute(&self.raw) }
#[inline(always)]
fn ptr(&self) -> *mut u8 { self.raw.ptr() }
#[inline(always)]
fn is_owned(&self) -> bool { self.raw.is_owned() }
#[inline(always)]
fn lo_min(&self) -> u32 { self.raw.lo_min() }
#[inline(always)]
fn lo(&self) -> u32 { self.raw.lo() }
#[inline(always)]
fn hi(&self) -> u32 { self.raw.hi() }
#[inline(always)]
fn hi_max(&self) -> u32 { self.raw.hi_max() }
}
impl Iobuf for AROIobuf {
#[inline(always)]
fn deep_clone(&self) -> RWIobuf<'static> {
RWIobuf { raw: self.raw.deep_clone() }
}
#[inline(always)]
fn deep_clone_with_allocator(&self, allocator: Arc<Box<Allocator>>) -> RWIobuf<'static> {
RWIobuf { raw: self.raw.deep_clone_with_allocator(allocator) }
}
#[inline(always)]
fn unique(self) -> Result<UniqueIobuf, AROIobuf> {
unsafe {
if self.raw.is_unique_atomic() {
Ok(mem::transmute(self))
} else {
Err(self)
}
}
}
#[inline(always)]
fn atomic_read_only(self) -> Result<AROIobuf, AROIobuf> {
Ok(self)
}
#[inline(always)]
fn len(&self) -> u32 { self.raw.len() }
#[inline(always)]
fn cap(&self) -> u32 { self.raw.cap() }
#[inline(always)]
fn is_empty(&self) -> bool { self.raw.is_empty() }
#[inline(always)]
unsafe fn as_window_slice<'b>(&'b self) -> &'b [u8] { self.raw.as_window_slice() }
#[inline(always)]
unsafe fn as_limit_slice<'b>(&'b self) -> &'b [u8] { self.raw.as_limit_slice() }
#[inline(always)]
fn sub_window(&mut self, pos: u32, len: u32) -> Result<(), ()> { self.raw.sub_window(pos, len) }
#[inline(always)]
fn sub_window_from(&mut self, pos: u32) -> Result<(), ()> { self.raw.sub_window_from(pos) }
#[inline(always)]
fn sub_window_to(&mut self, len: u32) -> Result<(), ()> { self.raw.sub_window_to(len) }
#[inline(always)]
unsafe fn unsafe_sub_window(&mut self, pos: u32, len: u32) { self.raw.unsafe_sub_window(pos, len) }
#[inline(always)]
unsafe fn unsafe_sub_window_from(&mut self, pos: u32) { self.raw.unsafe_sub_window_from(pos) }
#[inline(always)]
unsafe fn unsafe_sub_window_to(&mut self, len: u32) { self.raw.unsafe_sub_window_to(len) }
#[inline(always)]
fn sub(&mut self, pos: u32, len: u32) -> Result<(), ()> { self.raw.sub(pos, len) }
#[inline(always)]
fn sub_from(&mut self, pos: u32) -> Result<(), ()> { self.raw.sub_from(pos) }
#[inline(always)]
fn sub_to(&mut self, len: u32) -> Result<(), ()> { self.raw.sub_to(len) }
#[inline(always)]
unsafe fn unsafe_sub(&mut self, pos: u32, len: u32) { self.raw.unsafe_sub(pos, len) }
#[inline(always)]
unsafe fn unsafe_sub_from(&mut self, pos: u32) { self.raw.unsafe_sub_from(pos) }
#[inline(always)]
unsafe fn unsafe_sub_to(&mut self, len: u32) { self.raw.unsafe_sub_to(len) }
#[inline(always)]
fn set_limits_and_window(&mut self, limits: (u32, u32), window: (u32, u32)) -> Result<(), ()> { self.raw.set_limits_and_window(limits, window) }
#[inline(always)]
fn narrow(&mut self) { self.raw.narrow() }
#[inline(always)]
fn advance(&mut self, len: u32) -> Result<(), ()> { self.raw.advance(len) }
#[inline(always)]
unsafe fn unsafe_advance(&mut self, len: u32) { self.raw.unsafe_advance(len) }
#[inline(always)]
fn extend(&mut self, len: u32) -> Result<(), ()> { self.raw.extend(len) }
#[inline(always)]
unsafe fn unsafe_extend(&mut self, len: u32) { self.raw.unsafe_extend(len) }
#[inline(always)]
fn is_extended_by<Buf: Iobuf>(&self, other: &Buf) -> bool { unsafe { self.raw.is_extended_by(other.as_raw()) } }
#[inline(always)]
fn extend_with<Buf: Iobuf>(&mut self, other: &Buf) -> Result<(), ()> { unsafe { self.raw.extend_with(other.as_raw()) } }
#[inline(always)]
fn resize(&mut self, len: u32) -> Result<(), ()> { self.raw.resize(len) }
#[inline(always)]
unsafe fn unsafe_resize(&mut self, len: u32) { self.raw.unsafe_resize(len) }
#[inline(always)]
fn split_at(&self, pos: u32) -> Result<(AROIobuf, AROIobuf), ()> {
self.raw.split_at_atomic(pos).map(
|(a, b)| (AROIobuf { raw: a },
AROIobuf { raw: b }))
}
#[inline(always)]
unsafe fn unsafe_split_at(&self, pos: u32) -> (AROIobuf, AROIobuf) {
let (a, b) = self.raw.unsafe_split_at_atomic(pos);
(AROIobuf { raw: a },
AROIobuf { raw: b })
}
#[inline(always)]
fn split_start_at(&mut self, pos: u32) -> Result<AROIobuf, ()> {
self.raw.split_start_at_atomic(pos).map(
|b| AROIobuf { raw: b })
}
#[inline(always)]
unsafe fn unsafe_split_start_at(&mut self, pos: u32) -> AROIobuf {
AROIobuf { raw: self.raw.unsafe_split_start_at_atomic(pos) }
}
#[inline(always)]
fn rewind(&mut self) { self.raw.rewind() }
#[inline(always)]
fn reset(&mut self) { self.raw.reset() }
#[inline(always)]
fn flip_lo(&mut self) { self.raw.flip_lo() }
#[inline(always)]
fn flip_hi(&mut self) { self.raw.flip_hi() }
#[inline(always)]
fn lo_space(&self) -> u32 { self.raw.lo_space() }
#[inline(always)]
fn hi_space(&self) -> u32 { self.raw.hi_space() }
#[inline(always)]
fn peek(&self, pos: u32, dst: &mut [u8]) -> Result<(), ()> { self.raw.peek(pos, dst) }
#[inline(always)]
fn peek_be<T: Int>(&self, pos: u32) -> Result<T, ()> { self.raw.peek_be(pos) }
#[inline(always)]
fn peek_le<T: Int>(&self, pos: u32) -> Result<T, ()> { self.raw.peek_le(pos) }
#[inline(always)]
fn consume(&mut self, dst: &mut [u8]) -> Result<(), ()> { self.raw.consume(dst) }
#[inline(always)]
fn consume_be<T: Int>(&mut self) -> Result<T, ()> { self.raw.consume_be::<T>() }
#[inline(always)]
fn consume_le<T: Int>(&mut self) -> Result<T, ()> { self.raw.consume_le::<T>() }
#[inline(always)]
fn check_range(&self, pos: u32, len: u32) -> Result<(), ()> { self.raw.check_range_u32(pos, len) }
#[inline(always)]
fn check_range_usize(&self, pos: u32, len: usize) -> Result<(), ()> { self.raw.check_range_usize(pos, len) }
#[inline(always)]
fn check_range_fail(&self, pos: u32, len: u32) { self.raw.check_range_u32_fail(pos, len) }
#[inline(always)]
fn check_range_usize_fail(&self, pos: u32, len: usize) { self.raw.check_range_usize_fail(pos, len) }
#[inline(always)]
unsafe fn unsafe_peek(&self, pos: u32, dst: &mut [u8]) { self.raw.unsafe_peek(pos, dst) }
#[inline(always)]
unsafe fn unsafe_peek_be<T: Int>(&self, pos: u32) -> T { self.raw.unsafe_peek_be(pos) }
#[inline(always)]
unsafe fn unsafe_peek_le<T: Int>(&self, pos: u32) -> T { self.raw.unsafe_peek_le(pos) }
#[inline(always)]
unsafe fn unsafe_consume(&mut self, dst: &mut [u8]) { self.raw.unsafe_consume(dst) }
#[inline(always)]
unsafe fn unsafe_consume_be<T: Int>(&mut self) -> T { self.raw.unsafe_consume_be::<T>() }
#[inline(always)]
unsafe fn unsafe_consume_le<T: Int>(&mut self) -> T { self.raw.unsafe_consume_le::<T>() }
#[inline(always)]
unsafe fn as_raw<'b>(&'b self) -> &RawIobuf<'b> { mem::transmute(&self.raw) }
#[inline(always)]
fn ptr(&self) -> *mut u8 { self.raw.ptr() }
#[inline(always)]
fn is_owned(&self) -> bool { self.raw.is_owned() }
#[inline(always)]
fn lo_min(&self) -> u32 { self.raw.lo_min() }
#[inline(always)]
fn lo(&self) -> u32 { self.raw.lo() }
#[inline(always)]
fn hi(&self) -> u32 { self.raw.hi() }
#[inline(always)]
fn hi_max(&self) -> u32 { self.raw.hi_max() }
}
impl<'a> Iobuf for RWIobuf<'a> {
#[inline(always)]
fn deep_clone(&self) -> RWIobuf<'static> { RWIobuf { raw: self.raw.deep_clone() } }
#[inline(always)]
fn deep_clone_with_allocator(&self, allocator: Arc<Box<Allocator>>) -> RWIobuf<'static> {
RWIobuf { raw: self.raw.deep_clone_with_allocator(allocator) }
}
#[inline(always)]
fn unique(self) -> Result<UniqueIobuf, RWIobuf<'a>> {
unsafe {
if self.raw.is_unique_atomic() {
Ok(mem::transmute(self))
} else {
Err(self)
}
}
}
#[inline(always)]
fn atomic_read_only(self) -> Result<AROIobuf, RWIobuf<'a>> {
unsafe {
if self.raw.is_unique_nonatomic() {
Ok(mem::transmute(self))
} else {
Err(self)
}
}
}
#[inline(always)]
fn len(&self) -> u32 { self.raw.len() }
#[inline(always)]
fn cap(&self) -> u32 { self.raw.cap() }
#[inline(always)]
fn is_empty(&self) -> bool { self.raw.is_empty() }
#[inline(always)]
unsafe fn as_window_slice<'b>(&'b self) -> &'b [u8] { self.raw.as_window_slice() }
#[inline(always)]
unsafe fn as_limit_slice<'b>(&'b self) -> &'b [u8] { self.raw.as_limit_slice() }
#[inline(always)]
fn sub_window(&mut self, pos: u32, len: u32) -> Result<(), ()> { self.raw.sub_window(pos, len) }
#[inline(always)]
fn sub_window_from(&mut self, pos: u32) -> Result<(), ()> { self.raw.sub_window_from(pos) }
#[inline(always)]
fn sub_window_to(&mut self, len: u32) -> Result<(), ()> { self.raw.sub_window_to(len) }
#[inline(always)]
unsafe fn unsafe_sub_window(&mut self, pos: u32, len: u32) { self.raw.unsafe_sub_window(pos, len) }
#[inline(always)]
unsafe fn unsafe_sub_window_from(&mut self, pos: u32) { self.raw.unsafe_sub_window_from(pos) }
#[inline(always)]
unsafe fn unsafe_sub_window_to(&mut self, len: u32) { self.raw.unsafe_sub_window_to(len) }
#[inline(always)]
fn sub(&mut self, pos: u32, len: u32) -> Result<(), ()> { self.raw.sub(pos, len) }
#[inline(always)]
fn sub_from(&mut self, pos: u32) -> Result<(), ()> { self.raw.sub_from(pos) }
#[inline(always)]
fn sub_to(&mut self, len: u32) -> Result<(), ()> { self.raw.sub_to(len) }
#[inline(always)]
unsafe fn unsafe_sub(&mut self, pos: u32, len: u32) { self.raw.unsafe_sub(pos, len) }
#[inline(always)]
unsafe fn unsafe_sub_from(&mut self, pos: u32) { self.raw.unsafe_sub_from(pos) }
#[inline(always)]
unsafe fn unsafe_sub_to(&mut self, len: u32) { self.raw.unsafe_sub_to(len) }
#[inline(always)]
fn set_limits_and_window(&mut self, limits: (u32, u32), window: (u32, u32)) -> Result<(), ()> { self.raw.set_limits_and_window(limits, window) }
#[inline(always)]
fn narrow(&mut self) { self.raw.narrow() }
#[inline(always)]
fn advance(&mut self, len: u32) -> Result<(), ()> { self.raw.advance(len) }
#[inline(always)]
unsafe fn unsafe_advance(&mut self, len: u32) { self.raw.unsafe_advance(len) }
#[inline(always)]
fn extend(&mut self, len: u32) -> Result<(), ()> { self.raw.extend(len) }
#[inline(always)]
unsafe fn unsafe_extend(&mut self, len: u32) { self.raw.unsafe_extend(len) }
#[inline(always)]
fn is_extended_by<Buf: Iobuf>(&self, other: &Buf) -> bool { unsafe { self.raw.is_extended_by(other.as_raw()) } }
#[inline(always)]
fn extend_with<Buf: Iobuf>(&mut self, other: &Buf) -> Result<(), ()> { unsafe { self.raw.extend_with(other.as_raw()) } }
#[inline(always)]
fn resize(&mut self, len: u32) -> Result<(), ()> { self.raw.resize(len) }
#[inline(always)]
unsafe fn unsafe_resize(&mut self, len: u32) { self.raw.unsafe_resize(len) }
#[inline(always)]
fn split_at(&self, pos: u32) -> Result<(RWIobuf<'a>, RWIobuf<'a>), ()> {
self.raw.split_at_nonatomic(pos).map(|(a, b)| (RWIobuf { raw: a }, RWIobuf { raw: b }))
}
#[inline(always)]
unsafe fn unsafe_split_at(&self, pos: u32) -> (RWIobuf<'a>, RWIobuf<'a>) {
let (a, b) = self.raw.unsafe_split_at_nonatomic(pos);
(RWIobuf { raw: a }, RWIobuf { raw: b })
}
#[inline(always)]
fn split_start_at(&mut self, pos: u32) -> Result<RWIobuf<'a>, ()> {
self.raw.split_start_at_nonatomic(pos).map(|b| RWIobuf { raw: b })
}
#[inline(always)]
unsafe fn unsafe_split_start_at(&mut self, pos: u32) -> RWIobuf<'a> {
RWIobuf { raw: self.raw.unsafe_split_start_at_nonatomic(pos) }
}
#[inline(always)]
fn rewind(&mut self) { self.raw.rewind() }
#[inline(always)]
fn reset(&mut self) { self.raw.reset() }
#[inline(always)]
fn flip_lo(&mut self) { self.raw.flip_lo() }
#[inline(always)]
fn flip_hi(&mut self) { self.raw.flip_hi() }
#[inline(always)]
fn lo_space(&self) -> u32 { self.raw.lo_space() }
#[inline(always)]
fn hi_space(&self) -> u32 { self.raw.hi_space() }
#[inline(always)]
fn peek(&self, pos: u32, dst: &mut [u8]) -> Result<(), ()> { self.raw.peek(pos, dst) }
#[inline(always)]
fn peek_be<T: Int>(&self, pos: u32) -> Result<T, ()> { self.raw.peek_be(pos) }
#[inline(always)]
fn peek_le<T: Int>(&self, pos: u32) -> Result<T, ()> { self.raw.peek_le(pos) }
#[inline(always)]
fn consume(&mut self, dst: &mut [u8]) -> Result<(), ()> { self.raw.consume(dst) }
#[inline(always)]
fn consume_be<T: Int>(&mut self) -> Result<T, ()> { self.raw.consume_be::<T>() }
#[inline(always)]
fn consume_le<T: Int>(&mut self) -> Result<T, ()> { self.raw.consume_le::<T>() }
#[inline(always)]
fn check_range(&self, pos: u32, len: u32) -> Result<(), ()> { self.raw.check_range_u32(pos, len) }
#[inline(always)]
fn check_range_usize(&self, pos: u32, len: usize) -> Result<(), ()> { self.raw.check_range_usize(pos, len) }
#[inline(always)]
fn check_range_fail(&self, pos: u32, len: u32) { self.raw.check_range_u32_fail(pos, len) }
#[inline(always)]
fn check_range_usize_fail(&self, pos: u32, len: usize) { self.raw.check_range_usize_fail(pos, len) }
#[inline(always)]
unsafe fn unsafe_peek(&self, pos: u32, dst: &mut [u8]) { self.raw.unsafe_peek(pos, dst) }
#[inline(always)]
unsafe fn unsafe_peek_be<T: Int>(&self, pos: u32) -> T { self.raw.unsafe_peek_be(pos) }
#[inline(always)]
unsafe fn unsafe_peek_le<T: Int>(&self, pos: u32) -> T { self.raw.unsafe_peek_le(pos) }
#[inline(always)]
unsafe fn unsafe_consume(&mut self, dst: &mut [u8]) { self.raw.unsafe_consume(dst) }
#[inline(always)]
unsafe fn unsafe_consume_be<T: Int>(&mut self) -> T { self.raw.unsafe_consume_be::<T>() }
#[inline(always)]
unsafe fn unsafe_consume_le<T: Int>(&mut self) -> T { self.raw.unsafe_consume_le::<T>() }
#[inline(always)]
unsafe fn as_raw<'b>(&'b self) -> &'b RawIobuf<'b> { mem::transmute(&self.raw) }
#[inline(always)]
fn ptr(&self) -> *mut u8 { self.raw.ptr() }
#[inline(always)]
fn is_owned(&self) -> bool { self.raw.is_owned() }
#[inline(always)]
fn lo_min(&self) -> u32 { self.raw.lo_min() }
#[inline(always)]
fn lo(&self) -> u32 { self.raw.lo() }
#[inline(always)]
fn hi(&self) -> u32 { self.raw.hi() }
#[inline(always)]
fn hi_max(&self) -> u32 { self.raw.hi_max() }
}
impl<'a> Debug for ROIobuf<'a> {
#[inline]
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
self.raw.show(f, "read-only")
}
}
impl<'a> Debug for RWIobuf<'a> {
#[inline]
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
self.raw.show(f, "read-write")
}
}
impl Debug for AROIobuf {
#[inline]
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
self.raw.show(f, "atomic read-only")
}
}
impl Debug for UniqueIobuf {
#[inline]
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
self.raw.show(f, "unique")
}
}
#[cfg(never)]
mod test {
use impls::AROIobuf;
use iobuf::Iobuf;
use quickcheck::{quickcheck, Arbitrary, Gen, Shrinker};
impl Arbitrary for AROIobuf {
fn arbitrary<G: Gen>(g: &mut G) -> AROIobuf {
let data: Vec<u8> = Arbitrary::arbitrary(g);
assert!(data.len() < u32::MAX as usize);
let (a, b, c, d): (u32, u32, u32, u32) = Arbitrary::arbitrary(g);
let hi_max = a % (data.len() as u32 + 1);
let hi = b % (hi_max + 1);
let lo = c % (hi + 1);
let lo_min = d % (lo + 1);
let mut buf = ROIobuf::from_slice_copy(data[]);
buf.set_limits_and_window((lo_min, hi_max), (lo, hi)).unwrap();
buf.atomic_read_only().unwrap()
}
fn shrink(&self) -> Box<Shrinker<AROIobuf>+'static> {
let mut v: Vec<AROIobuf> = vec!();
for hi_max in range(0, self.raw.hi_max()) {
for hi in range(0, min(hi_max, self.raw.hi())) {
for lo in range(self.raw.lo() + 1, hi + 1) {
for lo_min in range(self.raw.lo_min() + 1, lo + 1) {
let mut new_buf: AROIobuf = (*self).clone();
new_buf.set_limits_and_window((lo_min, hi_max), (lo, hi)).unwrap();
v.push(new_buf);
}
}
}
}
box v.into_iter()
}
}
#[test]
fn prop_valid_hi() {
fn test_hi(v: AROIobuf) -> bool {
v.hi() <= v.hi_max()
}
quickcheck(test_hi as fn(AROIobuf) -> bool)
}
#[test]
fn prop_valid_bounds() {
fn test_bounds(v: AROIobuf) -> bool {
v.lo() <= v.hi()
}
quickcheck(test_bounds as fn(AROIobuf) -> bool)
}
#[test]
fn prop_valid_lo() {
fn test_lo(v: AROIobuf) -> bool {
v.lo_min() <= v.lo()
}
quickcheck(test_lo as fn(AROIobuf) -> bool)
}
}