qubit_io/stream/
buffered_binary_reader.rs1use core::marker::PhantomData;
12use std::io::{
13 Read,
14 Result,
15 Seek,
16 SeekFrom,
17};
18
19use crate::codec::{
20 BigEndian,
21 BinaryCodec,
22 ByteOrder,
23 ByteOrderSpec,
24 LittleEndian,
25};
26use crate::stream::BufferedInput;
27
28pub struct BufferedBinaryReader<R, O = BigEndian> {
41 input: BufferedInput<R>,
42 marker: PhantomData<fn() -> O>,
43}
44
45impl<R, O> BufferedBinaryReader<R, O>
46where
47 O: ByteOrderSpec,
48{
49 #[must_use]
51 #[inline]
52 pub fn new(inner: R) -> Self {
53 Self {
54 input: BufferedInput::new(inner),
55 marker: PhantomData,
56 }
57 }
58
59 #[must_use]
61 #[inline]
62 pub fn with_capacity(inner: R, capacity: usize) -> Self {
63 Self {
64 input: BufferedInput::with_capacity(inner, capacity),
65 marker: PhantomData,
66 }
67 }
68
69 #[must_use]
71 #[inline]
72 pub const fn byte_order(&self) -> ByteOrder {
73 O::ORDER
74 }
75
76 #[must_use]
81 #[inline]
82 pub const fn inner(&self) -> &R {
83 self.input.inner()
84 }
85
86 #[must_use]
91 #[inline]
92 pub fn inner_mut(&mut self) -> &mut R {
93 self.input.inner_mut()
94 }
95
96 #[must_use]
102 #[inline]
103 pub fn into_inner(self) -> R {
104 self.input.into_inner()
105 }
106}
107
108macro_rules! impl_value_read {
109 ($order:ty, $method:ident, $ty:ty, $doc:literal) => {
110 #[doc = $doc]
111 #[inline]
112 pub fn $method(&mut self) -> Result<$ty> {
113 type Codec = BinaryCodec<$ty, $order>;
114
115 const LEN: usize = Codec::REQUIRED_MIN_BUFFER_LEN;
116 self.input.read_fixed::<LEN, _, _>(|bytes, index| {
117 unsafe { Codec::read_unchecked(bytes, index) }
120 })
121 }
122 };
123}
124
125macro_rules! impl_for_order {
126 ($order:ty) => {
127 impl<R> BufferedBinaryReader<R, $order>
128 where
129 R: Read,
130 {
131 impl_value_read!($order, read_u8, u8, "Reads an unsigned 8-bit integer.");
132 impl_value_read!($order, read_i8, i8, "Reads a signed 8-bit integer.");
133 impl_value_read!($order, read_u16, u16, "Reads an unsigned 16-bit integer.");
134 impl_value_read!($order, read_u32, u32, "Reads an unsigned 32-bit integer.");
135 impl_value_read!($order, read_u64, u64, "Reads an unsigned 64-bit integer.");
136 impl_value_read!($order, read_u128, u128, "Reads an unsigned 128-bit integer.");
137 impl_value_read!($order, read_i16, i16, "Reads a signed 16-bit integer.");
138 impl_value_read!($order, read_i32, i32, "Reads a signed 32-bit integer.");
139 impl_value_read!($order, read_i64, i64, "Reads a signed 64-bit integer.");
140 impl_value_read!($order, read_i128, i128, "Reads a signed 128-bit integer.");
141 impl_value_read!($order, read_f32, f32, "Reads a 32-bit float.");
142 impl_value_read!($order, read_f64, f64, "Reads a 64-bit float.");
143 }
144 };
145}
146
147impl_for_order!(BigEndian);
148impl_for_order!(LittleEndian);
149
150impl<R, O> Read for BufferedBinaryReader<R, O>
151where
152 R: Read,
153{
154 #[inline]
156 fn read(&mut self, buffer: &mut [u8]) -> Result<usize> {
157 self.input.read_raw(buffer)
158 }
159}
160
161impl<R, O> Seek for BufferedBinaryReader<R, O>
162where
163 R: Read + Seek,
164{
165 #[inline]
167 fn seek(&mut self, position: SeekFrom) -> Result<u64> {
168 self.input.seek_raw(position)
169 }
170}