X-Git-Url: https://git.nihav.org/?a=blobdiff_plain;f=nihav-core%2Fsrc%2Fio%2Fbyteio.rs;h=a10ccb9d0eef6f3f5169bf8895941bf6bbc46f84;hb=1be85e0094841cbc0f51437f46ab79519bb639d5;hp=9fc380a831984ff2218eef266b38cccce897bb84;hpb=95c7f2f6263a3cb03bee2e0487170fc9f23499a6;p=nihav.git diff --git a/nihav-core/src/io/byteio.rs b/nihav-core/src/io/byteio.rs index 9fc380a..a10ccb9 100644 --- a/nihav-core/src/io/byteio.rs +++ b/nihav-core/src/io/byteio.rs @@ -37,7 +37,6 @@ pub struct ByteReader<'a> { pub struct MemoryReader<'a> { buf: &'a [u8], - size: usize, pos: usize, } @@ -94,6 +93,10 @@ pub fn read_u24le(src: &[u8]) -> ByteIOResult { if src.len() < 3 { return Err(ByteIOError::ReadError); } Ok((u32::from(src[2]) << 16) | (u32::from(src[1]) << 8) | u32::from(src[0])) } +pub fn read_f32be(src: &[u8]) -> ByteIOResult { Ok(f32::from_bits(read_u32be(src)?)) } +pub fn read_f32le(src: &[u8]) -> ByteIOResult { Ok(f32::from_bits(read_u32le(src)?)) } +pub fn read_f64be(src: &[u8]) -> ByteIOResult { Ok(f64::from_bits(read_u64be(src)?)) } +pub fn read_f64le(src: &[u8]) -> ByteIOResult { Ok(f64::from_bits(read_u64le(src)?)) } macro_rules! write_int_func { ($s: ident, $inttype: ty, $size: expr, $which: ident) => { @@ -129,6 +132,10 @@ pub fn write_u24le(dst: &mut [u8], val: u32) -> ByteIOResult<()> { dst[2] = (val >> 16) as u8; Ok(()) } +pub fn write_f32be(dst: &mut [u8], val: f32) -> ByteIOResult<()> { write_u32be(dst, val.to_bits()) } +pub fn write_f32le(dst: &mut [u8], val: f32) -> ByteIOResult<()> { write_u32le(dst, val.to_bits()) } +pub fn write_f64be(dst: &mut [u8], val: f64) -> ByteIOResult<()> { write_u64be(dst, val.to_bits()) } +pub fn write_f64le(dst: &mut [u8], val: f64) -> ByteIOResult<()> { write_u64le(dst, val.to_bits()) } impl<'a> ByteReader<'a> { pub fn new(io: &'a mut ByteIO) -> Self { ByteReader { io } } @@ -189,6 +196,22 @@ impl<'a> ByteReader<'a> { peek_int!(self, u64, 8, to_be) } + pub fn read_f32be(&mut self) -> ByteIOResult { + Ok(f32::from_bits(self.read_u32be()?)) + } + + pub fn peek_f32be(&mut self) -> ByteIOResult { + Ok(f32::from_bits(self.peek_u32be()?)) + } + + pub fn read_f64be(&mut self) -> ByteIOResult { + Ok(f64::from_bits(self.read_u64be()?)) + } + + pub fn peek_f64be(&mut self) -> ByteIOResult { + Ok(f64::from_bits(self.peek_u64be()?)) + } + pub fn read_u16le(&mut self) -> ByteIOResult { read_int!(self, u16, 2, to_le) } @@ -225,6 +248,22 @@ impl<'a> ByteReader<'a> { peek_int!(self, u64, 8, to_le) } + pub fn read_f32le(&mut self) -> ByteIOResult { + Ok(f32::from_bits(self.read_u32le()?)) + } + + pub fn peek_f32le(&mut self) -> ByteIOResult { + Ok(f32::from_bits(self.peek_u32le()?)) + } + + pub fn read_f64le(&mut self) -> ByteIOResult { + Ok(f64::from_bits(self.read_u64le()?)) + } + + pub fn peek_f64le(&mut self) -> ByteIOResult { + Ok(f64::from_bits(self.peek_u64le()?)) + } + pub fn read_skip(&mut self, len: usize) -> ByteIOResult<()> { if self.io.is_seekable() { self.io.seek(SeekFrom::Current(len as i64))?; @@ -270,11 +309,11 @@ impl<'a> ByteReader<'a> { impl<'a> MemoryReader<'a> { pub fn new_read(buf: &'a [u8]) -> Self { - MemoryReader { buf, size: buf.len(), pos: 0 } + MemoryReader { buf, pos: 0 } } fn real_seek(&mut self, pos: i64) -> ByteIOResult { - if pos < 0 || (pos as usize) > self.size { + if pos < 0 || (pos as usize) > self.buf.len() { return Err(ByteIOError::WrongRange); } self.pos = pos as usize; @@ -296,7 +335,7 @@ impl<'a> ByteIO for MemoryReader<'a> { } fn peek_buf(&mut self, buf: &mut [u8]) -> ByteIOResult { - let copy_size = if self.size - self.pos < buf.len() { self.size } else { buf.len() }; + let copy_size = if self.buf.len() - self.pos < buf.len() { self.buf.len() } else { buf.len() }; if copy_size == 0 { return Err(ByteIOError::EOF); } let dst = &mut buf[0..copy_size]; dst.copy_from_slice(&self.buf[self.pos..][..copy_size]); @@ -326,8 +365,8 @@ impl<'a> ByteIO for MemoryReader<'a> { } fn seek(&mut self, pos: SeekFrom) -> ByteIOResult { - let cur_pos = self.pos as i64; - let cur_size = self.size as i64; + let cur_pos = self.pos as i64; + let cur_size = self.buf.len() as i64; match pos { SeekFrom::Start(x) => self.real_seek(x as i64), SeekFrom::Current(x) => self.real_seek(cur_pos + x), @@ -336,7 +375,7 @@ impl<'a> ByteIO for MemoryReader<'a> { } fn is_eof(&self) -> bool { - self.pos >= self.size + self.pos >= self.buf.len() } fn is_seekable(&mut self) -> bool { @@ -430,7 +469,6 @@ pub struct ByteWriter<'a> { pub struct MemoryWriter<'a> { buf: &'a mut [u8], - size: usize, pos: usize, } @@ -490,6 +528,22 @@ impl<'a> ByteWriter<'a> { self.write_u32le((val >> 32) as u32) } + pub fn write_f32be(&mut self, val: f32) -> ByteIOResult<()> { + self.write_u32be(val.to_bits()) + } + + pub fn write_f32le(&mut self, val: f32) -> ByteIOResult<()> { + self.write_u32le(val.to_bits()) + } + + pub fn write_f64be(&mut self, val: f64) -> ByteIOResult<()> { + self.write_u64be(val.to_bits()) + } + + pub fn write_f64le(&mut self, val: f64) -> ByteIOResult<()> { + self.write_u64le(val.to_bits()) + } + pub fn tell(&mut self) -> u64 { self.io.tell() } @@ -508,12 +562,11 @@ impl<'a> ByteWriter<'a> { impl<'a> MemoryWriter<'a> { pub fn new_write(buf: &'a mut [u8]) -> Self { - let len = buf.len(); - MemoryWriter { buf, size: len, pos: 0 } + MemoryWriter { buf, pos: 0 } } fn real_seek(&mut self, pos: i64) -> ByteIOResult { - if pos < 0 || (pos as usize) > self.size { + if pos < 0 || (pos as usize) > self.buf.len() { return Err(ByteIOError::WrongRange) } self.pos = pos as usize; @@ -548,7 +601,7 @@ impl<'a> ByteIO for MemoryWriter<'a> { } fn write_buf(&mut self, buf: &[u8]) -> ByteIOResult<()> { - if self.pos + buf.len() > self.size { return Err(ByteIOError::WriteError); } + if self.pos + buf.len() > self.buf.len() { return Err(ByteIOError::WriteError); } for i in 0..buf.len() { self.buf[self.pos + i] = buf[i]; } @@ -561,8 +614,8 @@ impl<'a> ByteIO for MemoryWriter<'a> { } fn seek(&mut self, pos: SeekFrom) -> ByteIOResult { - let cur_pos = self.pos as i64; - let cur_size = self.size as i64; + let cur_pos = self.pos as i64; + let cur_size = self.buf.len() as i64; match pos { SeekFrom::Start(x) => self.real_seek(x as i64), SeekFrom::Current(x) => self.real_seek(cur_pos + x), @@ -571,7 +624,7 @@ impl<'a> ByteIO for MemoryWriter<'a> { } fn is_eof(&self) -> bool { - self.pos >= self.size + self.pos >= self.buf.len() } fn is_seekable(&mut self) -> bool {