oximedia_bitstream/write/
stream_traits.rs1use core::convert::TryInto;
11use std::io;
12
13use super::{BitWrite, BitsWritten, ByteWrite, Counter, Endianness, Overflowed, Primitive};
14
15pub trait ToBitStream {
46 type Error;
48
49 fn to_writer<W: BitWrite + ?Sized>(&self, w: &mut W) -> Result<(), Self::Error>
51 where
52 Self: Sized;
53
54 fn bits<C: Counter>(&self) -> Result<C, Self::Error>
56 where
57 Self: Sized,
58 {
59 let mut c: BitsWritten<C> = BitsWritten::default();
60 self.to_writer(&mut c)?;
61 Ok(c.into_written())
62 }
63
64 #[deprecated(since = "4.0.0", note = "use of bits() is preferred")]
66 #[inline]
67 fn bits_len<C: Counter, E: Endianness>(&self) -> Result<C, Self::Error>
68 where
69 Self: Sized,
70 {
71 self.bits()
72 }
73}
74
75pub trait ToBitStreamWith<'a> {
78 type Context: 'a;
80
81 type Error;
83
84 fn to_writer<W: BitWrite + ?Sized>(
86 &self,
87 w: &mut W,
88 context: &Self::Context,
89 ) -> Result<(), Self::Error>
90 where
91 Self: Sized;
92
93 fn bits<C: Counter>(&self, context: &Self::Context) -> Result<C, Self::Error>
95 where
96 Self: Sized,
97 {
98 let mut c: BitsWritten<C> = BitsWritten::default();
99 self.to_writer(&mut c, context)?;
100 Ok(c.into_written())
101 }
102
103 #[deprecated(since = "4.0.0", note = "use of len() is preferred")]
105 #[inline]
106 fn bits_len<C: Counter, E: Endianness>(&self, context: &Self::Context) -> Result<C, Self::Error>
107 where
108 Self: Sized,
109 {
110 self.bits(context)
111 }
112}
113
114pub trait ToBitStreamUsing {
117 type Context;
119
120 type Error;
122
123 fn to_writer<W: BitWrite + ?Sized>(
125 &self,
126 w: &mut W,
127 context: Self::Context,
128 ) -> Result<(), Self::Error>
129 where
130 Self: Sized;
131
132 fn bits<C: Counter>(&self, context: Self::Context) -> Result<C, Self::Error>
134 where
135 Self: Sized,
136 {
137 let mut c: BitsWritten<C> = BitsWritten::default();
138 self.to_writer(&mut c, context)?;
139 Ok(c.into_written())
140 }
141}
142
143pub trait ToByteStream {
146 type Error;
148
149 fn to_writer<W: ByteWrite + ?Sized>(&self, w: &mut W) -> Result<(), Self::Error>
151 where
152 Self: Sized;
153
154 fn bytes<C: Counter>(&self) -> Result<C, Self::Error>
156 where
157 Self: Sized,
158 {
159 let mut counter = ByteCount::default();
160 self.to_writer(&mut counter)?;
161 Ok(counter.writer.count)
162 }
163}
164
165pub trait ToByteStreamWith<'a> {
168 type Context: 'a;
170
171 type Error;
173
174 fn to_writer<W: ByteWrite + ?Sized>(
176 &self,
177 w: &mut W,
178 context: &Self::Context,
179 ) -> Result<(), Self::Error>
180 where
181 Self: Sized;
182
183 fn bytes<C: Counter>(&self, context: &Self::Context) -> Result<C, Self::Error>
185 where
186 Self: Sized,
187 {
188 let mut counter = ByteCount::default();
189 self.to_writer(&mut counter, context)?;
190 Ok(counter.writer.count)
191 }
192}
193
194pub trait ToByteStreamUsing {
197 type Context;
199
200 type Error;
202
203 fn to_writer<W: ByteWrite + ?Sized>(
205 &self,
206 w: &mut W,
207 context: Self::Context,
208 ) -> Result<(), Self::Error>
209 where
210 Self: Sized;
211
212 fn bytes<C: Counter>(&self, context: Self::Context) -> Result<C, Self::Error>
214 where
215 Self: Sized,
216 {
217 let mut counter = ByteCount::default();
218 self.to_writer(&mut counter, context)?;
219 Ok(counter.writer.count)
220 }
221}
222
223#[derive(Default)]
224struct ByteCounterWriter<C> {
225 count: C,
226}
227
228impl<C: Counter> io::Write for ByteCounterWriter<C> {
229 #[inline]
230 fn write(&mut self, buf: &[u8]) -> io::Result<usize> {
231 self.count
232 .checked_add_assign(buf.len().try_into().map_err(|_| Overflowed)?)?;
233
234 Ok(buf.len())
235 }
236
237 #[inline]
238 fn flush(&mut self) -> io::Result<()> {
239 Ok(())
241 }
242}
243
244#[derive(Default)]
245struct ByteCount<C> {
246 writer: ByteCounterWriter<C>,
247}
248
249impl<C: Counter> ByteWrite for ByteCount<C> {
250 fn write<V: Primitive>(&mut self, _value: V) -> io::Result<()> {
251 self.writer.count.checked_add_assign(
252 V::buffer()
253 .as_ref()
254 .len()
255 .try_into()
256 .map_err(|_| Overflowed)?,
257 )?;
258
259 Ok(())
260 }
261
262 fn write_as<F: Endianness, V: Primitive>(&mut self, _value: V) -> io::Result<()> {
263 self.writer.count.checked_add_assign(
264 V::buffer()
265 .as_ref()
266 .len()
267 .try_into()
268 .map_err(|_| Overflowed)?,
269 )?;
270
271 Ok(())
272 }
273
274 fn write_bytes(&mut self, buf: &[u8]) -> io::Result<()> {
275 self.writer
276 .count
277 .checked_add_assign(buf.len().try_into().map_err(|_| Overflowed)?)?;
278
279 Ok(())
280 }
281
282 fn pad(&mut self, bytes: u32) -> io::Result<()> {
283 self.writer
284 .count
285 .checked_add_assign(bytes.try_into().map_err(|_| Overflowed)?)?;
286
287 Ok(())
288 }
289
290 fn writer_ref(&mut self) -> &mut dyn io::Write {
291 &mut self.writer
292 }
293}