use data::Datum;
use marker::Marker;
use reader::Read;
use std::rc::Rc;
#[derive (Clone, Debug)]
pub struct BytesDatum {
content: Rc<Vec<u8>>
}
impl Datum for BytesDatum {
fn len (&self) -> usize { Vec::len (&*self.content) }
fn as_slice (&self) -> &[u8] { Vec::as_slice (&*self.content) }
}
pub struct BytesReader {
pointer: usize,
content: BytesDatum
}
impl BytesReader {
pub fn new (data: Vec<u8>) -> BytesReader {
BytesReader {
pointer: 0,
content: BytesDatum { content: Rc::new (data) }
}
}
}
impl Read for BytesReader {
type Datum = BytesDatum;
fn consume (&mut self, len: u8) -> Marker {
let len = self.skip (len);
Marker::new ((0, self.pointer - len as usize), (0, self.pointer))
}
fn consume_long (&mut self, len: usize) -> Marker {
let len = self.skip_long (len);
Marker::new ((0, self.pointer - len), (0, self.pointer))
}
#[inline (always)]
fn get_datum (&mut self, index: usize) -> Option<BytesDatum> {
if index == 0 { Some ( self.content.clone () ) } else { None }
}
fn skip (&mut self, len: u8) -> u8 {
if self.pointer < self.content.len () {
if self.pointer + (len as usize) < self.content.len () {
self.pointer += len as usize;
len
} else {
let len = self.content.len () - self.pointer;
self.pointer += len;
len as u8
}
} else { 0 }
}
fn skip_long (&mut self, len: usize) -> usize {
if self.pointer < self.content.len () {
if self.pointer + len < self.content.len () {
self.pointer += len;
len
} else {
let len = self.content.len () - self.pointer;
self.pointer += len;
len
}
} else { 0 }
}
#[inline (always)]
fn has (&mut self, len: u8) -> bool { self.pointer + len as usize <= self.content.len () }
#[inline (always)]
fn has_long (&mut self, len: usize) -> bool { self.pointer + len <= self.content.len () }
#[inline (always)]
fn byte_at_start (&mut self, byte: u8) -> bool { self.content.content.get (self.pointer) == Some (&byte) }
#[inline (always)]
fn byte_at (&mut self, byte: u8, at: usize) -> bool { self.content.content.get (self.pointer + at) == Some (&byte) }
#[inline (always)]
fn bytes_2_at_start (&mut self, bytes: [u8; 2]) -> bool { self.content.content.get (self.pointer .. self.pointer + 2) == Some (&bytes) }
#[inline (always)]
fn bytes_2_at (&mut self, bytes: [u8; 2], at: usize) -> bool { self.content.content.get (self.pointer + at .. self.pointer + at + 2) == Some (&bytes) }
#[inline (always)]
fn bytes_3_at_start (&mut self, bytes: [u8; 3]) -> bool { self.content.content.get (self.pointer .. self.pointer + 3) == Some (&bytes) }
#[inline (always)]
fn bytes_3_at (&mut self, bytes: [u8; 3], at: usize) -> bool { self.content.content.get (self.pointer + at .. self.pointer + at + 3) == Some (&bytes) }
#[inline (always)]
fn bytes_4_at_start (&mut self, bytes: [u8; 4]) -> bool { self.content.content.get (self.pointer .. self.pointer + 4) == Some (&bytes) }
#[inline (always)]
fn bytes_4_at (&mut self, bytes: [u8; 4], at: usize) -> bool { self.content.content.get (self.pointer + at .. self.pointer + at + 4) == Some (&bytes) }
#[inline (always)]
fn bytes_at_start (&mut self, bytes: &[u8]) -> bool { self.content.content.get (self.pointer .. self.pointer + bytes.len ()) == Some (bytes) }
#[inline (always)]
fn bytes_at (&mut self, bytes: &[u8], at: usize) -> bool { self.content.content.get (self.pointer + at .. self.pointer + at + bytes.len ()) == Some (bytes) }
#[inline (always)]
fn slice_at (&mut self, at: usize, len: usize) -> Option<&[u8]> { self.content.content.get (self.pointer + at .. self.pointer + at + len) }
#[inline (always)]
fn get_byte_at (&mut self, at: usize) -> Option<u8> { self.content.content.get (self.pointer + at).map (|b| *b) }
#[inline (always)]
fn get_byte_at_start (&mut self) -> Option<u8> { self.content.content.get (self.pointer).map (|b| *b) }
#[inline (always)]
fn get_bytes_2_at (&mut self, at: usize) -> Option<(u8, u8)> { self.content.content.get (self.pointer + at .. self.pointer + at + 2).map (|ref bs| (bs[0], bs[1])) }
#[inline (always)]
fn get_bytes_2_at_start (&mut self) -> Option<(u8, u8)> { self.content.content.get (self.pointer .. self.pointer + 2).map (|ref bs| (bs[0], bs[1])) }
#[inline (always)]
fn get_bytes_3_at (&mut self, at: usize) -> Option<(u8, u8, u8)> { self.content.content.get (self.pointer + at .. self.pointer + at + 3).map (|ref bs| (bs[0], bs[1], bs[2])) }
#[inline (always)]
fn get_bytes_3_at_start (&mut self) -> Option<(u8, u8, u8)> { self.content.content.get (self.pointer .. self.pointer + 3).map (|ref bs| (bs[0], bs[1], bs[2])) }
#[inline (always)]
fn get_bytes_4_at (&mut self, at: usize) -> Option<(u8, u8, u8, u8)> { self.content.content.get (self.pointer + at .. self.pointer + at + 4).map (|ref bs| (bs[0], bs[1], bs[2], bs[3])) }
#[inline (always)]
fn get_bytes_4_at_start (&mut self) -> Option<(u8, u8, u8, u8)> { self.content.content.get (self.pointer .. self.pointer + 4).map (|ref bs| (bs[0], bs[1], bs[2], bs[3])) }
}