/rust/registry/src/index.crates.io-6f17d22bba15001f/exr-1.73.0/src/io.rs
Line | Count | Source (jump to first uncovered line) |
1 | | |
2 | | //! Specialized binary input and output. |
3 | | //! Uses the error handling for this crate. |
4 | | |
5 | | #![doc(hidden)] |
6 | | pub use ::std::io::{Read, Write}; |
7 | | |
8 | | use half::slice::{HalfFloatSliceExt}; |
9 | | use lebe::prelude::*; |
10 | | use ::half::f16; |
11 | | use crate::error::{Error, Result, UnitResult, IoResult}; |
12 | | use std::io::{Seek, SeekFrom}; |
13 | | use std::path::Path; |
14 | | use std::fs::File; |
15 | | use std::convert::TryFrom; |
16 | | |
17 | | |
18 | | /// Skip reading uninteresting bytes without allocating. |
19 | | #[inline] |
20 | 0 | pub fn skip_bytes(read: &mut impl Read, count: usize) -> IoResult<()> { |
21 | 0 | let count = u64::try_from(count).unwrap(); |
22 | | |
23 | 0 | let skipped = std::io::copy( |
24 | 0 | &mut read.by_ref().take(count), |
25 | 0 | &mut std::io::sink() |
26 | 0 | )?; |
27 | | |
28 | | // the reader may have ended before we skipped the desired number of bytes |
29 | 0 | if skipped < count { |
30 | 0 | return Err(std::io::Error::new( |
31 | 0 | std::io::ErrorKind::UnexpectedEof, |
32 | 0 | "cannot skip more bytes than exist" |
33 | 0 | )); |
34 | 0 | } |
35 | 0 |
|
36 | 0 | debug_assert_eq!(skipped, count, "skip bytes bug"); |
37 | 0 | Ok(()) |
38 | 0 | } Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> Unexecuted instantiation: exr::io::skip_bytes::<_> Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> Unexecuted instantiation: exr::io::skip_bytes::<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> |
39 | | |
40 | | /// If an error occurs while writing, attempts to delete the partially written file. |
41 | | /// Creates a file just before the first write operation, not when this function is called. |
42 | | #[inline] |
43 | 0 | pub fn attempt_delete_file_on_write_error<'p>(path: &'p Path, write: impl FnOnce(LateFile<'p>) -> UnitResult) -> UnitResult { |
44 | 0 | match write(LateFile::from(path)) { |
45 | 0 | Err(error) => { // FIXME deletes existing file if creation of new file fails? |
46 | 0 | let _deleted = std::fs::remove_file(path); // ignore deletion errors |
47 | 0 | Err(error) |
48 | | }, |
49 | | |
50 | 0 | ok => ok, |
51 | | } |
52 | 0 | } |
53 | | |
54 | | #[derive(Debug)] |
55 | | pub struct LateFile<'p> { |
56 | | path: &'p Path, |
57 | | file: Option<File> |
58 | | } |
59 | | |
60 | | impl<'p> From<&'p Path> for LateFile<'p> { |
61 | 0 | fn from(path: &'p Path) -> Self { Self { path, file: None } } |
62 | | } |
63 | | |
64 | | impl<'p> LateFile<'p> { |
65 | 0 | fn file(&mut self) -> std::io::Result<&mut File> { |
66 | 0 | if self.file.is_none() { self.file = Some(File::create(self.path)?); } |
67 | 0 | Ok(self.file.as_mut().unwrap()) // will not be reached if creation fails |
68 | 0 | } |
69 | | } |
70 | | |
71 | | impl<'p> std::io::Write for LateFile<'p> { |
72 | 0 | fn write(&mut self, buffer: &[u8]) -> std::io::Result<usize> { |
73 | 0 | self.file()?.write(buffer) |
74 | 0 | } |
75 | | |
76 | 0 | fn flush(&mut self) -> std::io::Result<()> { |
77 | 0 | if let Some(file) = &mut self.file { file.flush() } |
78 | 0 | else { Ok(()) } |
79 | 0 | } |
80 | | } |
81 | | |
82 | | impl<'p> Seek for LateFile<'p> { |
83 | 0 | fn seek(&mut self, position: SeekFrom) -> std::io::Result<u64> { |
84 | 0 | self.file()?.seek(position) |
85 | 0 | } |
86 | | } |
87 | | |
88 | | |
89 | | /// Peek a single byte without consuming it. |
90 | | #[derive(Debug)] |
91 | | pub struct PeekRead<T> { |
92 | | |
93 | | /// Cannot be exposed as it will not contain peeked values anymore. |
94 | | inner: T, |
95 | | |
96 | | peeked: Option<IoResult<u8>>, |
97 | | } |
98 | | |
99 | | impl<T: Read> PeekRead<T> { |
100 | | |
101 | | /// Wrap a reader to make it peekable. |
102 | | #[inline] |
103 | 0 | pub fn new(inner: T) -> Self { |
104 | 0 | Self { inner, peeked: None } |
105 | 0 | } Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::new Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::new Unexecuted instantiation: <exr::io::PeekRead<_>>::new Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::new Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::new Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::new Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::new Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::new Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::new Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::new Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::new Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::new Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::new Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::new Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::new Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::new Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::new Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::new Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::new Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::new Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::new Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::new Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::new Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>>::new Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::new Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::new |
106 | | |
107 | | /// Read a single byte and return that without consuming it. |
108 | | /// The next `read` call will include that byte. |
109 | | #[inline] |
110 | 0 | pub fn peek_u8(&mut self) -> &IoResult<u8> { |
111 | 0 | self.peeked = self.peeked.take().or_else(|| Some(u8::read_from_little_endian(&mut self.inner))); Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<_>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8::{closure#0} Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8::{closure#0} |
112 | 0 | self.peeked.as_ref().unwrap() // unwrap cannot fail because we just set it |
113 | 0 | } Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<_>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::peek_u8 Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::peek_u8 |
114 | | |
115 | | /// Skip a single byte if it equals the specified value. |
116 | | /// Returns whether the value was found. |
117 | | /// Consumes the peeked result if an error occurred. |
118 | | #[inline] |
119 | 0 | pub fn skip_if_eq(&mut self, value: u8) -> IoResult<bool> { |
120 | 0 | match self.peek_u8() { |
121 | 0 | Ok(peeked) if *peeked == value => { |
122 | 0 | self.peeked = None; // consume the byte |
123 | 0 | Ok(true) |
124 | | }, |
125 | | |
126 | 0 | Ok(_) => Ok(false), |
127 | | |
128 | | // return the error otherwise. |
129 | | // unwrap is safe because this branch cannot be reached otherwise. |
130 | | // we need to take() from self because io errors cannot be cloned. |
131 | 0 | Err(_) => Err(self.peeked.take().unwrap().err().unwrap()) |
132 | | } |
133 | 0 | } Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<_>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_if_eq Unexecuted instantiation: <exr::io::PeekRead<&[u8]>>::skip_if_eq |
134 | | } |
135 | | |
136 | | |
137 | | impl<T: Read> Read for PeekRead<T> { |
138 | 0 | fn read(&mut self, target_buffer: &mut [u8]) -> IoResult<usize> { |
139 | 0 | if target_buffer.is_empty() { |
140 | 0 | return Ok(0) |
141 | 0 | } |
142 | 0 |
|
143 | 0 | match self.peeked.take() { |
144 | 0 | None => self.inner.read(target_buffer), |
145 | 0 | Some(peeked) => { |
146 | 0 | target_buffer[0] = peeked?; |
147 | | |
148 | | // indexing [1..] is safe because an empty buffer already returned ok |
149 | 0 | Ok(1 + self.inner.read(&mut target_buffer[1..])?) |
150 | | } |
151 | | } |
152 | 0 | } Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<&[u8]> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<_> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<&[u8]> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<&[u8]> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<&[u8]> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<&[u8]> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<&[u8]> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<&[u8]> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<&[u8]> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<&[u8]> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<&[u8]> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<&[u8]> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::PeekRead<&[u8]> as std::io::Read>::read |
153 | | } |
154 | | |
155 | | impl<T: Read + Seek> PeekRead<Tracking<T>> { |
156 | | |
157 | | /// Seek this read to the specified byte position. |
158 | | /// Discards any previously peeked value. |
159 | 0 | pub fn skip_to(&mut self, position: usize) -> std::io::Result<()> { |
160 | 0 | self.inner.seek_read_to(position)?; |
161 | 0 | self.peeked = None; |
162 | 0 | Ok(()) |
163 | 0 | } Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<_>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>>::skip_to Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::skip_to |
164 | | } |
165 | | |
166 | | impl<T: Read> PeekRead<Tracking<T>> { |
167 | | |
168 | | /// Current number of bytes read. |
169 | 0 | pub fn byte_position(&self) -> usize { |
170 | 0 | self.inner.byte_position() |
171 | 0 | } Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<_>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>>::byte_position Unexecuted instantiation: <exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>>::byte_position |
172 | | } |
173 | | |
174 | | /// Keep track of what byte we are at. |
175 | | /// Used to skip back to a previous place after writing some information. |
176 | | #[derive(Debug)] |
177 | | pub struct Tracking<T> { |
178 | | |
179 | | /// Do not expose to prevent seeking without updating position |
180 | | inner: T, |
181 | | |
182 | | position: usize, |
183 | | } |
184 | | |
185 | | impl<T: Read> Read for Tracking<T> { |
186 | 0 | fn read(&mut self, buffer: &mut [u8]) -> std::io::Result<usize> { |
187 | 0 | let count = self.inner.read(buffer)?; |
188 | 0 | self.position += count; |
189 | 0 | Ok(count) |
190 | 0 | } Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<_> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as std::io::Read>::read Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>> as std::io::Read>::read |
191 | | } |
192 | | |
193 | | impl<T: Write> Write for Tracking<T> { |
194 | 0 | fn write(&mut self, buffer: &[u8]) -> std::io::Result<usize> { |
195 | 0 | let count = self.inner.write(buffer)?; |
196 | 0 | self.position += count; |
197 | 0 | Ok(count) |
198 | 0 | } Unexecuted instantiation: <exr::io::Tracking<_> as std::io::Write>::write Unexecuted instantiation: <exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as std::io::Write>::write Unexecuted instantiation: <exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>> as std::io::Write>::write |
199 | | |
200 | 0 | fn flush(&mut self) -> std::io::Result<()> { |
201 | 0 | self.inner.flush() |
202 | 0 | } Unexecuted instantiation: <exr::io::Tracking<_> as std::io::Write>::flush Unexecuted instantiation: <exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>> as std::io::Write>::flush Unexecuted instantiation: <exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>> as std::io::Write>::flush |
203 | | } |
204 | | |
205 | | impl<T> Tracking<T> { |
206 | | |
207 | | /// If `inner` is a reference, if must never be seeked directly, |
208 | | /// but only through this `Tracking` instance. |
209 | 0 | pub fn new(inner: T) -> Self { |
210 | 0 | Tracking { inner, position: 0 } |
211 | 0 | } Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::new Unexecuted instantiation: <exr::io::Tracking<_>>::new Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::new Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::new Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::new Unexecuted instantiation: <exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::new Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::new Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::new Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::new Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::new Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::new Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::new Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::new Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::new Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::new Unexecuted instantiation: <exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>>::new |
212 | | |
213 | | /// Current number of bytes written or read. |
214 | 0 | pub fn byte_position(&self) -> usize { |
215 | 0 | self.position |
216 | 0 | } Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<_>>::byte_position Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::byte_position Unexecuted instantiation: <exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>>::byte_position |
217 | | } |
218 | | |
219 | | impl<T: Read + Seek> Tracking<T> { |
220 | | |
221 | | /// Set the reader to the specified byte position. |
222 | | /// If it is only a couple of bytes, no seek system call is performed. |
223 | 0 | pub fn seek_read_to(&mut self, target_position: usize) -> std::io::Result<()> { |
224 | 0 | let delta = target_position as i128 - self.position as i128; // FIXME panicked at 'attempt to subtract with overflow' |
225 | 0 | debug_assert!(delta.abs() < usize::MAX as i128); |
226 | | |
227 | 0 | if delta > 0 && delta < 16 { // TODO profile that this is indeed faster than a syscall! (should be because of bufread buffer discard) |
228 | 0 | skip_bytes(self, delta as usize)?; |
229 | 0 | self.position += delta as usize; |
230 | | } |
231 | 0 | else if delta != 0 { |
232 | 0 | self.inner.seek(SeekFrom::Start(u64::try_from(target_position).unwrap()))?; |
233 | 0 | self.position = target_position; |
234 | 0 | } |
235 | | |
236 | 0 | Ok(()) |
237 | 0 | } Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<_>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::seek_read_to Unexecuted instantiation: <exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>::seek_read_to |
238 | | } |
239 | | |
240 | | impl<T: Write + Seek> Tracking<T> { |
241 | | |
242 | | /// Move the writing cursor to the specified target byte index. |
243 | | /// If seeking forward, this will write zeroes. |
244 | 0 | pub fn seek_write_to(&mut self, target_position: usize) -> std::io::Result<()> { |
245 | 0 | if target_position < self.position { |
246 | 0 | self.inner.seek(SeekFrom::Start(u64::try_from(target_position).unwrap()))?; |
247 | | } |
248 | 0 | else if target_position > self.position { |
249 | 0 | std::io::copy( |
250 | 0 | &mut std::io::repeat(0).take(u64::try_from(target_position - self.position).unwrap()), |
251 | 0 | self |
252 | 0 | )?; |
253 | 0 | } |
254 | | |
255 | 0 | self.position = target_position; |
256 | 0 | Ok(()) |
257 | 0 | } Unexecuted instantiation: <exr::io::Tracking<_>>::seek_write_to Unexecuted instantiation: <exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>::seek_write_to Unexecuted instantiation: <exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>>::seek_write_to |
258 | | } |
259 | | |
260 | | |
261 | | /// Generic trait that defines common binary operations such as reading and writing for this type. |
262 | | pub trait Data: Sized + Default + Clone { |
263 | | |
264 | | /// Number of bytes this would consume in an exr file. |
265 | | const BYTE_SIZE: usize = ::std::mem::size_of::<Self>(); |
266 | | |
267 | | /// Read a value of type `Self`. |
268 | | fn read(read: &mut impl Read) -> Result<Self>; |
269 | | |
270 | | /// Read as many values of type `Self` as fit into the specified slice. |
271 | | /// If the slice cannot be filled completely, returns `Error::Invalid`. |
272 | | fn read_slice(read: &mut impl Read, slice: &mut[Self]) -> UnitResult; |
273 | | |
274 | | /// Read as many values of type `Self` as specified with `data_size`. |
275 | | /// |
276 | | /// This method will not allocate more memory than `soft_max` at once. |
277 | | /// If `hard_max` is specified, it will never read any more than that. |
278 | | /// Returns `Error::Invalid` if reader does not contain the desired number of elements. |
279 | | #[inline] |
280 | 0 | fn read_vec(read: &mut impl Read, data_size: usize, soft_max: usize, hard_max: Option<usize>, purpose: &'static str) -> Result<Vec<Self>> { |
281 | 0 | let mut vec = Vec::with_capacity(data_size.min(soft_max)); |
282 | 0 | Self::read_into_vec(read, &mut vec, data_size, soft_max, hard_max, purpose)?; |
283 | 0 | Ok(vec) |
284 | 0 | } Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <_ as exr::io::Data>::read_vec::<_> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <u64 as exr::io::Data>::read_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> |
285 | | |
286 | | /// Write this value to the writer. |
287 | | fn write(self, write: &mut impl Write) -> UnitResult; |
288 | | |
289 | | /// Write all values of that slice to the writer. |
290 | | fn write_slice(write: &mut impl Write, slice: &[Self]) -> UnitResult; |
291 | | |
292 | | |
293 | | /// Read as many values of type `Self` as specified with `data_size` into the provided vector. |
294 | | /// |
295 | | /// This method will not allocate more memory than `soft_max` at once. |
296 | | /// If `hard_max` is specified, it will never read any more than that. |
297 | | /// Returns `Error::Invalid` if reader does not contain the desired number of elements. |
298 | | #[inline] |
299 | 0 | fn read_into_vec(read: &mut impl Read, data: &mut Vec<Self>, data_size: usize, soft_max: usize, hard_max: Option<usize>, purpose: &'static str) -> UnitResult { |
300 | 0 | if let Some(max) = hard_max { |
301 | 0 | if data_size > max { |
302 | 0 | return Err(Error::invalid(purpose)) |
303 | 0 | } |
304 | 0 | } |
305 | | |
306 | 0 | let soft_max = hard_max.unwrap_or(soft_max).min(soft_max); |
307 | 0 | let end = data.len() + data_size; |
308 | | |
309 | | // do not allocate more than $chunks memory at once |
310 | | // (most of the time, this loop will run only once) |
311 | 0 | while data.len() < end { |
312 | 0 | let chunk_start = data.len(); |
313 | 0 | let chunk_end = (chunk_start + soft_max).min(data_size); |
314 | 0 |
|
315 | 0 | data.resize(chunk_end, Self::default()); |
316 | 0 | Self::read_slice(read, &mut data[chunk_start .. chunk_end])?; // safe because of `min(data_size)`` |
317 | | } |
318 | | |
319 | 0 | Ok(()) |
320 | 0 | } Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <_ as exr::io::Data>::read_into_vec::<_> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u8 as exr::io::Data>::read_into_vec::<&[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <u64 as exr::io::Data>::read_into_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> |
321 | | |
322 | | /// Write the length of the slice and then its contents. |
323 | | #[inline] |
324 | 0 | fn write_i32_sized_slice<W: Write>(write: &mut W, slice: &[Self]) -> UnitResult { |
325 | 0 | i32::try_from(slice.len())?.write(write)?; |
326 | 0 | Self::write_slice(write, slice) |
327 | 0 | } Unexecuted instantiation: <u8 as exr::io::Data>::write_i32_sized_slice::<alloc::vec::Vec<u8>> Unexecuted instantiation: <u8 as exr::io::Data>::write_i32_sized_slice::<exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> Unexecuted instantiation: <u8 as exr::io::Data>::write_i32_sized_slice::<exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>> |
328 | | |
329 | | /// Read the desired element count and then read that many items into a vector. |
330 | | /// |
331 | | /// This method will not allocate more memory than `soft_max` at once. |
332 | | /// If `hard_max` is specified, it will never read any more than that. |
333 | | /// Returns `Error::Invalid` if reader does not contain the desired number of elements. |
334 | | #[inline] |
335 | 0 | fn read_i32_sized_vec(read: &mut impl Read, soft_max: usize, hard_max: Option<usize>, purpose: &'static str) -> Result<Vec<Self>> { |
336 | 0 | let size = usize::try_from(i32::read(read)?)?; |
337 | 0 | Self::read_vec(read, size, soft_max, hard_max, purpose) |
338 | 0 | } Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <_ as exr::io::Data>::read_i32_sized_vec::<_> Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_i32_sized_vec::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> |
339 | | |
340 | | /// Fill the slice with this value. |
341 | | #[inline] |
342 | 0 | fn fill_slice(self, slice: &mut [Self]) where Self: Copy { |
343 | | // hopefully compiles down to a single memset call |
344 | 0 | for value in slice { |
345 | 0 | *value = self; |
346 | 0 | } |
347 | 0 | } |
348 | | } |
349 | | |
350 | | |
351 | | macro_rules! implement_data_for_primitive { |
352 | | ($kind: ident) => { |
353 | | impl Data for $kind { |
354 | | #[inline] |
355 | 0 | fn read(read: &mut impl Read) -> Result<Self> { |
356 | 0 | Ok(read.read_from_little_endian()?) |
357 | 0 | } Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <f64 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <i32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <i8 as exr::io::Data>::read::<_> Unexecuted instantiation: <i16 as exr::io::Data>::read::<_> Unexecuted instantiation: <i64 as exr::io::Data>::read::<_> Unexecuted instantiation: <u64 as exr::io::Data>::read::<_> Unexecuted instantiation: <f32 as exr::io::Data>::read::<_> Unexecuted instantiation: <f64 as exr::io::Data>::read::<_> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <f64 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <f64 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <f64 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <f64 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <f64 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <f64 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <f64 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <f64 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <f64 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <f64 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <u32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i32 as exr::io::Data>::read::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <u64 as exr::io::Data>::read::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read::<&[u8]> Unexecuted instantiation: <f64 as exr::io::Data>::read::<&[u8]> |
358 | | |
359 | | #[inline] |
360 | 0 | fn write(self, write: &mut impl Write) -> Result<()> { |
361 | 0 | write.write_as_little_endian(&self)?; |
362 | 0 | Ok(()) |
363 | 0 | } Unexecuted instantiation: <u16 as exr::io::Data>::write::<alloc::vec::Vec<u8>> Unexecuted instantiation: <u32 as exr::io::Data>::write::<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> Unexecuted instantiation: <i32 as exr::io::Data>::write::<alloc::vec::Vec<u8>> Unexecuted instantiation: <u8 as exr::io::Data>::write::<_> Unexecuted instantiation: <i8 as exr::io::Data>::write::<_> Unexecuted instantiation: <i16 as exr::io::Data>::write::<_> Unexecuted instantiation: <i64 as exr::io::Data>::write::<_> Unexecuted instantiation: <u64 as exr::io::Data>::write::<_> Unexecuted instantiation: <f32 as exr::io::Data>::write::<_> Unexecuted instantiation: <f64 as exr::io::Data>::write::<_> Unexecuted instantiation: <u8 as exr::io::Data>::write::<exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> Unexecuted instantiation: <u16 as exr::io::Data>::write::<&mut [u8]> Unexecuted instantiation: <u32 as exr::io::Data>::write::<exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> Unexecuted instantiation: <u32 as exr::io::Data>::write::<&mut [u8]> Unexecuted instantiation: <i32 as exr::io::Data>::write::<exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> Unexecuted instantiation: <u64 as exr::io::Data>::write::<exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> Unexecuted instantiation: <f32 as exr::io::Data>::write::<exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> Unexecuted instantiation: <f32 as exr::io::Data>::write::<&mut [u8]> Unexecuted instantiation: <f64 as exr::io::Data>::write::<exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> Unexecuted instantiation: <u8 as exr::io::Data>::write::<exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>> Unexecuted instantiation: <u16 as exr::io::Data>::write::<&mut [u8]> Unexecuted instantiation: <u32 as exr::io::Data>::write::<exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>> Unexecuted instantiation: <u32 as exr::io::Data>::write::<&mut [u8]> Unexecuted instantiation: <i32 as exr::io::Data>::write::<exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>> Unexecuted instantiation: <u64 as exr::io::Data>::write::<exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>> Unexecuted instantiation: <f32 as exr::io::Data>::write::<exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>> Unexecuted instantiation: <f32 as exr::io::Data>::write::<&mut [u8]> Unexecuted instantiation: <f64 as exr::io::Data>::write::<exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>> |
364 | | |
365 | | #[inline] |
366 | 0 | fn read_slice(read: &mut impl Read, slice: &mut [Self]) -> Result<()> { |
367 | 0 | read.read_from_little_endian_into(slice)?; |
368 | 0 | Ok(()) |
369 | 0 | } Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<std::io::cursor::Cursor<&[u8]>> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<std::io::cursor::Cursor<&[u8]>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<std::io::cursor::Cursor<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<_> Unexecuted instantiation: <i16 as exr::io::Data>::read_slice::<_> Unexecuted instantiation: <i32 as exr::io::Data>::read_slice::<_> Unexecuted instantiation: <i64 as exr::io::Data>::read_slice::<_> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<_> Unexecuted instantiation: <f64 as exr::io::Data>::read_slice::<_> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <u8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<exr::io::PeekRead<&[u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::read_slice::<&[u8]> Unexecuted instantiation: <u16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<alloc::vec::Vec<u8>>>>> Unexecuted instantiation: <u64 as exr::io::Data>::read_slice::<exr::io::PeekRead<exr::io::Tracking<std::io::cursor::Cursor<&[u8]>>>> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <f32 as exr::io::Data>::read_slice::<&[u8]> |
370 | | |
371 | | #[inline] |
372 | 0 | fn write_slice(write: &mut impl Write, slice: &[Self]) -> Result<()> { |
373 | 0 | write.write_as_little_endian(slice)?; |
374 | 0 | Ok(()) |
375 | 0 | } Unexecuted instantiation: <u8 as exr::io::Data>::write_slice::<alloc::vec::Vec<u8>> Unexecuted instantiation: <u16 as exr::io::Data>::write_slice::<alloc::vec::Vec<u8>> Unexecuted instantiation: <u16 as exr::io::Data>::write_slice::<std::io::cursor::Cursor<&mut [u8]>> Unexecuted instantiation: <u32 as exr::io::Data>::write_slice::<std::io::cursor::Cursor<alloc::vec::Vec<u8>>> Unexecuted instantiation: <u32 as exr::io::Data>::write_slice::<std::io::cursor::Cursor<&mut [u8]>> Unexecuted instantiation: <f32 as exr::io::Data>::write_slice::<std::io::cursor::Cursor<&mut [u8]>> Unexecuted instantiation: <i8 as exr::io::Data>::write_slice::<_> Unexecuted instantiation: <i16 as exr::io::Data>::write_slice::<_> Unexecuted instantiation: <i32 as exr::io::Data>::write_slice::<_> Unexecuted instantiation: <i64 as exr::io::Data>::write_slice::<_> Unexecuted instantiation: <u64 as exr::io::Data>::write_slice::<_> Unexecuted instantiation: <f64 as exr::io::Data>::write_slice::<_> Unexecuted instantiation: <u8 as exr::io::Data>::write_slice::<exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> Unexecuted instantiation: <i8 as exr::io::Data>::write_slice::<exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> Unexecuted instantiation: <u64 as exr::io::Data>::write_slice::<exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> Unexecuted instantiation: <f32 as exr::io::Data>::write_slice::<exr::io::Tracking<&mut &mut std::io::cursor::Cursor<alloc::vec::Vec<u8>>>> Unexecuted instantiation: <u8 as exr::io::Data>::write_slice::<exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>> Unexecuted instantiation: <i8 as exr::io::Data>::write_slice::<exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>> Unexecuted instantiation: <u64 as exr::io::Data>::write_slice::<exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>> Unexecuted instantiation: <f32 as exr::io::Data>::write_slice::<exr::io::Tracking<&mut std::io::cursor::Cursor<&mut alloc::vec::Vec<u8>>>> |
376 | | } |
377 | | }; |
378 | | } |
379 | | |
380 | | implement_data_for_primitive!(u8); |
381 | | implement_data_for_primitive!(i8); |
382 | | implement_data_for_primitive!(i16); |
383 | | implement_data_for_primitive!(u16); |
384 | | implement_data_for_primitive!(u32); |
385 | | implement_data_for_primitive!(i32); |
386 | | implement_data_for_primitive!(i64); |
387 | | implement_data_for_primitive!(u64); |
388 | | implement_data_for_primitive!(f32); |
389 | | implement_data_for_primitive!(f64); |
390 | | |
391 | | |
392 | | impl Data for f16 { |
393 | | #[inline] |
394 | 0 | fn read(read: &mut impl Read) -> Result<Self> { |
395 | 0 | u16::read(read).map(f16::from_bits) |
396 | 0 | } |
397 | | |
398 | | #[inline] |
399 | 0 | fn read_slice(read: &mut impl Read, slice: &mut [Self]) -> Result<()> { |
400 | 0 | let bits = slice.reinterpret_cast_mut(); |
401 | 0 | u16::read_slice(read, bits) |
402 | 0 | } Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<std::io::cursor::Cursor<&[u8]>> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::read_slice::<&mut &mut &[u8]> |
403 | | |
404 | | #[inline] |
405 | 0 | fn write(self, write: &mut impl Write) -> Result<()> { |
406 | 0 | self.to_bits().write(write) |
407 | 0 | } Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::write::<_> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::write::<&mut [u8]> Unexecuted instantiation: <half::binary16::f16 as exr::io::Data>::write::<&mut [u8]> |
408 | | |
409 | | #[inline] |
410 | 0 | fn write_slice(write: &mut impl Write, slice: &[Self]) -> Result<()> { |
411 | 0 | let bits = slice.reinterpret_cast(); |
412 | 0 | u16::write_slice(write, bits) |
413 | 0 | } |
414 | | } |
415 | | |
416 | | |
417 | | #[cfg(test)] |
418 | | mod test { |
419 | | use crate::io::PeekRead; |
420 | | use std::io::Read; |
421 | | |
422 | | #[test] |
423 | | fn peek(){ |
424 | | use lebe::prelude::*; |
425 | | let buffer: &[u8] = &[0,1,2,3]; |
426 | | let mut peek = PeekRead::new(buffer); |
427 | | |
428 | | assert_eq!(peek.peek_u8().as_ref().unwrap(), &0); |
429 | | assert_eq!(peek.peek_u8().as_ref().unwrap(), &0); |
430 | | assert_eq!(peek.peek_u8().as_ref().unwrap(), &0); |
431 | | assert_eq!(u8::read_from_little_endian(&mut peek).unwrap(), 0_u8); |
432 | | |
433 | | assert_eq!(peek.read(&mut [0,0]).unwrap(), 2); |
434 | | |
435 | | assert_eq!(peek.peek_u8().as_ref().unwrap(), &3); |
436 | | assert_eq!(u8::read_from_little_endian(&mut peek).unwrap(), 3_u8); |
437 | | |
438 | | assert!(peek.peek_u8().is_err()); |
439 | | assert!(peek.peek_u8().is_err()); |
440 | | assert!(peek.peek_u8().is_err()); |
441 | | assert!(peek.peek_u8().is_err()); |
442 | | |
443 | | assert!(u8::read_from_little_endian(&mut peek).is_err()); |
444 | | } |
445 | | } |
446 | | |
447 | | |