core/byteio: use slice length directly
[nihav.git] / nihav-core / src / io / byteio.rs
index 9fc380a831984ff2218eef266b38cccce897bb84..a10ccb9d0eef6f3f5169bf8895941bf6bbc46f84 100644 (file)
@@ -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<u32> {
     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<f32> { Ok(f32::from_bits(read_u32be(src)?)) }
+pub fn read_f32le(src: &[u8]) -> ByteIOResult<f32> { Ok(f32::from_bits(read_u32le(src)?)) }
+pub fn read_f64be(src: &[u8]) -> ByteIOResult<f64> { Ok(f64::from_bits(read_u64be(src)?)) }
+pub fn read_f64le(src: &[u8]) -> ByteIOResult<f64> { 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<f32> {
+        Ok(f32::from_bits(self.read_u32be()?))
+    }
+
+    pub fn peek_f32be(&mut self) -> ByteIOResult<f32> {
+        Ok(f32::from_bits(self.peek_u32be()?))
+    }
+
+    pub fn read_f64be(&mut self) -> ByteIOResult<f64> {
+        Ok(f64::from_bits(self.read_u64be()?))
+    }
+
+    pub fn peek_f64be(&mut self) -> ByteIOResult<f64> {
+        Ok(f64::from_bits(self.peek_u64be()?))
+    }
+
     pub fn read_u16le(&mut self) -> ByteIOResult<u16> {
         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<f32> {
+        Ok(f32::from_bits(self.read_u32le()?))
+    }
+
+    pub fn peek_f32le(&mut self) -> ByteIOResult<f32> {
+        Ok(f32::from_bits(self.peek_u32le()?))
+    }
+
+    pub fn read_f64le(&mut self) -> ByteIOResult<f64> {
+        Ok(f64::from_bits(self.read_u64le()?))
+    }
+
+    pub fn peek_f64le(&mut self) -> ByteIOResult<f64> {
+        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<u64> {
-        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<usize> {
-        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<u64> {
-        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<u64> {
-        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<u64> {
-        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 {