1234567891011121314151617181920212223242526272829303132333435363738394041424344 |
- use std::io;
- use std::cmp::{min, max};
- pub struct ZeroFile {
- position: u64,
- size: u64
- }
- impl ZeroFile {
- pub fn new(size: u64) -> ZeroFile {
- ZeroFile {
- position: 0,
- size: size
- }
- }
- }
- impl io::Seek for ZeroFile {
- fn seek(&mut self, pos: io::SeekFrom) -> io::Result<u64> {
- let newpos = match pos {
- io::SeekFrom::Start(offset) => offset as i64,
- io::SeekFrom::End(offset) => self.size as i64 + offset,
- io::SeekFrom::Current(offset) => self.position as i64 + offset,
- };
- self.position = max(min(newpos, self.size as i64), 0) as u64;
- Ok(self.position)
- }
- }
- impl io::Read for ZeroFile {
- // TODO optimize with memset or similar
- fn read(&mut self, output: &mut [u8]) -> io::Result<usize> {
- let len = min(output.len(), (self.size - self.position) as usize);
- for b in output {
- *b = 0;
- }
- self.position += len as u64;
- Ok(len)
- }
- }
|