byteorder_lite/io.rs
1use std::io::{self, Result};
2
3use crate::ByteOrder;
4
5/// Extends [`Read`] with methods for reading numbers. (For `std::io`.)
6///
7/// Most of the methods defined here have an unconstrained type parameter that
8/// must be explicitly instantiated. Typically, it is instantiated with either
9/// the [`BigEndian`] or [`LittleEndian`] types defined in this crate.
10///
11/// # Examples
12///
13/// Read unsigned 16 bit big-endian integers from a [`Read`]:
14///
15/// ```rust
16/// use std::io::Cursor;
17/// use byteorder_lite::{BigEndian, ReadBytesExt};
18///
19/// let mut rdr = Cursor::new(vec![2, 5, 3, 0]);
20/// assert_eq!(517, rdr.read_u16::<BigEndian>().unwrap());
21/// assert_eq!(768, rdr.read_u16::<BigEndian>().unwrap());
22/// ```
23///
24/// [`BigEndian`]: enum.BigEndian.html
25/// [`LittleEndian`]: enum.LittleEndian.html
26/// [`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html
27pub trait ReadBytesExt: io::Read {
28 /// Reads an unsigned 8 bit integer from the underlying reader.
29 ///
30 /// Note that since this reads a single byte, no byte order conversions
31 /// are used. It is included for completeness.
32 ///
33 /// # Errors
34 ///
35 /// This method returns the same errors as [`Read::read_exact`].
36 ///
37 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
38 ///
39 /// # Examples
40 ///
41 /// Read unsigned 8 bit integers from a `Read`:
42 ///
43 /// ```rust
44 /// use std::io::Cursor;
45 /// use byteorder_lite::ReadBytesExt;
46 ///
47 /// let mut rdr = Cursor::new(vec![2, 5]);
48 /// assert_eq!(2, rdr.read_u8().unwrap());
49 /// assert_eq!(5, rdr.read_u8().unwrap());
50 /// ```
51 #[inline]
52 fn read_u8(&mut self) -> Result<u8> {
53 let mut buf = [0; 1];
54 self.read_exact(&mut buf)?;
55 Ok(buf[0])
56 }
57
58 /// Reads a signed 8 bit integer from the underlying reader.
59 ///
60 /// Note that since this reads a single byte, no byte order conversions
61 /// are used. It is included for completeness.
62 ///
63 /// # Errors
64 ///
65 /// This method returns the same errors as [`Read::read_exact`].
66 ///
67 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
68 ///
69 /// # Examples
70 ///
71 /// Read signed 8 bit integers from a `Read`:
72 ///
73 /// ```rust
74 /// use std::io::Cursor;
75 /// use byteorder_lite::ReadBytesExt;
76 ///
77 /// let mut rdr = Cursor::new(vec![0x02, 0xfb]);
78 /// assert_eq!(2, rdr.read_i8().unwrap());
79 /// assert_eq!(-5, rdr.read_i8().unwrap());
80 /// ```
81 #[inline]
82 fn read_i8(&mut self) -> Result<i8> {
83 let mut buf = [0; 1];
84 self.read_exact(&mut buf)?;
85 Ok(buf[0] as i8)
86 }
87
88 /// Reads an unsigned 16 bit integer from the underlying reader.
89 ///
90 /// # Errors
91 ///
92 /// This method returns the same errors as [`Read::read_exact`].
93 ///
94 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
95 ///
96 /// # Examples
97 ///
98 /// Read unsigned 16 bit big-endian integers from a `Read`:
99 ///
100 /// ```rust
101 /// use std::io::Cursor;
102 /// use byteorder_lite::{BigEndian, ReadBytesExt};
103 ///
104 /// let mut rdr = Cursor::new(vec![2, 5, 3, 0]);
105 /// assert_eq!(517, rdr.read_u16::<BigEndian>().unwrap());
106 /// assert_eq!(768, rdr.read_u16::<BigEndian>().unwrap());
107 /// ```
108 #[inline]
109 fn read_u16<T: ByteOrder>(&mut self) -> Result<u16> {
110 let mut buf = [0; 2];
111 self.read_exact(&mut buf)?;
112 Ok(T::read_u16(&buf))
113 }
114
115 /// Reads a signed 16 bit integer from the underlying reader.
116 ///
117 /// # Errors
118 ///
119 /// This method returns the same errors as [`Read::read_exact`].
120 ///
121 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
122 ///
123 /// # Examples
124 ///
125 /// Read signed 16 bit big-endian integers from a `Read`:
126 ///
127 /// ```rust
128 /// use std::io::Cursor;
129 /// use byteorder_lite::{BigEndian, ReadBytesExt};
130 ///
131 /// let mut rdr = Cursor::new(vec![0x00, 0xc1, 0xff, 0x7c]);
132 /// assert_eq!(193, rdr.read_i16::<BigEndian>().unwrap());
133 /// assert_eq!(-132, rdr.read_i16::<BigEndian>().unwrap());
134 /// ```
135 #[inline]
136 fn read_i16<T: ByteOrder>(&mut self) -> Result<i16> {
137 let mut buf = [0; 2];
138 self.read_exact(&mut buf)?;
139 Ok(T::read_i16(&buf))
140 }
141
142 /// Reads an unsigned 24 bit integer from the underlying reader.
143 ///
144 /// # Errors
145 ///
146 /// This method returns the same errors as [`Read::read_exact`].
147 ///
148 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
149 ///
150 /// # Examples
151 ///
152 /// Read unsigned 24 bit big-endian integers from a `Read`:
153 ///
154 /// ```rust
155 /// use std::io::Cursor;
156 /// use byteorder_lite::{BigEndian, ReadBytesExt};
157 ///
158 /// let mut rdr = Cursor::new(vec![0x00, 0x01, 0x0b]);
159 /// assert_eq!(267, rdr.read_u24::<BigEndian>().unwrap());
160 /// ```
161 #[inline]
162 fn read_u24<T: ByteOrder>(&mut self) -> Result<u32> {
163 let mut buf = [0; 3];
164 self.read_exact(&mut buf)?;
165 Ok(T::read_u24(&buf))
166 }
167
168 /// Reads a signed 24 bit integer from the underlying reader.
169 ///
170 /// # Errors
171 ///
172 /// This method returns the same errors as [`Read::read_exact`].
173 ///
174 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
175 ///
176 /// # Examples
177 ///
178 /// Read signed 24 bit big-endian integers from a `Read`:
179 ///
180 /// ```rust
181 /// use std::io::Cursor;
182 /// use byteorder_lite::{BigEndian, ReadBytesExt};
183 ///
184 /// let mut rdr = Cursor::new(vec![0xff, 0x7a, 0x33]);
185 /// assert_eq!(-34253, rdr.read_i24::<BigEndian>().unwrap());
186 /// ```
187 #[inline]
188 fn read_i24<T: ByteOrder>(&mut self) -> Result<i32> {
189 let mut buf = [0; 3];
190 self.read_exact(&mut buf)?;
191 Ok(T::read_i24(&buf))
192 }
193
194 /// Reads an unsigned 32 bit integer from the underlying reader.
195 ///
196 /// # Errors
197 ///
198 /// This method returns the same errors as [`Read::read_exact`].
199 ///
200 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
201 ///
202 /// # Examples
203 ///
204 /// Read unsigned 32 bit big-endian integers from a `Read`:
205 ///
206 /// ```rust
207 /// use std::io::Cursor;
208 /// use byteorder_lite::{BigEndian, ReadBytesExt};
209 ///
210 /// let mut rdr = Cursor::new(vec![0x00, 0x00, 0x01, 0x0b]);
211 /// assert_eq!(267, rdr.read_u32::<BigEndian>().unwrap());
212 /// ```
213 #[inline]
214 fn read_u32<T: ByteOrder>(&mut self) -> Result<u32> {
215 let mut buf = [0; 4];
216 self.read_exact(&mut buf)?;
217 Ok(T::read_u32(&buf))
218 }
219
220 /// Reads a signed 32 bit integer from the underlying reader.
221 ///
222 /// # Errors
223 ///
224 /// This method returns the same errors as [`Read::read_exact`].
225 ///
226 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
227 ///
228 /// # Examples
229 ///
230 /// Read signed 32 bit big-endian integers from a `Read`:
231 ///
232 /// ```rust
233 /// use std::io::Cursor;
234 /// use byteorder_lite::{BigEndian, ReadBytesExt};
235 ///
236 /// let mut rdr = Cursor::new(vec![0xff, 0xff, 0x7a, 0x33]);
237 /// assert_eq!(-34253, rdr.read_i32::<BigEndian>().unwrap());
238 /// ```
239 #[inline]
240 fn read_i32<T: ByteOrder>(&mut self) -> Result<i32> {
241 let mut buf = [0; 4];
242 self.read_exact(&mut buf)?;
243 Ok(T::read_i32(&buf))
244 }
245
246 /// Reads an unsigned 48 bit integer from the underlying reader.
247 ///
248 /// # Errors
249 ///
250 /// This method returns the same errors as [`Read::read_exact`].
251 ///
252 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
253 ///
254 /// # Examples
255 ///
256 /// Read unsigned 48 bit big-endian integers from a `Read`:
257 ///
258 /// ```rust
259 /// use std::io::Cursor;
260 /// use byteorder_lite::{BigEndian, ReadBytesExt};
261 ///
262 /// let mut rdr = Cursor::new(vec![0xb6, 0x71, 0x6b, 0xdc, 0x2b, 0x31]);
263 /// assert_eq!(200598257150769, rdr.read_u48::<BigEndian>().unwrap());
264 /// ```
265 #[inline]
266 fn read_u48<T: ByteOrder>(&mut self) -> Result<u64> {
267 let mut buf = [0; 6];
268 self.read_exact(&mut buf)?;
269 Ok(T::read_u48(&buf))
270 }
271
272 /// Reads a signed 48 bit integer from the underlying reader.
273 ///
274 /// # Errors
275 ///
276 /// This method returns the same errors as [`Read::read_exact`].
277 ///
278 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
279 ///
280 /// # Examples
281 ///
282 /// Read signed 48 bit big-endian integers from a `Read`:
283 ///
284 /// ```rust
285 /// use std::io::Cursor;
286 /// use byteorder_lite::{BigEndian, ReadBytesExt};
287 ///
288 /// let mut rdr = Cursor::new(vec![0x9d, 0x71, 0xab, 0xe7, 0x97, 0x8f]);
289 /// assert_eq!(-108363435763825, rdr.read_i48::<BigEndian>().unwrap());
290 /// ```
291 #[inline]
292 fn read_i48<T: ByteOrder>(&mut self) -> Result<i64> {
293 let mut buf = [0; 6];
294 self.read_exact(&mut buf)?;
295 Ok(T::read_i48(&buf))
296 }
297
298 /// Reads an unsigned 64 bit integer from the underlying reader.
299 ///
300 /// # Errors
301 ///
302 /// This method returns the same errors as [`Read::read_exact`].
303 ///
304 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
305 ///
306 /// # Examples
307 ///
308 /// Read an unsigned 64 bit big-endian integer from a `Read`:
309 ///
310 /// ```rust
311 /// use std::io::Cursor;
312 /// use byteorder_lite::{BigEndian, ReadBytesExt};
313 ///
314 /// let mut rdr = Cursor::new(vec![0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83]);
315 /// assert_eq!(918733457491587, rdr.read_u64::<BigEndian>().unwrap());
316 /// ```
317 #[inline]
318 fn read_u64<T: ByteOrder>(&mut self) -> Result<u64> {
319 let mut buf = [0; 8];
320 self.read_exact(&mut buf)?;
321 Ok(T::read_u64(&buf))
322 }
323
324 /// Reads a signed 64 bit integer from the underlying reader.
325 ///
326 /// # Errors
327 ///
328 /// This method returns the same errors as [`Read::read_exact`].
329 ///
330 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
331 ///
332 /// # Examples
333 ///
334 /// Read a signed 64 bit big-endian integer from a `Read`:
335 ///
336 /// ```rust
337 /// use std::io::Cursor;
338 /// use byteorder_lite::{BigEndian, ReadBytesExt};
339 ///
340 /// let mut rdr = Cursor::new(vec![0x80, 0, 0, 0, 0, 0, 0, 0]);
341 /// assert_eq!(i64::min_value(), rdr.read_i64::<BigEndian>().unwrap());
342 /// ```
343 #[inline]
344 fn read_i64<T: ByteOrder>(&mut self) -> Result<i64> {
345 let mut buf = [0; 8];
346 self.read_exact(&mut buf)?;
347 Ok(T::read_i64(&buf))
348 }
349
350 /// Reads an unsigned 128 bit integer from the underlying reader.
351 ///
352 /// # Errors
353 ///
354 /// This method returns the same errors as [`Read::read_exact`].
355 ///
356 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
357 ///
358 /// # Examples
359 ///
360 /// Read an unsigned 128 bit big-endian integer from a `Read`:
361 ///
362 /// ```rust
363 /// use std::io::Cursor;
364 /// use byteorder_lite::{BigEndian, ReadBytesExt};
365 ///
366 /// let mut rdr = Cursor::new(vec![
367 /// 0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83,
368 /// 0x00, 0x03, 0x43, 0x95, 0x4d, 0x60, 0x86, 0x83
369 /// ]);
370 /// assert_eq!(16947640962301618749969007319746179, rdr.read_u128::<BigEndian>().unwrap());
371 /// ```
372 #[inline]
373 fn read_u128<T: ByteOrder>(&mut self) -> Result<u128> {
374 let mut buf = [0; 16];
375 self.read_exact(&mut buf)?;
376 Ok(T::read_u128(&buf))
377 }
378
379 /// Reads a signed 128 bit integer from the underlying reader.
380 ///
381 /// # Errors
382 ///
383 /// This method returns the same errors as [`Read::read_exact`].
384 ///
385 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
386 ///
387 /// # Examples
388 ///
389 /// Read a signed 128 bit big-endian integer from a `Read`:
390 ///
391 /// ```rust
392 /// use std::io::Cursor;
393 /// use byteorder_lite::{BigEndian, ReadBytesExt};
394 ///
395 /// let mut rdr = Cursor::new(vec![0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
396 /// assert_eq!(i128::min_value(), rdr.read_i128::<BigEndian>().unwrap());
397 /// ```
398 #[inline]
399 fn read_i128<T: ByteOrder>(&mut self) -> Result<i128> {
400 let mut buf = [0; 16];
401 self.read_exact(&mut buf)?;
402 Ok(T::read_i128(&buf))
403 }
404
405 /// Reads an unsigned n-bytes integer from the underlying reader.
406 ///
407 /// # Errors
408 ///
409 /// This method returns the same errors as [`Read::read_exact`].
410 ///
411 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
412 ///
413 /// # Examples
414 ///
415 /// Read an unsigned n-byte big-endian integer from a `Read`:
416 ///
417 /// ```rust
418 /// use std::io::Cursor;
419 /// use byteorder_lite::{BigEndian, ReadBytesExt};
420 ///
421 /// let mut rdr = Cursor::new(vec![0x80, 0x74, 0xfa]);
422 /// assert_eq!(8418554, rdr.read_uint::<BigEndian>(3).unwrap());
423 #[inline]
424 fn read_uint<T: ByteOrder>(&mut self, nbytes: usize) -> Result<u64> {
425 let mut buf = [0; 8];
426 self.read_exact(&mut buf[..nbytes])?;
427 Ok(T::read_uint(&buf[..nbytes], nbytes))
428 }
429
430 /// Reads a signed n-bytes integer from the underlying reader.
431 ///
432 /// # Errors
433 ///
434 /// This method returns the same errors as [`Read::read_exact`].
435 ///
436 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
437 ///
438 /// # Examples
439 ///
440 /// Read an unsigned n-byte big-endian integer from a `Read`:
441 ///
442 /// ```rust
443 /// use std::io::Cursor;
444 /// use byteorder_lite::{BigEndian, ReadBytesExt};
445 ///
446 /// let mut rdr = Cursor::new(vec![0xc1, 0xff, 0x7c]);
447 /// assert_eq!(-4063364, rdr.read_int::<BigEndian>(3).unwrap());
448 #[inline]
449 fn read_int<T: ByteOrder>(&mut self, nbytes: usize) -> Result<i64> {
450 let mut buf = [0; 8];
451 self.read_exact(&mut buf[..nbytes])?;
452 Ok(T::read_int(&buf[..nbytes], nbytes))
453 }
454
455 /// Reads an unsigned n-bytes integer from the underlying reader.
456 #[inline]
457 fn read_uint128<T: ByteOrder>(&mut self, nbytes: usize) -> Result<u128> {
458 let mut buf = [0; 16];
459 self.read_exact(&mut buf[..nbytes])?;
460 Ok(T::read_uint128(&buf[..nbytes], nbytes))
461 }
462
463 /// Reads a signed n-bytes integer from the underlying reader.
464 #[inline]
465 fn read_int128<T: ByteOrder>(&mut self, nbytes: usize) -> Result<i128> {
466 let mut buf = [0; 16];
467 self.read_exact(&mut buf[..nbytes])?;
468 Ok(T::read_int128(&buf[..nbytes], nbytes))
469 }
470
471 /// Reads a IEEE754 single-precision (4 bytes) floating point number from
472 /// the underlying reader.
473 ///
474 /// # Errors
475 ///
476 /// This method returns the same errors as [`Read::read_exact`].
477 ///
478 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
479 ///
480 /// # Examples
481 ///
482 /// Read a big-endian single-precision floating point number from a `Read`:
483 ///
484 /// ```rust
485 /// use std::f32;
486 /// use std::io::Cursor;
487 ///
488 /// use byteorder_lite::{BigEndian, ReadBytesExt};
489 ///
490 /// let mut rdr = Cursor::new(vec![
491 /// 0x40, 0x49, 0x0f, 0xdb,
492 /// ]);
493 /// assert_eq!(f32::consts::PI, rdr.read_f32::<BigEndian>().unwrap());
494 /// ```
495 #[inline]
496 fn read_f32<T: ByteOrder>(&mut self) -> Result<f32> {
497 let mut buf = [0; 4];
498 self.read_exact(&mut buf)?;
499 Ok(T::read_f32(&buf))
500 }
501
502 /// Reads a IEEE754 double-precision (8 bytes) floating point number from
503 /// the underlying reader.
504 ///
505 /// # Errors
506 ///
507 /// This method returns the same errors as [`Read::read_exact`].
508 ///
509 /// [`Read::read_exact`]: https://doc.rust-lang.org/std/io/trait.Read.html#method.read_exact
510 ///
511 /// # Examples
512 ///
513 /// Read a big-endian double-precision floating point number from a `Read`:
514 ///
515 /// ```rust
516 /// use std::f64;
517 /// use std::io::Cursor;
518 ///
519 /// use byteorder_lite::{BigEndian, ReadBytesExt};
520 ///
521 /// let mut rdr = Cursor::new(vec![
522 /// 0x40, 0x09, 0x21, 0xfb, 0x54, 0x44, 0x2d, 0x18,
523 /// ]);
524 /// assert_eq!(f64::consts::PI, rdr.read_f64::<BigEndian>().unwrap());
525 /// ```
526 #[inline]
527 fn read_f64<T: ByteOrder>(&mut self) -> Result<f64> {
528 let mut buf = [0; 8];
529 self.read_exact(&mut buf)?;
530 Ok(T::read_f64(&buf))
531 }
532}
533
534/// All types that implement `Read` get methods defined in `ReadBytesExt`
535/// for free.
536impl<R: io::Read + ?Sized> ReadBytesExt for R {}
537
538/// Extends [`Write`] with methods for writing numbers. (For `std::io`.)
539///
540/// Most of the methods defined here have an unconstrained type parameter that
541/// must be explicitly instantiated. Typically, it is instantiated with either
542/// the [`BigEndian`] or [`LittleEndian`] types defined in this crate.
543///
544/// # Examples
545///
546/// Write unsigned 16 bit big-endian integers to a [`Write`]:
547///
548/// ```rust
549/// use byteorder_lite::{BigEndian, WriteBytesExt};
550///
551/// let mut wtr = vec![];
552/// wtr.write_u16::<BigEndian>(517).unwrap();
553/// wtr.write_u16::<BigEndian>(768).unwrap();
554/// assert_eq!(wtr, vec![2, 5, 3, 0]);
555/// ```
556///
557/// [`BigEndian`]: enum.BigEndian.html
558/// [`LittleEndian`]: enum.LittleEndian.html
559/// [`Write`]: https://doc.rust-lang.org/std/io/trait.Write.html
560pub trait WriteBytesExt: io::Write {
561 /// Writes an unsigned 8 bit integer to the underlying writer.
562 ///
563 /// Note that since this writes a single byte, no byte order conversions
564 /// are used. It is included for completeness.
565 ///
566 /// # Errors
567 ///
568 /// This method returns the same errors as [`Write::write_all`].
569 ///
570 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
571 ///
572 /// # Examples
573 ///
574 /// Write unsigned 8 bit integers to a `Write`:
575 ///
576 /// ```rust
577 /// use byteorder_lite::WriteBytesExt;
578 ///
579 /// let mut wtr = Vec::new();
580 /// wtr.write_u8(2).unwrap();
581 /// wtr.write_u8(5).unwrap();
582 /// assert_eq!(wtr, b"\x02\x05");
583 /// ```
584 #[inline]
585 fn write_u8(&mut self, n: u8) -> Result<()> {
586 self.write_all(&[n])
587 }
588
589 /// Writes a signed 8 bit integer to the underlying writer.
590 ///
591 /// Note that since this writes a single byte, no byte order conversions
592 /// are used. It is included for completeness.
593 ///
594 /// # Errors
595 ///
596 /// This method returns the same errors as [`Write::write_all`].
597 ///
598 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
599 ///
600 /// # Examples
601 ///
602 /// Write signed 8 bit integers to a `Write`:
603 ///
604 /// ```rust
605 /// use byteorder_lite::WriteBytesExt;
606 ///
607 /// let mut wtr = Vec::new();
608 /// wtr.write_i8(2).unwrap();
609 /// wtr.write_i8(-5).unwrap();
610 /// assert_eq!(wtr, b"\x02\xfb");
611 /// ```
612 #[inline]
613 fn write_i8(&mut self, n: i8) -> Result<()> {
614 self.write_all(&[n as u8])
615 }
616
617 /// Writes an unsigned 16 bit integer to the underlying writer.
618 ///
619 /// # Errors
620 ///
621 /// This method returns the same errors as [`Write::write_all`].
622 ///
623 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
624 ///
625 /// # Examples
626 ///
627 /// Write unsigned 16 bit big-endian integers to a `Write`:
628 ///
629 /// ```rust
630 /// use byteorder_lite::{BigEndian, WriteBytesExt};
631 ///
632 /// let mut wtr = Vec::new();
633 /// wtr.write_u16::<BigEndian>(517).unwrap();
634 /// wtr.write_u16::<BigEndian>(768).unwrap();
635 /// assert_eq!(wtr, b"\x02\x05\x03\x00");
636 /// ```
637 #[inline]
638 fn write_u16<T: ByteOrder>(&mut self, n: u16) -> Result<()> {
639 let mut buf = [0; 2];
640 T::write_u16(&mut buf, n);
641 self.write_all(&buf)
642 }
643
644 /// Writes a signed 16 bit integer to the underlying writer.
645 ///
646 /// # Errors
647 ///
648 /// This method returns the same errors as [`Write::write_all`].
649 ///
650 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
651 ///
652 /// # Examples
653 ///
654 /// Write signed 16 bit big-endian integers to a `Write`:
655 ///
656 /// ```rust
657 /// use byteorder_lite::{BigEndian, WriteBytesExt};
658 ///
659 /// let mut wtr = Vec::new();
660 /// wtr.write_i16::<BigEndian>(193).unwrap();
661 /// wtr.write_i16::<BigEndian>(-132).unwrap();
662 /// assert_eq!(wtr, b"\x00\xc1\xff\x7c");
663 /// ```
664 #[inline]
665 fn write_i16<T: ByteOrder>(&mut self, n: i16) -> Result<()> {
666 let mut buf = [0; 2];
667 T::write_i16(&mut buf, n);
668 self.write_all(&buf)
669 }
670
671 /// Writes an unsigned 24 bit integer to the underlying writer.
672 ///
673 /// # Errors
674 ///
675 /// This method returns the same errors as [`Write::write_all`].
676 ///
677 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
678 ///
679 /// # Examples
680 ///
681 /// Write unsigned 24 bit big-endian integers to a `Write`:
682 ///
683 /// ```rust
684 /// use byteorder_lite::{BigEndian, WriteBytesExt};
685 ///
686 /// let mut wtr = Vec::new();
687 /// wtr.write_u24::<BigEndian>(267).unwrap();
688 /// wtr.write_u24::<BigEndian>(120111).unwrap();
689 /// assert_eq!(wtr, b"\x00\x01\x0b\x01\xd5\x2f");
690 /// ```
691 #[inline]
692 fn write_u24<T: ByteOrder>(&mut self, n: u32) -> Result<()> {
693 let mut buf = [0; 3];
694 T::write_u24(&mut buf, n);
695 self.write_all(&buf)
696 }
697
698 /// Writes a signed 24 bit integer to the underlying writer.
699 ///
700 /// # Errors
701 ///
702 /// This method returns the same errors as [`Write::write_all`].
703 ///
704 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
705 ///
706 /// # Examples
707 ///
708 /// Write signed 24 bit big-endian integers to a `Write`:
709 ///
710 /// ```rust
711 /// use byteorder_lite::{BigEndian, WriteBytesExt};
712 ///
713 /// let mut wtr = Vec::new();
714 /// wtr.write_i24::<BigEndian>(-34253).unwrap();
715 /// wtr.write_i24::<BigEndian>(120111).unwrap();
716 /// assert_eq!(wtr, b"\xff\x7a\x33\x01\xd5\x2f");
717 /// ```
718 #[inline]
719 fn write_i24<T: ByteOrder>(&mut self, n: i32) -> Result<()> {
720 let mut buf = [0; 3];
721 T::write_i24(&mut buf, n);
722 self.write_all(&buf)
723 }
724
725 /// Writes an unsigned 32 bit integer to the underlying writer.
726 ///
727 /// # Errors
728 ///
729 /// This method returns the same errors as [`Write::write_all`].
730 ///
731 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
732 ///
733 /// # Examples
734 ///
735 /// Write unsigned 32 bit big-endian integers to a `Write`:
736 ///
737 /// ```rust
738 /// use byteorder_lite::{BigEndian, WriteBytesExt};
739 ///
740 /// let mut wtr = Vec::new();
741 /// wtr.write_u32::<BigEndian>(267).unwrap();
742 /// wtr.write_u32::<BigEndian>(1205419366).unwrap();
743 /// assert_eq!(wtr, b"\x00\x00\x01\x0b\x47\xd9\x3d\x66");
744 /// ```
745 #[inline]
746 fn write_u32<T: ByteOrder>(&mut self, n: u32) -> Result<()> {
747 let mut buf = [0; 4];
748 T::write_u32(&mut buf, n);
749 self.write_all(&buf)
750 }
751
752 /// Writes a signed 32 bit integer to the underlying writer.
753 ///
754 /// # Errors
755 ///
756 /// This method returns the same errors as [`Write::write_all`].
757 ///
758 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
759 ///
760 /// # Examples
761 ///
762 /// Write signed 32 bit big-endian integers to a `Write`:
763 ///
764 /// ```rust
765 /// use byteorder_lite::{BigEndian, WriteBytesExt};
766 ///
767 /// let mut wtr = Vec::new();
768 /// wtr.write_i32::<BigEndian>(-34253).unwrap();
769 /// wtr.write_i32::<BigEndian>(1205419366).unwrap();
770 /// assert_eq!(wtr, b"\xff\xff\x7a\x33\x47\xd9\x3d\x66");
771 /// ```
772 #[inline]
773 fn write_i32<T: ByteOrder>(&mut self, n: i32) -> Result<()> {
774 let mut buf = [0; 4];
775 T::write_i32(&mut buf, n);
776 self.write_all(&buf)
777 }
778
779 /// Writes an unsigned 48 bit integer to the underlying writer.
780 ///
781 /// # Errors
782 ///
783 /// This method returns the same errors as [`Write::write_all`].
784 ///
785 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
786 ///
787 /// # Examples
788 ///
789 /// Write unsigned 48 bit big-endian integers to a `Write`:
790 ///
791 /// ```rust
792 /// use byteorder_lite::{BigEndian, WriteBytesExt};
793 ///
794 /// let mut wtr = Vec::new();
795 /// wtr.write_u48::<BigEndian>(52360336390828).unwrap();
796 /// wtr.write_u48::<BigEndian>(541).unwrap();
797 /// assert_eq!(wtr, b"\x2f\x9f\x17\x40\x3a\xac\x00\x00\x00\x00\x02\x1d");
798 /// ```
799 #[inline]
800 fn write_u48<T: ByteOrder>(&mut self, n: u64) -> Result<()> {
801 let mut buf = [0; 6];
802 T::write_u48(&mut buf, n);
803 self.write_all(&buf)
804 }
805
806 /// Writes a signed 48 bit integer to the underlying writer.
807 ///
808 /// # Errors
809 ///
810 /// This method returns the same errors as [`Write::write_all`].
811 ///
812 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
813 ///
814 /// # Examples
815 ///
816 /// Write signed 48 bit big-endian integers to a `Write`:
817 ///
818 /// ```rust
819 /// use byteorder_lite::{BigEndian, WriteBytesExt};
820 ///
821 /// let mut wtr = Vec::new();
822 /// wtr.write_i48::<BigEndian>(-108363435763825).unwrap();
823 /// wtr.write_i48::<BigEndian>(77).unwrap();
824 /// assert_eq!(wtr, b"\x9d\x71\xab\xe7\x97\x8f\x00\x00\x00\x00\x00\x4d");
825 /// ```
826 #[inline]
827 fn write_i48<T: ByteOrder>(&mut self, n: i64) -> Result<()> {
828 let mut buf = [0; 6];
829 T::write_i48(&mut buf, n);
830 self.write_all(&buf)
831 }
832
833 /// Writes an unsigned 64 bit integer to the underlying writer.
834 ///
835 /// # Errors
836 ///
837 /// This method returns the same errors as [`Write::write_all`].
838 ///
839 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
840 ///
841 /// # Examples
842 ///
843 /// Write unsigned 64 bit big-endian integers to a `Write`:
844 ///
845 /// ```rust
846 /// use byteorder_lite::{BigEndian, WriteBytesExt};
847 ///
848 /// let mut wtr = Vec::new();
849 /// wtr.write_u64::<BigEndian>(918733457491587).unwrap();
850 /// wtr.write_u64::<BigEndian>(143).unwrap();
851 /// assert_eq!(wtr, b"\x00\x03\x43\x95\x4d\x60\x86\x83\x00\x00\x00\x00\x00\x00\x00\x8f");
852 /// ```
853 #[inline]
854 fn write_u64<T: ByteOrder>(&mut self, n: u64) -> Result<()> {
855 let mut buf = [0; 8];
856 T::write_u64(&mut buf, n);
857 self.write_all(&buf)
858 }
859
860 /// Writes a signed 64 bit integer to the underlying writer.
861 ///
862 /// # Errors
863 ///
864 /// This method returns the same errors as [`Write::write_all`].
865 ///
866 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
867 ///
868 /// # Examples
869 ///
870 /// Write signed 64 bit big-endian integers to a `Write`:
871 ///
872 /// ```rust
873 /// use byteorder_lite::{BigEndian, WriteBytesExt};
874 ///
875 /// let mut wtr = Vec::new();
876 /// wtr.write_i64::<BigEndian>(i64::min_value()).unwrap();
877 /// wtr.write_i64::<BigEndian>(i64::max_value()).unwrap();
878 /// assert_eq!(wtr, b"\x80\x00\x00\x00\x00\x00\x00\x00\x7f\xff\xff\xff\xff\xff\xff\xff");
879 /// ```
880 #[inline]
881 fn write_i64<T: ByteOrder>(&mut self, n: i64) -> Result<()> {
882 let mut buf = [0; 8];
883 T::write_i64(&mut buf, n);
884 self.write_all(&buf)
885 }
886
887 /// Writes an unsigned 128 bit integer to the underlying writer.
888 #[inline]
889 fn write_u128<T: ByteOrder>(&mut self, n: u128) -> Result<()> {
890 let mut buf = [0; 16];
891 T::write_u128(&mut buf, n);
892 self.write_all(&buf)
893 }
894
895 /// Writes a signed 128 bit integer to the underlying writer.
896 #[inline]
897 fn write_i128<T: ByteOrder>(&mut self, n: i128) -> Result<()> {
898 let mut buf = [0; 16];
899 T::write_i128(&mut buf, n);
900 self.write_all(&buf)
901 }
902
903 /// Writes an unsigned n-bytes integer to the underlying writer.
904 ///
905 /// # Errors
906 ///
907 /// This method returns the same errors as [`Write::write_all`].
908 ///
909 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
910 ///
911 /// # Panics
912 ///
913 /// If the given integer is not representable in the given number of bytes,
914 /// this method panics. If `nbytes > 8`, this method panics.
915 ///
916 /// # Examples
917 ///
918 /// Write unsigned 40 bit big-endian integers to a `Write`:
919 ///
920 /// ```rust
921 /// use byteorder_lite::{BigEndian, WriteBytesExt};
922 ///
923 /// let mut wtr = Vec::new();
924 /// wtr.write_uint::<BigEndian>(312550384361, 5).unwrap();
925 /// wtr.write_uint::<BigEndian>(43, 5).unwrap();
926 /// assert_eq!(wtr, b"\x48\xc5\x74\x62\xe9\x00\x00\x00\x00\x2b");
927 /// ```
928 #[inline]
929 fn write_uint<T: ByteOrder>(
930 &mut self,
931 n: u64,
932 nbytes: usize,
933 ) -> Result<()> {
934 let mut buf = [0; 8];
935 T::write_uint(&mut buf, n, nbytes);
936 self.write_all(&buf[0..nbytes])
937 }
938
939 /// Writes a signed n-bytes integer to the underlying writer.
940 ///
941 /// # Errors
942 ///
943 /// This method returns the same errors as [`Write::write_all`].
944 ///
945 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
946 ///
947 /// # Panics
948 ///
949 /// If the given integer is not representable in the given number of bytes,
950 /// this method panics. If `nbytes > 8`, this method panics.
951 ///
952 /// # Examples
953 ///
954 /// Write signed 56 bit big-endian integers to a `Write`:
955 ///
956 /// ```rust
957 /// use byteorder_lite::{BigEndian, WriteBytesExt};
958 ///
959 /// let mut wtr = Vec::new();
960 /// wtr.write_int::<BigEndian>(-3548172039376767, 7).unwrap();
961 /// wtr.write_int::<BigEndian>(43, 7).unwrap();
962 /// assert_eq!(wtr, b"\xf3\x64\xf4\xd1\xfd\xb0\x81\x00\x00\x00\x00\x00\x00\x2b");
963 /// ```
964 #[inline]
965 fn write_int<T: ByteOrder>(
966 &mut self,
967 n: i64,
968 nbytes: usize,
969 ) -> Result<()> {
970 let mut buf = [0; 8];
971 T::write_int(&mut buf, n, nbytes);
972 self.write_all(&buf[0..nbytes])
973 }
974
975 /// Writes an unsigned n-bytes integer to the underlying writer.
976 ///
977 /// If the given integer is not representable in the given number of bytes,
978 /// this method panics. If `nbytes > 16`, this method panics.
979 #[inline]
980 fn write_uint128<T: ByteOrder>(
981 &mut self,
982 n: u128,
983 nbytes: usize,
984 ) -> Result<()> {
985 let mut buf = [0; 16];
986 T::write_uint128(&mut buf, n, nbytes);
987 self.write_all(&buf[0..nbytes])
988 }
989
990 /// Writes a signed n-bytes integer to the underlying writer.
991 ///
992 /// If the given integer is not representable in the given number of bytes,
993 /// this method panics. If `nbytes > 16`, this method panics.
994 #[inline]
995 fn write_int128<T: ByteOrder>(
996 &mut self,
997 n: i128,
998 nbytes: usize,
999 ) -> Result<()> {
1000 let mut buf = [0; 16];
1001 T::write_int128(&mut buf, n, nbytes);
1002 self.write_all(&buf[0..nbytes])
1003 }
1004
1005 /// Writes a IEEE754 single-precision (4 bytes) floating point number to
1006 /// the underlying writer.
1007 ///
1008 /// # Errors
1009 ///
1010 /// This method returns the same errors as [`Write::write_all`].
1011 ///
1012 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
1013 ///
1014 /// # Examples
1015 ///
1016 /// Write a big-endian single-precision floating point number to a `Write`:
1017 ///
1018 /// ```rust
1019 /// use std::f32;
1020 ///
1021 /// use byteorder_lite::{BigEndian, WriteBytesExt};
1022 ///
1023 /// let mut wtr = Vec::new();
1024 /// wtr.write_f32::<BigEndian>(f32::consts::PI).unwrap();
1025 /// assert_eq!(wtr, b"\x40\x49\x0f\xdb");
1026 /// ```
1027 #[inline]
1028 fn write_f32<T: ByteOrder>(&mut self, n: f32) -> Result<()> {
1029 let mut buf = [0; 4];
1030 T::write_f32(&mut buf, n);
1031 self.write_all(&buf)
1032 }
1033
1034 /// Writes a IEEE754 double-precision (8 bytes) floating point number to
1035 /// the underlying writer.
1036 ///
1037 /// # Errors
1038 ///
1039 /// This method returns the same errors as [`Write::write_all`].
1040 ///
1041 /// [`Write::write_all`]: https://doc.rust-lang.org/std/io/trait.Write.html#method.write_all
1042 ///
1043 /// # Examples
1044 ///
1045 /// Write a big-endian double-precision floating point number to a `Write`:
1046 ///
1047 /// ```rust
1048 /// use std::f64;
1049 ///
1050 /// use byteorder_lite::{BigEndian, WriteBytesExt};
1051 ///
1052 /// let mut wtr = Vec::new();
1053 /// wtr.write_f64::<BigEndian>(f64::consts::PI).unwrap();
1054 /// assert_eq!(wtr, b"\x40\x09\x21\xfb\x54\x44\x2d\x18");
1055 /// ```
1056 #[inline]
1057 fn write_f64<T: ByteOrder>(&mut self, n: f64) -> Result<()> {
1058 let mut buf = [0; 8];
1059 T::write_f64(&mut buf, n);
1060 self.write_all(&buf)
1061 }
1062}
1063
1064/// All types that implement `Write` get methods defined in `WriteBytesExt`
1065/// for free.
1066impl<W: io::Write + ?Sized> WriteBytesExt for W {}