zerofile.rs 1017 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. use std::io;
  2. use std::cmp::{min, max};
  3. pub struct ZeroFile {
  4. position: u64,
  5. size: u64
  6. }
  7. impl ZeroFile {
  8. pub fn new(size: u64) -> ZeroFile {
  9. ZeroFile {
  10. position: 0,
  11. size: size
  12. }
  13. }
  14. }
  15. impl io::Seek for ZeroFile {
  16. fn seek(&mut self, pos: io::SeekFrom) -> io::Result<u64> {
  17. let newpos = match pos {
  18. io::SeekFrom::Start(offset) => offset as i64,
  19. io::SeekFrom::End(offset) => self.size as i64 + offset,
  20. io::SeekFrom::Current(offset) => self.position as i64 + offset,
  21. };
  22. self.position = max(min(newpos, self.size as i64), 0) as u64;
  23. Ok(self.position)
  24. }
  25. }
  26. impl io::Read for ZeroFile {
  27. // TODO optimize with memset or similar
  28. fn read(&mut self, output: &mut [u8]) -> io::Result<usize> {
  29. let len = min(output.len(), (self.size - self.position) as usize);
  30. for b in output {
  31. *b = 0;
  32. }
  33. self.position += len as u64;
  34. Ok(len)
  35. }
  36. }