Coverage Report

Created: 2025-07-04 06:57

/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