orc_format/read/decode/
float.rs1use crate::error::Error;
2
3pub trait Float: Default + Copy + private::Sealed {
5 type Bytes: AsRef<[u8]> + AsMut<[u8]> + Default;
6 fn from_le_bytes(bytes: Self::Bytes) -> Self;
7}
8
9mod private {
10 pub trait Sealed {} impl Sealed for f32 {}
12 impl Sealed for f64 {}
13}
14
15impl Float for f32 {
16 type Bytes = [u8; 4];
17
18 #[inline]
19 fn from_le_bytes(bytes: Self::Bytes) -> Self {
20 Self::from_le_bytes(bytes)
21 }
22}
23
24impl Float for f64 {
25 type Bytes = [u8; 8];
26
27 #[inline]
28 fn from_le_bytes(bytes: Self::Bytes) -> Self {
29 Self::from_le_bytes(bytes)
30 }
31}
32
33pub struct FloatIter<T: Float, R: std::io::Read> {
35 reader: R,
36 remaining: usize,
37 phantom: std::marker::PhantomData<T>,
38}
39
40impl<T: Float, R: std::io::Read> FloatIter<T, R> {
41 #[inline]
43 pub fn new(reader: R, length: usize) -> Self {
44 Self {
45 reader,
46 remaining: length,
47 phantom: Default::default(),
48 }
49 }
50
51 #[inline]
53 pub fn len(&self) -> usize {
54 self.remaining
55 }
56
57 #[must_use]
59 pub fn is_empty(&self) -> bool {
60 self.len() == 0
61 }
62
63 pub fn into_inner(self) -> R {
65 self.reader
66 }
67}
68
69impl<T: Float, R: std::io::Read> Iterator for FloatIter<T, R> {
70 type Item = Result<T, Error>;
71
72 #[inline]
73 fn next(&mut self) -> Option<Self::Item> {
74 if self.remaining == 0 {
75 return None;
76 }
77 let mut chunk: T::Bytes = Default::default();
78 let error = self.reader.read_exact(chunk.as_mut());
79 if error.is_err() {
80 return Some(Err(Error::DecodeFloat));
81 };
82 self.remaining -= 1;
83 Some(Ok(T::from_le_bytes(chunk)))
84 }
85
86 #[inline]
87 fn size_hint(&self) -> (usize, Option<usize>) {
88 let remaining = self.len();
89 (remaining, Some(remaining))
90 }
91}