byteorder_lite/lib.rs
1/*!
2
3This crate is a fork of the [`byteorder`] crate which sets
4`#![forbid(unsafe_code)]`. It includes all traits and most methods from the
5original crate, but the `ReadBytesExt::read_*_into` family of methods had to be
6removed because they currently cannot be implemented without unsafe code.
7
8The organization of the crate is pretty simple. A trait, [`ByteOrder`], specifies
9byte conversion methods for each type of number in Rust (sans numbers that have
10a platform dependent size like `usize` and `isize`). Two types, [`BigEndian`]
11and [`LittleEndian`] implement these methods. Finally, [`ReadBytesExt`] and
12[`WriteBytesExt`] provide convenience methods available to all types that
13implement [`Read`] and [`Write`].
14
15An alias, [`NetworkEndian`], for [`BigEndian`] is provided to help improve
16code clarity.
17
18An additional alias, [`NativeEndian`], is provided for the endianness of the
19local platform. This is convenient when serializing data for use and
20conversions are not desired.
21
22# Examples
23
24Read unsigned 16 bit big-endian integers from a [`Read`] type:
25
26```rust
27use std::io::Cursor;
28use byteorder_lite::{BigEndian, ReadBytesExt};
29
30let mut rdr = Cursor::new(vec![2, 5, 3, 0]);
31// Note that we use type parameters to indicate which kind of byte order
32// we want!
33assert_eq!(517, rdr.read_u16::<BigEndian>().unwrap());
34assert_eq!(768, rdr.read_u16::<BigEndian>().unwrap());
35```
36
37Write unsigned 16 bit little-endian integers to a [`Write`] type:
38
39```rust
40use byteorder_lite::{LittleEndian, WriteBytesExt};
41
42let mut wtr = vec![];
43wtr.write_u16::<LittleEndian>(517).unwrap();
44wtr.write_u16::<LittleEndian>(768).unwrap();
45assert_eq!(wtr, vec![5, 2, 0, 3]);
46```
47
48# Optional Features
49
50This crate can also be used without the standard library.
51
52# Alternatives
53
54The standard numeric types provide built-in methods like `to_le_bytes` and
55`from_le_bytes`, which support some of the same use cases.
56
57[`byteorder`]: https://crates.io/crates/byteorder
58[`ByteOrder`]: trait.ByteOrder.html
59[`BigEndian`]: enum.BigEndian.html
60[`LittleEndian`]: enum.LittleEndian.html
61[`ReadBytesExt`]: trait.ReadBytesExt.html
62[`WriteBytesExt`]: trait.WriteBytesExt.html
63[`NetworkEndian`]: type.NetworkEndian.html
64[`NativeEndian`]: type.NativeEndian.html
65[`Read`]: https://doc.rust-lang.org/std/io/trait.Read.html
66[`Write`]: https://doc.rust-lang.org/std/io/trait.Write.html
67*/
68
69#![forbid(unsafe_code)]
70#![deny(missing_docs)]
71#![cfg_attr(not(feature = "std"), no_std)]
72// When testing under miri, we disable tests that take too long. But this
73// provokes lots of dead code warnings. So we just squash them.
74#![cfg_attr(miri, allow(dead_code, unused_macros))]
75
76use core::{fmt::Debug, hash::Hash};
77
78#[cfg(feature = "std")]
79pub use crate::io::{ReadBytesExt, WriteBytesExt};
80
81#[cfg(feature = "std")]
82mod io;
83
84#[inline]
85fn extend_sign(val: u64, nbytes: usize) -> i64 {
86 let shift = (8 - nbytes) * 8;
87 (val << shift) as i64 >> shift
88}
89
90#[inline]
91fn extend_sign128(val: u128, nbytes: usize) -> i128 {
92 let shift = (16 - nbytes) * 8;
93 (val << shift) as i128 >> shift
94}
95
96#[inline]
97fn unextend_sign(val: i64, nbytes: usize) -> u64 {
98 let shift = (8 - nbytes) * 8;
99 (val << shift) as u64 >> shift
100}
101
102#[inline]
103fn unextend_sign128(val: i128, nbytes: usize) -> u128 {
104 let shift = (16 - nbytes) * 8;
105 (val << shift) as u128 >> shift
106}
107
108#[inline]
109fn pack_size(n: u64) -> usize {
110 (8 - ((n | 1).leading_zeros() >> 3)) as usize
111}
112
113#[inline]
114fn pack_size128(n: u128) -> usize {
115 (16 - ((n | 1).leading_zeros() >> 3)) as usize
116}
117
118mod private {
119 /// Sealed stops crates other than byteorder from implementing any traits
120 /// that use it.
121 pub trait Sealed {}
122 impl Sealed for super::LittleEndian {}
123 impl Sealed for super::BigEndian {}
124}
125
126/// `ByteOrder` describes types that can serialize integers as bytes.
127///
128/// Note that `Self` does not appear anywhere in this trait's definition!
129/// Therefore, in order to use it, you'll need to use syntax like
130/// `T::read_u16(&[0, 1])` where `T` implements `ByteOrder`.
131///
132/// This crate provides two types that implement `ByteOrder`: [`BigEndian`]
133/// and [`LittleEndian`].
134/// This trait is sealed and cannot be implemented for callers to avoid
135/// breaking backwards compatibility when adding new derived traits.
136///
137/// # Examples
138///
139/// Write and read `u32` numbers in little endian order:
140///
141/// ```rust
142/// use byteorder_lite::{ByteOrder, LittleEndian};
143///
144/// let mut buf = [0; 4];
145/// LittleEndian::write_u32(&mut buf, 1_000_000);
146/// assert_eq!(1_000_000, LittleEndian::read_u32(&buf));
147/// ```
148///
149/// Write and read `i16` numbers in big endian order:
150///
151/// ```rust
152/// use byteorder_lite::{ByteOrder, BigEndian};
153///
154/// let mut buf = [0; 2];
155/// BigEndian::write_i16(&mut buf, -5_000);
156/// assert_eq!(-5_000, BigEndian::read_i16(&buf));
157/// ```
158///
159/// [`BigEndian`]: enum.BigEndian.html
160/// [`LittleEndian`]: enum.LittleEndian.html
161pub trait ByteOrder:
162 Clone
163 + Copy
164 + Debug
165 + Default
166 + Eq
167 + Hash
168 + Ord
169 + PartialEq
170 + PartialOrd
171 + private::Sealed
172{
173 /// Reads an unsigned 16 bit integer from `buf`.
174 ///
175 /// # Panics
176 ///
177 /// Panics when `buf.len() < 2`.
178 fn read_u16(buf: &[u8]) -> u16;
179
180 /// Reads an unsigned 24 bit integer from `buf`, stored in u32.
181 ///
182 /// # Panics
183 ///
184 /// Panics when `buf.len() < 3`.
185 ///
186 /// # Examples
187 ///
188 /// Write and read 24 bit `u32` numbers in little endian order:
189 ///
190 /// ```rust
191 /// use byteorder_lite::{ByteOrder, LittleEndian};
192 ///
193 /// let mut buf = [0; 3];
194 /// LittleEndian::write_u24(&mut buf, 1_000_000);
195 /// assert_eq!(1_000_000, LittleEndian::read_u24(&buf));
196 /// ```
197 fn read_u24(buf: &[u8]) -> u32 {
198 Self::read_uint(buf, 3) as u32
199 }
200
201 /// Reads an unsigned 32 bit integer from `buf`.
202 ///
203 /// # Panics
204 ///
205 /// Panics when `buf.len() < 4`.
206 ///
207 /// # Examples
208 ///
209 /// Write and read `u32` numbers in little endian order:
210 ///
211 /// ```rust
212 /// use byteorder_lite::{ByteOrder, LittleEndian};
213 ///
214 /// let mut buf = [0; 4];
215 /// LittleEndian::write_u32(&mut buf, 1_000_000);
216 /// assert_eq!(1_000_000, LittleEndian::read_u32(&buf));
217 /// ```
218 fn read_u32(buf: &[u8]) -> u32;
219
220 /// Reads an unsigned 48 bit integer from `buf`, stored in u64.
221 ///
222 /// # Panics
223 ///
224 /// Panics when `buf.len() < 6`.
225 ///
226 /// # Examples
227 ///
228 /// Write and read 48 bit `u64` numbers in little endian order:
229 ///
230 /// ```rust
231 /// use byteorder_lite::{ByteOrder, LittleEndian};
232 ///
233 /// let mut buf = [0; 6];
234 /// LittleEndian::write_u48(&mut buf, 1_000_000_000_000);
235 /// assert_eq!(1_000_000_000_000, LittleEndian::read_u48(&buf));
236 /// ```
237 fn read_u48(buf: &[u8]) -> u64 {
238 Self::read_uint(buf, 6) as u64
239 }
240
241 /// Reads an unsigned 64 bit integer from `buf`.
242 ///
243 /// # Panics
244 ///
245 /// Panics when `buf.len() < 8`.
246 ///
247 /// # Examples
248 ///
249 /// Write and read `u64` numbers in little endian order:
250 ///
251 /// ```rust
252 /// use byteorder_lite::{ByteOrder, LittleEndian};
253 ///
254 /// let mut buf = [0; 8];
255 /// LittleEndian::write_u64(&mut buf, 1_000_000);
256 /// assert_eq!(1_000_000, LittleEndian::read_u64(&buf));
257 /// ```
258 fn read_u64(buf: &[u8]) -> u64;
259
260 /// Reads an unsigned 128 bit integer from `buf`.
261 ///
262 /// # Panics
263 ///
264 /// Panics when `buf.len() < 16`.
265 ///
266 /// # Examples
267 ///
268 /// Write and read `u128` numbers in little endian order:
269 ///
270 /// ```rust
271 /// use byteorder_lite::{ByteOrder, LittleEndian};
272 ///
273 /// let mut buf = [0; 16];
274 /// LittleEndian::write_u128(&mut buf, 1_000_000);
275 /// assert_eq!(1_000_000, LittleEndian::read_u128(&buf));
276 /// ```
277 fn read_u128(buf: &[u8]) -> u128;
278
279 /// Reads an unsigned n-bytes integer from `buf`.
280 ///
281 /// # Panics
282 ///
283 /// Panics when `nbytes < 1` or `nbytes > 8` or
284 /// `buf.len() < nbytes`
285 ///
286 /// # Examples
287 ///
288 /// Write and read an n-byte number in little endian order:
289 ///
290 /// ```rust
291 /// use byteorder_lite::{ByteOrder, LittleEndian};
292 ///
293 /// let mut buf = [0; 3];
294 /// LittleEndian::write_uint(&mut buf, 1_000_000, 3);
295 /// assert_eq!(1_000_000, LittleEndian::read_uint(&buf, 3));
296 /// ```
297 fn read_uint(buf: &[u8], nbytes: usize) -> u64;
298
299 /// Reads an unsigned n-bytes integer from `buf`.
300 ///
301 /// # Panics
302 ///
303 /// Panics when `nbytes < 1` or `nbytes > 16` or
304 /// `buf.len() < nbytes`
305 ///
306 /// # Examples
307 ///
308 /// Write and read an n-byte number in little endian order:
309 ///
310 /// ```rust
311 /// use byteorder_lite::{ByteOrder, LittleEndian};
312 ///
313 /// let mut buf = [0; 3];
314 /// LittleEndian::write_uint128(&mut buf, 1_000_000, 3);
315 /// assert_eq!(1_000_000, LittleEndian::read_uint128(&buf, 3));
316 /// ```
317 fn read_uint128(buf: &[u8], nbytes: usize) -> u128;
318
319 /// Writes an unsigned 16 bit integer `n` to `buf`.
320 ///
321 /// # Panics
322 ///
323 /// Panics when `buf.len() < 2`.
324 ///
325 /// # Examples
326 ///
327 /// Write and read `u16` numbers in little endian order:
328 ///
329 /// ```rust
330 /// use byteorder_lite::{ByteOrder, LittleEndian};
331 ///
332 /// let mut buf = [0; 2];
333 /// LittleEndian::write_u16(&mut buf, 1_000);
334 /// assert_eq!(1_000, LittleEndian::read_u16(&buf));
335 /// ```
336 fn write_u16(buf: &mut [u8], n: u16);
337
338 /// Writes an unsigned 24 bit integer `n` to `buf`, stored in u32.
339 ///
340 /// # Panics
341 ///
342 /// Panics when `buf.len() < 3`.
343 ///
344 /// # Examples
345 ///
346 /// Write and read 24 bit `u32` numbers in little endian order:
347 ///
348 /// ```rust
349 /// use byteorder_lite::{ByteOrder, LittleEndian};
350 ///
351 /// let mut buf = [0; 3];
352 /// LittleEndian::write_u24(&mut buf, 1_000_000);
353 /// assert_eq!(1_000_000, LittleEndian::read_u24(&buf));
354 /// ```
355 fn write_u24(buf: &mut [u8], n: u32) {
356 Self::write_uint(buf, n as u64, 3)
357 }
358
359 /// Writes an unsigned 32 bit integer `n` to `buf`.
360 ///
361 /// # Panics
362 ///
363 /// Panics when `buf.len() < 4`.
364 ///
365 /// # Examples
366 ///
367 /// Write and read `u32` numbers in little endian order:
368 ///
369 /// ```rust
370 /// use byteorder_lite::{ByteOrder, LittleEndian};
371 ///
372 /// let mut buf = [0; 4];
373 /// LittleEndian::write_u32(&mut buf, 1_000_000);
374 /// assert_eq!(1_000_000, LittleEndian::read_u32(&buf));
375 /// ```
376 fn write_u32(buf: &mut [u8], n: u32);
377
378 /// Writes an unsigned 48 bit integer `n` to `buf`, stored in u64.
379 ///
380 /// # Panics
381 ///
382 /// Panics when `buf.len() < 6`.
383 ///
384 /// # Examples
385 ///
386 /// Write and read 48 bit `u64` numbers in little endian order:
387 ///
388 /// ```rust
389 /// use byteorder_lite::{ByteOrder, LittleEndian};
390 ///
391 /// let mut buf = [0; 6];
392 /// LittleEndian::write_u48(&mut buf, 1_000_000_000_000);
393 /// assert_eq!(1_000_000_000_000, LittleEndian::read_u48(&buf));
394 /// ```
395 fn write_u48(buf: &mut [u8], n: u64) {
396 Self::write_uint(buf, n as u64, 6)
397 }
398
399 /// Writes an unsigned 64 bit integer `n` to `buf`.
400 ///
401 /// # Panics
402 ///
403 /// Panics when `buf.len() < 8`.
404 ///
405 /// # Examples
406 ///
407 /// Write and read `u64` numbers in little endian order:
408 ///
409 /// ```rust
410 /// use byteorder_lite::{ByteOrder, LittleEndian};
411 ///
412 /// let mut buf = [0; 8];
413 /// LittleEndian::write_u64(&mut buf, 1_000_000);
414 /// assert_eq!(1_000_000, LittleEndian::read_u64(&buf));
415 /// ```
416 fn write_u64(buf: &mut [u8], n: u64);
417
418 /// Writes an unsigned 128 bit integer `n` to `buf`.
419 ///
420 /// # Panics
421 ///
422 /// Panics when `buf.len() < 16`.
423 ///
424 /// # Examples
425 ///
426 /// Write and read `u128` numbers in little endian order:
427 ///
428 /// ```rust
429 /// use byteorder_lite::{ByteOrder, LittleEndian};
430 ///
431 /// let mut buf = [0; 16];
432 /// LittleEndian::write_u128(&mut buf, 1_000_000);
433 /// assert_eq!(1_000_000, LittleEndian::read_u128(&buf));
434 /// ```
435 fn write_u128(buf: &mut [u8], n: u128);
436
437 /// Writes an unsigned integer `n` to `buf` using only `nbytes`.
438 ///
439 /// # Panics
440 ///
441 /// If `n` is not representable in `nbytes`, or if `nbytes` is `> 8`, then
442 /// this method panics.
443 ///
444 /// # Examples
445 ///
446 /// Write and read an n-byte number in little endian order:
447 ///
448 /// ```rust
449 /// use byteorder_lite::{ByteOrder, LittleEndian};
450 ///
451 /// let mut buf = [0; 3];
452 /// LittleEndian::write_uint(&mut buf, 1_000_000, 3);
453 /// assert_eq!(1_000_000, LittleEndian::read_uint(&buf, 3));
454 /// ```
455 fn write_uint(buf: &mut [u8], n: u64, nbytes: usize);
456
457 /// Writes an unsigned integer `n` to `buf` using only `nbytes`.
458 ///
459 /// # Panics
460 ///
461 /// If `n` is not representable in `nbytes`, or if `nbytes` is `> 16`, then
462 /// this method panics.
463 ///
464 /// # Examples
465 ///
466 /// Write and read an n-byte number in little endian order:
467 ///
468 /// ```rust
469 /// use byteorder_lite::{ByteOrder, LittleEndian};
470 ///
471 /// let mut buf = [0; 3];
472 /// LittleEndian::write_uint128(&mut buf, 1_000_000, 3);
473 /// assert_eq!(1_000_000, LittleEndian::read_uint128(&buf, 3));
474 /// ```
475 fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize);
476
477 /// Reads a signed 16 bit integer from `buf`.
478 ///
479 /// # Panics
480 ///
481 /// Panics when `buf.len() < 2`.
482 ///
483 /// # Examples
484 ///
485 /// Write and read `i16` numbers in little endian order:
486 ///
487 /// ```rust
488 /// use byteorder_lite::{ByteOrder, LittleEndian};
489 ///
490 /// let mut buf = [0; 2];
491 /// LittleEndian::write_i16(&mut buf, -1_000);
492 /// assert_eq!(-1_000, LittleEndian::read_i16(&buf));
493 /// ```
494 #[inline]
495 fn read_i16(buf: &[u8]) -> i16 {
496 Self::read_u16(buf) as i16
497 }
498
499 /// Reads a signed 24 bit integer from `buf`, stored in i32.
500 ///
501 /// # Panics
502 ///
503 /// Panics when `buf.len() < 3`.
504 ///
505 /// # Examples
506 ///
507 /// Write and read 24 bit `i32` numbers in little endian order:
508 ///
509 /// ```rust
510 /// use byteorder_lite::{ByteOrder, LittleEndian};
511 ///
512 /// let mut buf = [0; 3];
513 /// LittleEndian::write_i24(&mut buf, -1_000_000);
514 /// assert_eq!(-1_000_000, LittleEndian::read_i24(&buf));
515 /// ```
516 #[inline]
517 fn read_i24(buf: &[u8]) -> i32 {
518 Self::read_int(buf, 3) as i32
519 }
520
521 /// Reads a signed 32 bit integer from `buf`.
522 ///
523 /// # Panics
524 ///
525 /// Panics when `buf.len() < 4`.
526 ///
527 /// # Examples
528 ///
529 /// Write and read `i32` numbers in little endian order:
530 ///
531 /// ```rust
532 /// use byteorder_lite::{ByteOrder, LittleEndian};
533 ///
534 /// let mut buf = [0; 4];
535 /// LittleEndian::write_i32(&mut buf, -1_000_000);
536 /// assert_eq!(-1_000_000, LittleEndian::read_i32(&buf));
537 /// ```
538 #[inline]
539 fn read_i32(buf: &[u8]) -> i32 {
540 Self::read_u32(buf) as i32
541 }
542
543 /// Reads a signed 48 bit integer from `buf`, stored in i64.
544 ///
545 /// # Panics
546 ///
547 /// Panics when `buf.len() < 6`.
548 ///
549 /// # Examples
550 ///
551 /// Write and read 48 bit `i64` numbers in little endian order:
552 ///
553 /// ```rust
554 /// use byteorder_lite::{ByteOrder, LittleEndian};
555 ///
556 /// let mut buf = [0; 6];
557 /// LittleEndian::write_i48(&mut buf, -1_000_000_000_000);
558 /// assert_eq!(-1_000_000_000_000, LittleEndian::read_i48(&buf));
559 /// ```
560 #[inline]
561 fn read_i48(buf: &[u8]) -> i64 {
562 Self::read_int(buf, 6) as i64
563 }
564
565 /// Reads a signed 64 bit integer from `buf`.
566 ///
567 /// # Panics
568 ///
569 /// Panics when `buf.len() < 8`.
570 ///
571 /// # Examples
572 ///
573 /// Write and read `i64` numbers in little endian order:
574 ///
575 /// ```rust
576 /// use byteorder_lite::{ByteOrder, LittleEndian};
577 ///
578 /// let mut buf = [0; 8];
579 /// LittleEndian::write_i64(&mut buf, -1_000_000_000);
580 /// assert_eq!(-1_000_000_000, LittleEndian::read_i64(&buf));
581 /// ```
582 #[inline]
583 fn read_i64(buf: &[u8]) -> i64 {
584 Self::read_u64(buf) as i64
585 }
586
587 /// Reads a signed 128 bit integer from `buf`.
588 ///
589 /// # Panics
590 ///
591 /// Panics when `buf.len() < 16`.
592 ///
593 /// # Examples
594 ///
595 /// Write and read `i128` numbers in little endian order:
596 ///
597 /// ```rust
598 /// use byteorder_lite::{ByteOrder, LittleEndian};
599 ///
600 /// let mut buf = [0; 16];
601 /// LittleEndian::write_i128(&mut buf, -1_000_000_000);
602 /// assert_eq!(-1_000_000_000, LittleEndian::read_i128(&buf));
603 /// ```
604 #[inline]
605 fn read_i128(buf: &[u8]) -> i128 {
606 Self::read_u128(buf) as i128
607 }
608
609 /// Reads a signed n-bytes integer from `buf`.
610 ///
611 /// # Panics
612 ///
613 /// Panics when `nbytes < 1` or `nbytes > 8` or
614 /// `buf.len() < nbytes`
615 ///
616 /// # Examples
617 ///
618 /// Write and read n-length signed numbers in little endian order:
619 ///
620 /// ```rust
621 /// use byteorder_lite::{ByteOrder, LittleEndian};
622 ///
623 /// let mut buf = [0; 3];
624 /// LittleEndian::write_int(&mut buf, -1_000, 3);
625 /// assert_eq!(-1_000, LittleEndian::read_int(&buf, 3));
626 /// ```
627 #[inline]
628 fn read_int(buf: &[u8], nbytes: usize) -> i64 {
629 extend_sign(Self::read_uint(buf, nbytes), nbytes)
630 }
631
632 /// Reads a signed n-bytes integer from `buf`.
633 ///
634 /// # Panics
635 ///
636 /// Panics when `nbytes < 1` or `nbytes > 16` or
637 /// `buf.len() < nbytes`
638 ///
639 /// # Examples
640 ///
641 /// Write and read n-length signed numbers in little endian order:
642 ///
643 /// ```rust
644 /// use byteorder_lite::{ByteOrder, LittleEndian};
645 ///
646 /// let mut buf = [0; 3];
647 /// LittleEndian::write_int128(&mut buf, -1_000, 3);
648 /// assert_eq!(-1_000, LittleEndian::read_int128(&buf, 3));
649 /// ```
650 #[inline]
651 fn read_int128(buf: &[u8], nbytes: usize) -> i128 {
652 extend_sign128(Self::read_uint128(buf, nbytes), nbytes)
653 }
654
655 /// Reads a IEEE754 single-precision (4 bytes) floating point number.
656 ///
657 /// # Panics
658 ///
659 /// Panics when `buf.len() < 4`.
660 ///
661 /// # Examples
662 ///
663 /// Write and read `f32` numbers in little endian order:
664 ///
665 /// ```rust
666 /// use byteorder_lite::{ByteOrder, LittleEndian};
667 ///
668 /// let e = 2.71828;
669 /// let mut buf = [0; 4];
670 /// LittleEndian::write_f32(&mut buf, e);
671 /// assert_eq!(e, LittleEndian::read_f32(&buf));
672 /// ```
673 #[inline]
674 fn read_f32(buf: &[u8]) -> f32 {
675 f32::from_bits(Self::read_u32(buf))
676 }
677
678 /// Reads a IEEE754 double-precision (8 bytes) floating point number.
679 ///
680 /// # Panics
681 ///
682 /// Panics when `buf.len() < 8`.
683 ///
684 /// # Examples
685 ///
686 /// Write and read `f64` numbers in little endian order:
687 ///
688 /// ```rust
689 /// use byteorder_lite::{ByteOrder, LittleEndian};
690 ///
691 /// let phi = 1.6180339887;
692 /// let mut buf = [0; 8];
693 /// LittleEndian::write_f64(&mut buf, phi);
694 /// assert_eq!(phi, LittleEndian::read_f64(&buf));
695 /// ```
696 #[inline]
697 fn read_f64(buf: &[u8]) -> f64 {
698 f64::from_bits(Self::read_u64(buf))
699 }
700
701 /// Writes a signed 16 bit integer `n` to `buf`.
702 ///
703 /// # Panics
704 ///
705 /// Panics when `buf.len() < 2`.
706 ///
707 /// # Examples
708 ///
709 /// Write and read `i16` numbers in little endian order:
710 ///
711 /// ```rust
712 /// use byteorder_lite::{ByteOrder, LittleEndian};
713 ///
714 /// let mut buf = [0; 2];
715 /// LittleEndian::write_i16(&mut buf, -1_000);
716 /// assert_eq!(-1_000, LittleEndian::read_i16(&buf));
717 /// ```
718 #[inline]
719 fn write_i16(buf: &mut [u8], n: i16) {
720 Self::write_u16(buf, n as u16)
721 }
722
723 /// Writes a signed 24 bit integer `n` to `buf`, stored in i32.
724 ///
725 /// # Panics
726 ///
727 /// Panics when `buf.len() < 3`.
728 ///
729 /// # Examples
730 ///
731 /// Write and read 24 bit `i32` numbers in little endian order:
732 ///
733 /// ```rust
734 /// use byteorder_lite::{ByteOrder, LittleEndian};
735 ///
736 /// let mut buf = [0; 3];
737 /// LittleEndian::write_i24(&mut buf, -1_000_000);
738 /// assert_eq!(-1_000_000, LittleEndian::read_i24(&buf));
739 /// ```
740 #[inline]
741 fn write_i24(buf: &mut [u8], n: i32) {
742 Self::write_int(buf, n as i64, 3)
743 }
744
745 /// Writes a signed 32 bit integer `n` to `buf`.
746 ///
747 /// # Panics
748 ///
749 /// Panics when `buf.len() < 4`.
750 ///
751 /// # Examples
752 ///
753 /// Write and read `i32` numbers in little endian order:
754 ///
755 /// ```rust
756 /// use byteorder_lite::{ByteOrder, LittleEndian};
757 ///
758 /// let mut buf = [0; 4];
759 /// LittleEndian::write_i32(&mut buf, -1_000_000);
760 /// assert_eq!(-1_000_000, LittleEndian::read_i32(&buf));
761 /// ```
762 #[inline]
763 fn write_i32(buf: &mut [u8], n: i32) {
764 Self::write_u32(buf, n as u32)
765 }
766
767 /// Writes a signed 48 bit integer `n` to `buf`, stored in i64.
768 ///
769 /// # Panics
770 ///
771 /// Panics when `buf.len() < 6`.
772 ///
773 /// # Examples
774 ///
775 /// Write and read 48 bit `i64` numbers in little endian order:
776 ///
777 /// ```rust
778 /// use byteorder_lite::{ByteOrder, LittleEndian};
779 ///
780 /// let mut buf = [0; 6];
781 /// LittleEndian::write_i48(&mut buf, -1_000_000_000_000);
782 /// assert_eq!(-1_000_000_000_000, LittleEndian::read_i48(&buf));
783 /// ```
784 #[inline]
785 fn write_i48(buf: &mut [u8], n: i64) {
786 Self::write_int(buf, n as i64, 6)
787 }
788
789 /// Writes a signed 64 bit integer `n` to `buf`.
790 ///
791 /// # Panics
792 ///
793 /// Panics when `buf.len() < 8`.
794 ///
795 /// # Examples
796 ///
797 /// Write and read `i64` numbers in little endian order:
798 ///
799 /// ```rust
800 /// use byteorder_lite::{ByteOrder, LittleEndian};
801 ///
802 /// let mut buf = [0; 8];
803 /// LittleEndian::write_i64(&mut buf, -1_000_000_000);
804 /// assert_eq!(-1_000_000_000, LittleEndian::read_i64(&buf));
805 /// ```
806 #[inline]
807 fn write_i64(buf: &mut [u8], n: i64) {
808 Self::write_u64(buf, n as u64)
809 }
810
811 /// Writes a signed 128 bit integer `n` to `buf`.
812 ///
813 /// # Panics
814 ///
815 /// Panics when `buf.len() < 16`.
816 ///
817 /// # Examples
818 ///
819 /// Write and read n-byte `i128` numbers in little endian order:
820 ///
821 /// ```rust
822 /// use byteorder_lite::{ByteOrder, LittleEndian};
823 ///
824 /// let mut buf = [0; 16];
825 /// LittleEndian::write_i128(&mut buf, -1_000_000_000);
826 /// assert_eq!(-1_000_000_000, LittleEndian::read_i128(&buf));
827 /// ```
828 #[inline]
829 fn write_i128(buf: &mut [u8], n: i128) {
830 Self::write_u128(buf, n as u128)
831 }
832
833 /// Writes a signed integer `n` to `buf` using only `nbytes`.
834 ///
835 /// # Panics
836 ///
837 /// If `n` is not representable in `nbytes`, or if `nbytes` is `> 8`, then
838 /// this method panics.
839 ///
840 /// # Examples
841 ///
842 /// Write and read an n-byte number in little endian order:
843 ///
844 /// ```rust
845 /// use byteorder_lite::{ByteOrder, LittleEndian};
846 ///
847 /// let mut buf = [0; 3];
848 /// LittleEndian::write_int(&mut buf, -1_000, 3);
849 /// assert_eq!(-1_000, LittleEndian::read_int(&buf, 3));
850 /// ```
851 #[inline]
852 fn write_int(buf: &mut [u8], n: i64, nbytes: usize) {
853 Self::write_uint(buf, unextend_sign(n, nbytes), nbytes)
854 }
855
856 /// Writes a signed integer `n` to `buf` using only `nbytes`.
857 ///
858 /// # Panics
859 ///
860 /// If `n` is not representable in `nbytes`, or if `nbytes` is `> 16`, then
861 /// this method panics.
862 ///
863 /// # Examples
864 ///
865 /// Write and read n-length signed numbers in little endian order:
866 ///
867 /// ```rust
868 /// use byteorder_lite::{ByteOrder, LittleEndian};
869 ///
870 /// let mut buf = [0; 3];
871 /// LittleEndian::write_int128(&mut buf, -1_000, 3);
872 /// assert_eq!(-1_000, LittleEndian::read_int128(&buf, 3));
873 /// ```
874 #[inline]
875 fn write_int128(buf: &mut [u8], n: i128, nbytes: usize) {
876 Self::write_uint128(buf, unextend_sign128(n, nbytes), nbytes)
877 }
878
879 /// Writes a IEEE754 single-precision (4 bytes) floating point number.
880 ///
881 /// # Panics
882 ///
883 /// Panics when `buf.len() < 4`.
884 ///
885 /// # Examples
886 ///
887 /// Write and read `f32` numbers in little endian order:
888 ///
889 /// ```rust
890 /// use byteorder_lite::{ByteOrder, LittleEndian};
891 ///
892 /// let e = 2.71828;
893 /// let mut buf = [0; 4];
894 /// LittleEndian::write_f32(&mut buf, e);
895 /// assert_eq!(e, LittleEndian::read_f32(&buf));
896 /// ```
897 #[inline]
898 fn write_f32(buf: &mut [u8], n: f32) {
899 Self::write_u32(buf, n.to_bits())
900 }
901
902 /// Writes a IEEE754 double-precision (8 bytes) floating point number.
903 ///
904 /// # Panics
905 ///
906 /// Panics when `buf.len() < 8`.
907 ///
908 /// # Examples
909 ///
910 /// Write and read `f64` numbers in little endian order:
911 ///
912 /// ```rust
913 /// use byteorder_lite::{ByteOrder, LittleEndian};
914 ///
915 /// let phi = 1.6180339887;
916 /// let mut buf = [0; 8];
917 /// LittleEndian::write_f64(&mut buf, phi);
918 /// assert_eq!(phi, LittleEndian::read_f64(&buf));
919 /// ```
920 #[inline]
921 fn write_f64(buf: &mut [u8], n: f64) {
922 Self::write_u64(buf, n.to_bits())
923 }
924
925 /// Reads unsigned 16 bit integers from `src` into `dst`.
926 ///
927 /// # Panics
928 ///
929 /// Panics when `src.len() != 2*dst.len()`.
930 ///
931 /// # Examples
932 ///
933 /// Write and read `u16` numbers in little endian order:
934 ///
935 /// ```rust
936 /// use byteorder_lite::{ByteOrder, LittleEndian};
937 ///
938 /// let mut bytes = [0; 8];
939 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
940 /// LittleEndian::write_u16_into(&numbers_given, &mut bytes);
941 ///
942 /// let mut numbers_got = [0; 4];
943 /// LittleEndian::read_u16_into(&bytes, &mut numbers_got);
944 /// assert_eq!(numbers_given, numbers_got);
945 /// ```
946 fn read_u16_into(src: &[u8], dst: &mut [u16]);
947
948 /// Reads unsigned 32 bit integers from `src` into `dst`.
949 ///
950 /// # Panics
951 ///
952 /// Panics when `src.len() != 4*dst.len()`.
953 ///
954 /// # Examples
955 ///
956 /// Write and read `u32` numbers in little endian order:
957 ///
958 /// ```rust
959 /// use byteorder_lite::{ByteOrder, LittleEndian};
960 ///
961 /// let mut bytes = [0; 16];
962 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
963 /// LittleEndian::write_u32_into(&numbers_given, &mut bytes);
964 ///
965 /// let mut numbers_got = [0; 4];
966 /// LittleEndian::read_u32_into(&bytes, &mut numbers_got);
967 /// assert_eq!(numbers_given, numbers_got);
968 /// ```
969 fn read_u32_into(src: &[u8], dst: &mut [u32]);
970
971 /// Reads unsigned 64 bit integers from `src` into `dst`.
972 ///
973 /// # Panics
974 ///
975 /// Panics when `src.len() != 8*dst.len()`.
976 ///
977 /// # Examples
978 ///
979 /// Write and read `u64` numbers in little endian order:
980 ///
981 /// ```rust
982 /// use byteorder_lite::{ByteOrder, LittleEndian};
983 ///
984 /// let mut bytes = [0; 32];
985 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
986 /// LittleEndian::write_u64_into(&numbers_given, &mut bytes);
987 ///
988 /// let mut numbers_got = [0; 4];
989 /// LittleEndian::read_u64_into(&bytes, &mut numbers_got);
990 /// assert_eq!(numbers_given, numbers_got);
991 /// ```
992 fn read_u64_into(src: &[u8], dst: &mut [u64]);
993
994 /// Reads unsigned 128 bit integers from `src` into `dst`.
995 ///
996 /// # Panics
997 ///
998 /// Panics when `src.len() != 16*dst.len()`.
999 ///
1000 /// # Examples
1001 ///
1002 /// Write and read `u128` numbers in little endian order:
1003 ///
1004 /// ```rust
1005 /// use byteorder_lite::{ByteOrder, LittleEndian};
1006 ///
1007 /// let mut bytes = [0; 64];
1008 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
1009 /// LittleEndian::write_u128_into(&numbers_given, &mut bytes);
1010 ///
1011 /// let mut numbers_got = [0; 4];
1012 /// LittleEndian::read_u128_into(&bytes, &mut numbers_got);
1013 /// assert_eq!(numbers_given, numbers_got);
1014 /// ```
1015 fn read_u128_into(src: &[u8], dst: &mut [u128]);
1016
1017 /// Reads signed 16 bit integers from `src` to `dst`.
1018 ///
1019 /// # Panics
1020 ///
1021 /// Panics when `buf.len() != 2*dst.len()`.
1022 ///
1023 /// # Examples
1024 ///
1025 /// Write and read `i16` numbers in little endian order:
1026 ///
1027 /// ```rust
1028 /// use byteorder_lite::{ByteOrder, LittleEndian};
1029 ///
1030 /// let mut bytes = [0; 8];
1031 /// let numbers_given = [1, 2, 0x0f, 0xee];
1032 /// LittleEndian::write_i16_into(&numbers_given, &mut bytes);
1033 ///
1034 /// let mut numbers_got = [0; 4];
1035 /// LittleEndian::read_i16_into(&bytes, &mut numbers_got);
1036 /// assert_eq!(numbers_given, numbers_got);
1037 /// ```
1038 fn read_i16_into(src: &[u8], dst: &mut [i16]);
1039
1040 /// Reads signed 32 bit integers from `src` into `dst`.
1041 ///
1042 /// # Panics
1043 ///
1044 /// Panics when `src.len() != 4*dst.len()`.
1045 ///
1046 /// # Examples
1047 ///
1048 /// Write and read `i32` numbers in little endian order:
1049 ///
1050 /// ```rust
1051 /// use byteorder_lite::{ByteOrder, LittleEndian};
1052 ///
1053 /// let mut bytes = [0; 16];
1054 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
1055 /// LittleEndian::write_i32_into(&numbers_given, &mut bytes);
1056 ///
1057 /// let mut numbers_got = [0; 4];
1058 /// LittleEndian::read_i32_into(&bytes, &mut numbers_got);
1059 /// assert_eq!(numbers_given, numbers_got);
1060 /// ```
1061 fn read_i32_into(src: &[u8], dst: &mut [i32]);
1062
1063 /// Reads signed 64 bit integers from `src` into `dst`.
1064 ///
1065 /// # Panics
1066 ///
1067 /// Panics when `src.len() != 8*dst.len()`.
1068 ///
1069 /// # Examples
1070 ///
1071 /// Write and read `i64` numbers in little endian order:
1072 ///
1073 /// ```rust
1074 /// use byteorder_lite::{ByteOrder, LittleEndian};
1075 ///
1076 /// let mut bytes = [0; 32];
1077 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
1078 /// LittleEndian::write_i64_into(&numbers_given, &mut bytes);
1079 ///
1080 /// let mut numbers_got = [0; 4];
1081 /// LittleEndian::read_i64_into(&bytes, &mut numbers_got);
1082 /// assert_eq!(numbers_given, numbers_got);
1083 /// ```
1084 fn read_i64_into(src: &[u8], dst: &mut [i64]);
1085
1086 /// Reads signed 128 bit integers from `src` into `dst`.
1087 ///
1088 /// # Panics
1089 ///
1090 /// Panics when `src.len() != 16*dst.len()`.
1091 ///
1092 /// # Examples
1093 ///
1094 /// Write and read `i128` numbers in little endian order:
1095 ///
1096 /// ```rust
1097 /// use byteorder_lite::{ByteOrder, LittleEndian};
1098 ///
1099 /// let mut bytes = [0; 64];
1100 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
1101 /// LittleEndian::write_i128_into(&numbers_given, &mut bytes);
1102 ///
1103 /// let mut numbers_got = [0; 4];
1104 /// LittleEndian::read_i128_into(&bytes, &mut numbers_got);
1105 /// assert_eq!(numbers_given, numbers_got);
1106 /// ```
1107 fn read_i128_into(src: &[u8], dst: &mut [i128]);
1108
1109 /// Reads IEEE754 single-precision (4 bytes) floating point numbers from
1110 /// `src` into `dst`.
1111 ///
1112 /// # Panics
1113 ///
1114 /// Panics when `src.len() != 4*dst.len()`.
1115 ///
1116 /// # Examples
1117 ///
1118 /// Write and read `f32` numbers in little endian order:
1119 ///
1120 /// ```rust
1121 /// use byteorder_lite::{ByteOrder, LittleEndian};
1122 ///
1123 /// let mut bytes = [0; 16];
1124 /// let numbers_given = [1.0, 2.0, 31.312e31, -11.32e19];
1125 /// LittleEndian::write_f32_into(&numbers_given, &mut bytes);
1126 ///
1127 /// let mut numbers_got = [0.0; 4];
1128 /// LittleEndian::read_f32_into(&bytes, &mut numbers_got);
1129 /// assert_eq!(numbers_given, numbers_got);
1130 /// ```
1131 fn read_f32_into(src: &[u8], dst: &mut [f32]);
1132
1133 /// **DEPRECATED**.
1134 ///
1135 /// This method is deprecated. Use `read_f32_into` instead.
1136 /// Reads IEEE754 single-precision (4 bytes) floating point numbers from
1137 /// `src` into `dst`.
1138 ///
1139 /// # Panics
1140 ///
1141 /// Panics when `src.len() != 4*dst.len()`.
1142 ///
1143 /// # Examples
1144 ///
1145 /// Write and read `f32` numbers in little endian order:
1146 ///
1147 /// ```rust
1148 /// use byteorder_lite::{ByteOrder, LittleEndian};
1149 ///
1150 /// let mut bytes = [0; 16];
1151 /// let numbers_given = [1.0, 2.0, 31.312e31, -11.32e19];
1152 /// LittleEndian::write_f32_into(&numbers_given, &mut bytes);
1153 ///
1154 /// let mut numbers_got = [0.0; 4];
1155 /// LittleEndian::read_f32_into_unchecked(&bytes, &mut numbers_got);
1156 /// assert_eq!(numbers_given, numbers_got);
1157 /// ```
1158 #[inline]
1159 #[deprecated(since = "1.3.0", note = "please use `read_f32_into` instead")]
1160 fn read_f32_into_unchecked(src: &[u8], dst: &mut [f32]) {
1161 Self::read_f32_into(src, dst);
1162 }
1163
1164 /// Reads IEEE754 single-precision (4 bytes) floating point numbers from
1165 /// `src` into `dst`.
1166 ///
1167 /// # Panics
1168 ///
1169 /// Panics when `src.len() != 8*dst.len()`.
1170 ///
1171 /// # Examples
1172 ///
1173 /// Write and read `f64` numbers in little endian order:
1174 ///
1175 /// ```rust
1176 /// use byteorder_lite::{ByteOrder, LittleEndian};
1177 ///
1178 /// let mut bytes = [0; 32];
1179 /// let numbers_given = [1.0, 2.0, 31.312e211, -11.32e91];
1180 /// LittleEndian::write_f64_into(&numbers_given, &mut bytes);
1181 ///
1182 /// let mut numbers_got = [0.0; 4];
1183 /// LittleEndian::read_f64_into(&bytes, &mut numbers_got);
1184 /// assert_eq!(numbers_given, numbers_got);
1185 /// ```
1186 fn read_f64_into(src: &[u8], dst: &mut [f64]);
1187
1188 /// **DEPRECATED**.
1189 ///
1190 /// This method is deprecated. Use `read_f64_into` instead.
1191 ///
1192 /// Reads IEEE754 single-precision (4 bytes) floating point numbers from
1193 /// `src` into `dst`.
1194 ///
1195 /// # Panics
1196 ///
1197 /// Panics when `src.len() != 8*dst.len()`.
1198 ///
1199 /// # Examples
1200 ///
1201 /// Write and read `f64` numbers in little endian order:
1202 ///
1203 /// ```rust
1204 /// use byteorder_lite::{ByteOrder, LittleEndian};
1205 ///
1206 /// let mut bytes = [0; 32];
1207 /// let numbers_given = [1.0, 2.0, 31.312e211, -11.32e91];
1208 /// LittleEndian::write_f64_into(&numbers_given, &mut bytes);
1209 ///
1210 /// let mut numbers_got = [0.0; 4];
1211 /// LittleEndian::read_f64_into_unchecked(&bytes, &mut numbers_got);
1212 /// assert_eq!(numbers_given, numbers_got);
1213 /// ```
1214 #[inline]
1215 #[deprecated(since = "1.3.0", note = "please use `read_f64_into` instead")]
1216 fn read_f64_into_unchecked(src: &[u8], dst: &mut [f64]) {
1217 Self::read_f64_into(src, dst);
1218 }
1219
1220 /// Writes unsigned 16 bit integers from `src` into `dst`.
1221 ///
1222 /// # Panics
1223 ///
1224 /// Panics when `dst.len() != 2*src.len()`.
1225 ///
1226 /// # Examples
1227 ///
1228 /// Write and read `u16` numbers in little endian order:
1229 ///
1230 /// ```rust
1231 /// use byteorder_lite::{ByteOrder, LittleEndian};
1232 ///
1233 /// let mut bytes = [0; 8];
1234 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
1235 /// LittleEndian::write_u16_into(&numbers_given, &mut bytes);
1236 ///
1237 /// let mut numbers_got = [0; 4];
1238 /// LittleEndian::read_u16_into(&bytes, &mut numbers_got);
1239 /// assert_eq!(numbers_given, numbers_got);
1240 /// ```
1241 fn write_u16_into(src: &[u16], dst: &mut [u8]);
1242
1243 /// Writes unsigned 32 bit integers from `src` into `dst`.
1244 ///
1245 /// # Panics
1246 ///
1247 /// Panics when `dst.len() != 4*src.len()`.
1248 ///
1249 /// # Examples
1250 ///
1251 /// Write and read `u32` numbers in little endian order:
1252 ///
1253 /// ```rust
1254 /// use byteorder_lite::{ByteOrder, LittleEndian};
1255 ///
1256 /// let mut bytes = [0; 16];
1257 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
1258 /// LittleEndian::write_u32_into(&numbers_given, &mut bytes);
1259 ///
1260 /// let mut numbers_got = [0; 4];
1261 /// LittleEndian::read_u32_into(&bytes, &mut numbers_got);
1262 /// assert_eq!(numbers_given, numbers_got);
1263 /// ```
1264 fn write_u32_into(src: &[u32], dst: &mut [u8]);
1265
1266 /// Writes unsigned 64 bit integers from `src` into `dst`.
1267 ///
1268 /// # Panics
1269 ///
1270 /// Panics when `dst.len() != 8*src.len()`.
1271 ///
1272 /// # Examples
1273 ///
1274 /// Write and read `u64` numbers in little endian order:
1275 ///
1276 /// ```rust
1277 /// use byteorder_lite::{ByteOrder, LittleEndian};
1278 ///
1279 /// let mut bytes = [0; 32];
1280 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
1281 /// LittleEndian::write_u64_into(&numbers_given, &mut bytes);
1282 ///
1283 /// let mut numbers_got = [0; 4];
1284 /// LittleEndian::read_u64_into(&bytes, &mut numbers_got);
1285 /// assert_eq!(numbers_given, numbers_got);
1286 /// ```
1287 fn write_u64_into(src: &[u64], dst: &mut [u8]);
1288
1289 /// Writes unsigned 128 bit integers from `src` into `dst`.
1290 ///
1291 /// # Panics
1292 ///
1293 /// Panics when `dst.len() != 16*src.len()`.
1294 ///
1295 /// # Examples
1296 ///
1297 /// Write and read `u128` numbers in little endian order:
1298 ///
1299 /// ```rust
1300 /// use byteorder_lite::{ByteOrder, LittleEndian};
1301 ///
1302 /// let mut bytes = [0; 64];
1303 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
1304 /// LittleEndian::write_u128_into(&numbers_given, &mut bytes);
1305 ///
1306 /// let mut numbers_got = [0; 4];
1307 /// LittleEndian::read_u128_into(&bytes, &mut numbers_got);
1308 /// assert_eq!(numbers_given, numbers_got);
1309 /// ```
1310 fn write_u128_into(src: &[u128], dst: &mut [u8]);
1311
1312 /// Writes signed 8 bit integers from `src` into `dst`.
1313 ///
1314 /// Note that since each `i8` is a single byte, no byte order conversions
1315 /// are used. This method is included because it provides a safe, simple
1316 /// way for the caller to write from a `&[i8]` buffer. (Without this
1317 /// method, the caller would have to either use `unsafe` code or convert
1318 /// each byte to `u8` individually.)
1319 ///
1320 /// # Panics
1321 ///
1322 /// Panics when `buf.len() != src.len()`.
1323 ///
1324 /// # Examples
1325 ///
1326 /// Write and read `i8` numbers in little endian order:
1327 ///
1328 /// ```rust
1329 /// use byteorder_lite::{ByteOrder, LittleEndian, ReadBytesExt};
1330 ///
1331 /// let mut bytes = [0; 4];
1332 /// let numbers_given = [1, 2, 0xf, 0xe];
1333 /// LittleEndian::write_i8_into(&numbers_given, &mut bytes);
1334 /// ```
1335 fn write_i8_into(src: &[i8], dst: &mut [u8]) {
1336 assert_eq!(src.len(), dst.len());
1337 for (d, s) in dst.iter_mut().zip(src.iter()) {
1338 *d = *s as u8;
1339 }
1340 }
1341
1342 /// Writes signed 16 bit integers from `src` into `dst`.
1343 ///
1344 /// # Panics
1345 ///
1346 /// Panics when `buf.len() != 2*src.len()`.
1347 ///
1348 /// # Examples
1349 ///
1350 /// Write and read `i16` numbers in little endian order:
1351 ///
1352 /// ```rust
1353 /// use byteorder_lite::{ByteOrder, LittleEndian};
1354 ///
1355 /// let mut bytes = [0; 8];
1356 /// let numbers_given = [1, 2, 0x0f, 0xee];
1357 /// LittleEndian::write_i16_into(&numbers_given, &mut bytes);
1358 ///
1359 /// let mut numbers_got = [0; 4];
1360 /// LittleEndian::read_i16_into(&bytes, &mut numbers_got);
1361 /// assert_eq!(numbers_given, numbers_got);
1362 /// ```
1363 fn write_i16_into(src: &[i16], dst: &mut [u8]);
1364
1365 /// Writes signed 32 bit integers from `src` into `dst`.
1366 ///
1367 /// # Panics
1368 ///
1369 /// Panics when `dst.len() != 4*src.len()`.
1370 ///
1371 /// # Examples
1372 ///
1373 /// Write and read `i32` numbers in little endian order:
1374 ///
1375 /// ```rust
1376 /// use byteorder_lite::{ByteOrder, LittleEndian};
1377 ///
1378 /// let mut bytes = [0; 16];
1379 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
1380 /// LittleEndian::write_i32_into(&numbers_given, &mut bytes);
1381 ///
1382 /// let mut numbers_got = [0; 4];
1383 /// LittleEndian::read_i32_into(&bytes, &mut numbers_got);
1384 /// assert_eq!(numbers_given, numbers_got);
1385 /// ```
1386 fn write_i32_into(src: &[i32], dst: &mut [u8]);
1387
1388 /// Writes signed 64 bit integers from `src` into `dst`.
1389 ///
1390 /// # Panics
1391 ///
1392 /// Panics when `dst.len() != 8*src.len()`.
1393 ///
1394 /// # Examples
1395 ///
1396 /// Write and read `i64` numbers in little endian order:
1397 ///
1398 /// ```rust
1399 /// use byteorder_lite::{ByteOrder, LittleEndian};
1400 ///
1401 /// let mut bytes = [0; 32];
1402 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
1403 /// LittleEndian::write_i64_into(&numbers_given, &mut bytes);
1404 ///
1405 /// let mut numbers_got = [0; 4];
1406 /// LittleEndian::read_i64_into(&bytes, &mut numbers_got);
1407 /// assert_eq!(numbers_given, numbers_got);
1408 /// ```
1409 fn write_i64_into(src: &[i64], dst: &mut [u8]);
1410
1411 /// Writes signed 128 bit integers from `src` into `dst`.
1412 ///
1413 /// # Panics
1414 ///
1415 /// Panics when `dst.len() != 16*src.len()`.
1416 ///
1417 /// # Examples
1418 ///
1419 /// Write and read `i128` numbers in little endian order:
1420 ///
1421 /// ```rust
1422 /// use byteorder_lite::{ByteOrder, LittleEndian};
1423 ///
1424 /// let mut bytes = [0; 64];
1425 /// let numbers_given = [1, 2, 0xf00f, 0xffee];
1426 /// LittleEndian::write_i128_into(&numbers_given, &mut bytes);
1427 ///
1428 /// let mut numbers_got = [0; 4];
1429 /// LittleEndian::read_i128_into(&bytes, &mut numbers_got);
1430 /// assert_eq!(numbers_given, numbers_got);
1431 /// ```
1432 fn write_i128_into(src: &[i128], dst: &mut [u8]);
1433
1434 /// Writes IEEE754 single-precision (4 bytes) floating point numbers from
1435 /// `src` into `dst`.
1436 ///
1437 /// # Panics
1438 ///
1439 /// Panics when `src.len() != 4*dst.len()`.
1440 ///
1441 /// # Examples
1442 ///
1443 /// Write and read `f32` numbers in little endian order:
1444 ///
1445 /// ```rust
1446 /// use byteorder_lite::{ByteOrder, LittleEndian};
1447 ///
1448 /// let mut bytes = [0; 16];
1449 /// let numbers_given = [1.0, 2.0, 31.312e31, -11.32e19];
1450 /// LittleEndian::write_f32_into(&numbers_given, &mut bytes);
1451 ///
1452 /// let mut numbers_got = [0.0; 4];
1453 /// LittleEndian::read_f32_into(&bytes, &mut numbers_got);
1454 /// assert_eq!(numbers_given, numbers_got);
1455 /// ```
1456 fn write_f32_into(src: &[f32], dst: &mut [u8]);
1457
1458 /// Writes IEEE754 double-precision (8 bytes) floating point numbers from
1459 /// `src` into `dst`.
1460 ///
1461 /// # Panics
1462 ///
1463 /// Panics when `src.len() != 8*dst.len()`.
1464 ///
1465 /// # Examples
1466 ///
1467 /// Write and read `f64` numbers in little endian order:
1468 ///
1469 /// ```rust
1470 /// use byteorder_lite::{ByteOrder, LittleEndian};
1471 ///
1472 /// let mut bytes = [0; 32];
1473 /// let numbers_given = [1.0, 2.0, 31.312e211, -11.32e91];
1474 /// LittleEndian::write_f64_into(&numbers_given, &mut bytes);
1475 ///
1476 /// let mut numbers_got = [0.0; 4];
1477 /// LittleEndian::read_f64_into(&bytes, &mut numbers_got);
1478 /// assert_eq!(numbers_given, numbers_got);
1479 /// ```
1480 fn write_f64_into(src: &[f64], dst: &mut [u8]);
1481
1482 /// Converts the given slice of unsigned 16 bit integers to a particular
1483 /// endianness.
1484 ///
1485 /// If the endianness matches the endianness of the host platform, then
1486 /// this is a no-op.
1487 ///
1488 /// # Examples
1489 ///
1490 /// Convert the host platform's endianness to big-endian:
1491 ///
1492 /// ```rust
1493 /// use byteorder_lite::{ByteOrder, BigEndian};
1494 ///
1495 /// let mut numbers = [5, 65000];
1496 /// BigEndian::from_slice_u16(&mut numbers);
1497 /// assert_eq!(numbers, [5u16.to_be(), 65000u16.to_be()]);
1498 /// ```
1499 fn from_slice_u16(numbers: &mut [u16]);
1500
1501 /// Converts the given slice of unsigned 32 bit integers to a particular
1502 /// endianness.
1503 ///
1504 /// If the endianness matches the endianness of the host platform, then
1505 /// this is a no-op.
1506 ///
1507 /// # Examples
1508 ///
1509 /// Convert the host platform's endianness to big-endian:
1510 ///
1511 /// ```rust
1512 /// use byteorder_lite::{ByteOrder, BigEndian};
1513 ///
1514 /// let mut numbers = [5, 65000];
1515 /// BigEndian::from_slice_u32(&mut numbers);
1516 /// assert_eq!(numbers, [5u32.to_be(), 65000u32.to_be()]);
1517 /// ```
1518 fn from_slice_u32(numbers: &mut [u32]);
1519
1520 /// Converts the given slice of unsigned 64 bit integers to a particular
1521 /// endianness.
1522 ///
1523 /// If the endianness matches the endianness of the host platform, then
1524 /// this is a no-op.
1525 ///
1526 /// # Examples
1527 ///
1528 /// Convert the host platform's endianness to big-endian:
1529 ///
1530 /// ```rust
1531 /// use byteorder_lite::{ByteOrder, BigEndian};
1532 ///
1533 /// let mut numbers = [5, 65000];
1534 /// BigEndian::from_slice_u64(&mut numbers);
1535 /// assert_eq!(numbers, [5u64.to_be(), 65000u64.to_be()]);
1536 /// ```
1537 fn from_slice_u64(numbers: &mut [u64]);
1538
1539 /// Converts the given slice of unsigned 128 bit integers to a particular
1540 /// endianness.
1541 ///
1542 /// If the endianness matches the endianness of the host platform, then
1543 /// this is a no-op.
1544 ///
1545 /// # Examples
1546 ///
1547 /// Convert the host platform's endianness to big-endian:
1548 ///
1549 /// ```rust
1550 /// use byteorder_lite::{ByteOrder, BigEndian};
1551 ///
1552 /// let mut numbers = [5, 65000];
1553 /// BigEndian::from_slice_u128(&mut numbers);
1554 /// assert_eq!(numbers, [5u128.to_be(), 65000u128.to_be()]);
1555 /// ```
1556 fn from_slice_u128(numbers: &mut [u128]);
1557
1558 /// Converts the given slice of signed 16 bit integers to a particular
1559 /// endianness.
1560 ///
1561 /// If the endianness matches the endianness of the host platform, then
1562 /// this is a no-op.
1563 ///
1564 /// # Examples
1565 ///
1566 /// Convert the host platform's endianness to big-endian:
1567 ///
1568 /// ```rust
1569 /// use byteorder_lite::{ByteOrder, BigEndian};
1570 ///
1571 /// let mut numbers = [5, 6500];
1572 /// BigEndian::from_slice_i16(&mut numbers);
1573 /// assert_eq!(numbers, [5i16.to_be(), 6500i16.to_be()]);
1574 /// ```
1575 fn from_slice_i16(src: &mut [i16]);
1576
1577 /// Converts the given slice of signed 32 bit integers to a particular
1578 /// endianness.
1579 ///
1580 /// If the endianness matches the endianness of the host platform, then
1581 /// this is a no-op.
1582 ///
1583 /// # Examples
1584 ///
1585 /// Convert the host platform's endianness to big-endian:
1586 ///
1587 /// ```rust
1588 /// use byteorder_lite::{ByteOrder, BigEndian};
1589 ///
1590 /// let mut numbers = [5, 65000];
1591 /// BigEndian::from_slice_i32(&mut numbers);
1592 /// assert_eq!(numbers, [5i32.to_be(), 65000i32.to_be()]);
1593 /// ```
1594 fn from_slice_i32(src: &mut [i32]);
1595
1596 /// Converts the given slice of signed 64 bit integers to a particular
1597 /// endianness.
1598 ///
1599 /// If the endianness matches the endianness of the host platform, then
1600 /// this is a no-op.
1601 ///
1602 /// # Examples
1603 ///
1604 /// Convert the host platform's endianness to big-endian:
1605 ///
1606 /// ```rust
1607 /// use byteorder_lite::{ByteOrder, BigEndian};
1608 ///
1609 /// let mut numbers = [5, 65000];
1610 /// BigEndian::from_slice_i64(&mut numbers);
1611 /// assert_eq!(numbers, [5i64.to_be(), 65000i64.to_be()]);
1612 /// ```
1613 fn from_slice_i64(src: &mut [i64]);
1614
1615 /// Converts the given slice of signed 128 bit integers to a particular
1616 /// endianness.
1617 ///
1618 /// If the endianness matches the endianness of the host platform, then
1619 /// this is a no-op.
1620 ///
1621 /// # Examples
1622 ///
1623 /// Convert the host platform's endianness to big-endian:
1624 ///
1625 /// ```rust
1626 /// use byteorder_lite::{ByteOrder, BigEndian};
1627 ///
1628 /// let mut numbers = [5, 65000];
1629 /// BigEndian::from_slice_i128(&mut numbers);
1630 /// assert_eq!(numbers, [5i128.to_be(), 65000i128.to_be()]);
1631 /// ```
1632 fn from_slice_i128(src: &mut [i128]);
1633
1634 /// Converts the given slice of IEEE754 single-precision (4 bytes) floating
1635 /// point numbers to a particular endianness.
1636 ///
1637 /// If the endianness matches the endianness of the host platform, then
1638 /// this is a no-op.
1639 fn from_slice_f32(numbers: &mut [f32]);
1640
1641 /// Converts the given slice of IEEE754 double-precision (8 bytes) floating
1642 /// point numbers to a particular endianness.
1643 ///
1644 /// If the endianness matches the endianness of the host platform, then
1645 /// this is a no-op.
1646 fn from_slice_f64(numbers: &mut [f64]);
1647}
1648
1649/// Defines big-endian serialization.
1650///
1651/// Note that this type has no value constructor. It is used purely at the
1652/// type level.
1653///
1654/// # Examples
1655///
1656/// Write and read `u32` numbers in big endian order:
1657///
1658/// ```rust
1659/// use byteorder_lite::{ByteOrder, BigEndian};
1660///
1661/// let mut buf = [0; 4];
1662/// BigEndian::write_u32(&mut buf, 1_000_000);
1663/// assert_eq!(1_000_000, BigEndian::read_u32(&buf));
1664/// ```
1665#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
1666pub enum BigEndian {}
1667
1668impl Default for BigEndian {
1669 fn default() -> BigEndian {
1670 panic!("BigEndian default")
1671 }
1672}
1673
1674/// A type alias for [`BigEndian`].
1675///
1676/// [`BigEndian`]: enum.BigEndian.html
1677pub type BE = BigEndian;
1678
1679/// Defines little-endian serialization.
1680///
1681/// Note that this type has no value constructor. It is used purely at the
1682/// type level.
1683///
1684/// # Examples
1685///
1686/// Write and read `u32` numbers in little endian order:
1687///
1688/// ```rust
1689/// use byteorder_lite::{ByteOrder, LittleEndian};
1690///
1691/// let mut buf = [0; 4];
1692/// LittleEndian::write_u32(&mut buf, 1_000_000);
1693/// assert_eq!(1_000_000, LittleEndian::read_u32(&buf));
1694/// ```
1695#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
1696pub enum LittleEndian {}
1697
1698impl Default for LittleEndian {
1699 fn default() -> LittleEndian {
1700 panic!("LittleEndian default")
1701 }
1702}
1703
1704/// A type alias for [`LittleEndian`].
1705///
1706/// [`LittleEndian`]: enum.LittleEndian.html
1707pub type LE = LittleEndian;
1708
1709/// Defines network byte order serialization.
1710///
1711/// Network byte order is defined by [RFC 1700][1] to be big-endian, and is
1712/// referred to in several protocol specifications. This type is an alias of
1713/// [`BigEndian`].
1714///
1715/// [1]: https://tools.ietf.org/html/rfc1700
1716///
1717/// Note that this type has no value constructor. It is used purely at the
1718/// type level.
1719///
1720/// # Examples
1721///
1722/// Write and read `i16` numbers in big endian order:
1723///
1724/// ```rust
1725/// use byteorder_lite::{ByteOrder, NetworkEndian, BigEndian};
1726///
1727/// let mut buf = [0; 2];
1728/// BigEndian::write_i16(&mut buf, -5_000);
1729/// assert_eq!(-5_000, NetworkEndian::read_i16(&buf));
1730/// ```
1731///
1732/// [`BigEndian`]: enum.BigEndian.html
1733pub type NetworkEndian = BigEndian;
1734
1735/// Defines system native-endian serialization.
1736///
1737/// Note that this type has no value constructor. It is used purely at the
1738/// type level.
1739///
1740/// On this platform, this is an alias for [`LittleEndian`].
1741///
1742/// [`LittleEndian`]: enum.LittleEndian.html
1743#[cfg(target_endian = "little")]
1744pub type NativeEndian = LittleEndian;
1745
1746/// Defines system native-endian serialization.
1747///
1748/// Note that this type has no value constructor. It is used purely at the
1749/// type level.
1750///
1751/// On this platform, this is an alias for [`BigEndian`].
1752///
1753/// [`BigEndian`]: enum.BigEndian.html
1754#[cfg(target_endian = "big")]
1755pub type NativeEndian = BigEndian;
1756
1757/// Copies a &[u8] $src into a &mut [$ty] $dst for the endianness given by
1758/// $from_bytes (must be either from_be_bytes or from_le_bytes).
1759///
1760/// Panics if $src.len() != $dst.len() * size_of::<$ty>().
1761macro_rules! read_slice {
1762 ($src:expr, $dst:expr, $ty:ty, $from_bytes:ident) => {{
1763 const SIZE: usize = core::mem::size_of::<$ty>();
1764 // Check types:
1765 let src: &[u8] = $src;
1766 let dst: &mut [$ty] = $dst;
1767 assert_eq!(src.len(), dst.len() * SIZE);
1768 for (src, dst) in src.chunks_exact(SIZE).zip(dst.iter_mut()) {
1769 *dst = <$ty>::$from_bytes(src.try_into().unwrap());
1770 }
1771 }};
1772}
1773
1774/// Copies a &[$ty] $src into a &mut [u8] $dst for the endianness given by
1775/// $from_bytes (must be either from_be_bytes or from_le_bytes).
1776///
1777/// Panics if $src.len() * size_of::<$ty>() != $dst.len().
1778macro_rules! write_slice {
1779 ($src:expr, $dst:expr, $ty:ty, $to_bytes:ident) => {{
1780 const SIZE: usize = core::mem::size_of::<$ty>();
1781 // Check types:
1782 let src: &[$ty] = $src;
1783 let dst: &mut [u8] = $dst;
1784 assert_eq!(src.len() * SIZE, dst.len());
1785 for (src, dst) in src.iter().zip(dst.chunks_exact_mut(SIZE)) {
1786 dst.copy_from_slice(&src.$to_bytes());
1787 }
1788 }};
1789}
1790
1791impl ByteOrder for BigEndian {
1792 #[inline]
1793 fn read_u16(buf: &[u8]) -> u16 {
1794 u16::from_be_bytes(buf[..2].try_into().unwrap())
1795 }
1796
1797 #[inline]
1798 fn read_u32(buf: &[u8]) -> u32 {
1799 u32::from_be_bytes(buf[..4].try_into().unwrap())
1800 }
1801
1802 #[inline]
1803 fn read_u64(buf: &[u8]) -> u64 {
1804 u64::from_be_bytes(buf[..8].try_into().unwrap())
1805 }
1806
1807 #[inline]
1808 fn read_u128(buf: &[u8]) -> u128 {
1809 u128::from_be_bytes(buf[..16].try_into().unwrap())
1810 }
1811
1812 #[inline]
1813 fn read_uint(buf: &[u8], nbytes: usize) -> u64 {
1814 let mut out = [0; 8];
1815 assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len());
1816 let start = out.len() - nbytes;
1817 out[start..].copy_from_slice(&buf[..nbytes]);
1818 u64::from_be_bytes(out)
1819 }
1820
1821 #[inline]
1822 fn read_uint128(buf: &[u8], nbytes: usize) -> u128 {
1823 let mut out = [0; 16];
1824 assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len());
1825 let start = out.len() - nbytes;
1826 out[start..].copy_from_slice(&buf[..nbytes]);
1827 u128::from_be_bytes(out)
1828 }
1829
1830 #[inline]
1831 fn write_u16(buf: &mut [u8], n: u16) {
1832 buf[..2].copy_from_slice(&n.to_be_bytes());
1833 }
1834
1835 #[inline]
1836 fn write_u32(buf: &mut [u8], n: u32) {
1837 buf[..4].copy_from_slice(&n.to_be_bytes());
1838 }
1839
1840 #[inline]
1841 fn write_u64(buf: &mut [u8], n: u64) {
1842 buf[..8].copy_from_slice(&n.to_be_bytes());
1843 }
1844
1845 #[inline]
1846 fn write_u128(buf: &mut [u8], n: u128) {
1847 buf[..16].copy_from_slice(&n.to_be_bytes());
1848 }
1849
1850 #[inline]
1851 fn write_uint(buf: &mut [u8], n: u64, nbytes: usize) {
1852 assert!(pack_size(n) <= nbytes && nbytes <= 8);
1853 assert!(nbytes <= buf.len());
1854
1855 buf[..nbytes].copy_from_slice(&n.to_be_bytes()[(8 - nbytes)..]);
1856 }
1857
1858 #[inline]
1859 fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize) {
1860 assert!(pack_size128(n) <= nbytes && nbytes <= 16);
1861 assert!(nbytes <= buf.len());
1862
1863 buf[..nbytes].copy_from_slice(&n.to_be_bytes()[(16 - nbytes)..]);
1864 }
1865
1866 #[inline]
1867 fn read_u16_into(src: &[u8], dst: &mut [u16]) {
1868 read_slice!(src, dst, u16, from_be_bytes);
1869 }
1870
1871 #[inline]
1872 fn read_u32_into(src: &[u8], dst: &mut [u32]) {
1873 read_slice!(src, dst, u32, from_be_bytes);
1874 }
1875
1876 #[inline]
1877 fn read_u64_into(src: &[u8], dst: &mut [u64]) {
1878 read_slice!(src, dst, u64, from_be_bytes);
1879 }
1880
1881 #[inline]
1882 fn read_u128_into(src: &[u8], dst: &mut [u128]) {
1883 read_slice!(src, dst, u128, from_be_bytes);
1884 }
1885
1886 #[inline]
1887 fn read_i16_into(src: &[u8], dst: &mut [i16]) {
1888 read_slice!(src, dst, i16, from_be_bytes);
1889 }
1890
1891 #[inline]
1892 fn read_i32_into(src: &[u8], dst: &mut [i32]) {
1893 read_slice!(src, dst, i32, from_be_bytes);
1894 }
1895
1896 #[inline]
1897 fn read_i64_into(src: &[u8], dst: &mut [i64]) {
1898 read_slice!(src, dst, i64, from_be_bytes);
1899 }
1900
1901 #[inline]
1902 fn read_i128_into(src: &[u8], dst: &mut [i128]) {
1903 read_slice!(src, dst, i128, from_be_bytes);
1904 }
1905
1906 #[inline]
1907 fn read_f32_into(src: &[u8], dst: &mut [f32]) {
1908 read_slice!(src, dst, f32, from_be_bytes);
1909 }
1910
1911 #[inline]
1912 fn read_f64_into(src: &[u8], dst: &mut [f64]) {
1913 read_slice!(src, dst, f64, from_be_bytes);
1914 }
1915
1916 #[inline]
1917 fn write_u16_into(src: &[u16], dst: &mut [u8]) {
1918 write_slice!(src, dst, u16, to_be_bytes);
1919 }
1920
1921 #[inline]
1922 fn write_u32_into(src: &[u32], dst: &mut [u8]) {
1923 write_slice!(src, dst, u32, to_be_bytes);
1924 }
1925
1926 #[inline]
1927 fn write_u64_into(src: &[u64], dst: &mut [u8]) {
1928 write_slice!(src, dst, u64, to_be_bytes);
1929 }
1930
1931 #[inline]
1932 fn write_u128_into(src: &[u128], dst: &mut [u8]) {
1933 write_slice!(src, dst, u128, to_be_bytes);
1934 }
1935
1936 #[inline]
1937 fn write_i16_into(src: &[i16], dst: &mut [u8]) {
1938 write_slice!(src, dst, i16, to_be_bytes);
1939 }
1940
1941 #[inline]
1942 fn write_i32_into(src: &[i32], dst: &mut [u8]) {
1943 write_slice!(src, dst, i32, to_be_bytes);
1944 }
1945
1946 #[inline]
1947 fn write_i64_into(src: &[i64], dst: &mut [u8]) {
1948 write_slice!(src, dst, i64, to_be_bytes);
1949 }
1950
1951 #[inline]
1952 fn write_i128_into(src: &[i128], dst: &mut [u8]) {
1953 write_slice!(src, dst, i128, to_be_bytes);
1954 }
1955
1956 #[inline]
1957 fn write_f32_into(src: &[f32], dst: &mut [u8]) {
1958 write_slice!(src, dst, f32, to_be_bytes);
1959 }
1960
1961 #[inline]
1962 fn write_f64_into(src: &[f64], dst: &mut [u8]) {
1963 write_slice!(src, dst, f64, to_be_bytes);
1964 }
1965
1966 #[inline]
1967 fn from_slice_u16(numbers: &mut [u16]) {
1968 if cfg!(target_endian = "little") {
1969 for n in numbers {
1970 *n = n.to_be();
1971 }
1972 }
1973 }
1974
1975 #[inline]
1976 fn from_slice_u32(numbers: &mut [u32]) {
1977 if cfg!(target_endian = "little") {
1978 for n in numbers {
1979 *n = n.to_be();
1980 }
1981 }
1982 }
1983
1984 #[inline]
1985 fn from_slice_u64(numbers: &mut [u64]) {
1986 if cfg!(target_endian = "little") {
1987 for n in numbers {
1988 *n = n.to_be();
1989 }
1990 }
1991 }
1992
1993 #[inline]
1994 fn from_slice_u128(numbers: &mut [u128]) {
1995 if cfg!(target_endian = "little") {
1996 for n in numbers {
1997 *n = n.to_be();
1998 }
1999 }
2000 }
2001
2002 #[inline]
2003 fn from_slice_i16(numbers: &mut [i16]) {
2004 if cfg!(target_endian = "little") {
2005 for n in numbers {
2006 *n = n.to_be();
2007 }
2008 }
2009 }
2010
2011 #[inline]
2012 fn from_slice_i32(numbers: &mut [i32]) {
2013 if cfg!(target_endian = "little") {
2014 for n in numbers {
2015 *n = n.to_be();
2016 }
2017 }
2018 }
2019
2020 #[inline]
2021 fn from_slice_i64(numbers: &mut [i64]) {
2022 if cfg!(target_endian = "little") {
2023 for n in numbers {
2024 *n = n.to_be();
2025 }
2026 }
2027 }
2028
2029 #[inline]
2030 fn from_slice_i128(numbers: &mut [i128]) {
2031 if cfg!(target_endian = "little") {
2032 for n in numbers {
2033 *n = n.to_be();
2034 }
2035 }
2036 }
2037
2038 #[inline]
2039 fn from_slice_f32(numbers: &mut [f32]) {
2040 if cfg!(target_endian = "little") {
2041 for n in numbers {
2042 *n = f32::from_bits(n.to_bits().to_be());
2043 }
2044 }
2045 }
2046
2047 #[inline]
2048 fn from_slice_f64(numbers: &mut [f64]) {
2049 if cfg!(target_endian = "little") {
2050 for n in numbers {
2051 *n = f64::from_bits(n.to_bits().to_be());
2052 }
2053 }
2054 }
2055}
2056
2057impl ByteOrder for LittleEndian {
2058 #[inline]
2059 fn read_u16(buf: &[u8]) -> u16 {
2060 u16::from_le_bytes(buf[..2].try_into().unwrap())
2061 }
2062
2063 #[inline]
2064 fn read_u32(buf: &[u8]) -> u32 {
2065 u32::from_le_bytes(buf[..4].try_into().unwrap())
2066 }
2067
2068 #[inline]
2069 fn read_u64(buf: &[u8]) -> u64 {
2070 u64::from_le_bytes(buf[..8].try_into().unwrap())
2071 }
2072
2073 #[inline]
2074 fn read_u128(buf: &[u8]) -> u128 {
2075 u128::from_le_bytes(buf[..16].try_into().unwrap())
2076 }
2077
2078 #[inline]
2079 fn read_uint(buf: &[u8], nbytes: usize) -> u64 {
2080 let mut out = [0; 8];
2081 assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len());
2082 out[..nbytes].copy_from_slice(&buf[..nbytes]);
2083 u64::from_le_bytes(out)
2084 }
2085
2086 #[inline]
2087 fn read_uint128(buf: &[u8], nbytes: usize) -> u128 {
2088 let mut out = [0; 16];
2089 assert!(1 <= nbytes && nbytes <= out.len() && nbytes <= buf.len());
2090 out[..nbytes].copy_from_slice(&buf[..nbytes]);
2091 u128::from_le_bytes(out)
2092 }
2093
2094 #[inline]
2095 fn write_u16(buf: &mut [u8], n: u16) {
2096 buf[..2].copy_from_slice(&n.to_le_bytes());
2097 }
2098
2099 #[inline]
2100 fn write_u32(buf: &mut [u8], n: u32) {
2101 buf[..4].copy_from_slice(&n.to_le_bytes());
2102 }
2103
2104 #[inline]
2105 fn write_u64(buf: &mut [u8], n: u64) {
2106 buf[..8].copy_from_slice(&n.to_le_bytes());
2107 }
2108
2109 #[inline]
2110 fn write_u128(buf: &mut [u8], n: u128) {
2111 buf[..16].copy_from_slice(&n.to_le_bytes());
2112 }
2113
2114 #[inline]
2115 fn write_uint(buf: &mut [u8], n: u64, nbytes: usize) {
2116 assert!(pack_size(n) <= nbytes && nbytes <= 8);
2117 assert!(nbytes <= buf.len());
2118
2119 buf[..nbytes].copy_from_slice(&n.to_le_bytes()[..nbytes]);
2120 }
2121
2122 #[inline]
2123 fn write_uint128(buf: &mut [u8], n: u128, nbytes: usize) {
2124 assert!(pack_size128(n) <= nbytes && nbytes <= 16);
2125 assert!(nbytes <= buf.len());
2126
2127 buf[..nbytes].copy_from_slice(&n.to_le_bytes()[..nbytes]);
2128 }
2129
2130 #[inline]
2131 fn read_u16_into(src: &[u8], dst: &mut [u16]) {
2132 read_slice!(src, dst, u16, from_le_bytes);
2133 }
2134
2135 #[inline]
2136 fn read_u32_into(src: &[u8], dst: &mut [u32]) {
2137 read_slice!(src, dst, u32, from_le_bytes);
2138 }
2139
2140 #[inline]
2141 fn read_u64_into(src: &[u8], dst: &mut [u64]) {
2142 read_slice!(src, dst, u64, from_le_bytes);
2143 }
2144
2145 #[inline]
2146 fn read_u128_into(src: &[u8], dst: &mut [u128]) {
2147 read_slice!(src, dst, u128, from_le_bytes);
2148 }
2149
2150 #[inline]
2151 fn read_i16_into(src: &[u8], dst: &mut [i16]) {
2152 read_slice!(src, dst, i16, from_le_bytes);
2153 }
2154
2155 #[inline]
2156 fn read_i32_into(src: &[u8], dst: &mut [i32]) {
2157 read_slice!(src, dst, i32, from_le_bytes);
2158 }
2159
2160 #[inline]
2161 fn read_i64_into(src: &[u8], dst: &mut [i64]) {
2162 read_slice!(src, dst, i64, from_le_bytes);
2163 }
2164
2165 #[inline]
2166 fn read_i128_into(src: &[u8], dst: &mut [i128]) {
2167 read_slice!(src, dst, i128, from_le_bytes);
2168 }
2169
2170 #[inline]
2171 fn read_f32_into(src: &[u8], dst: &mut [f32]) {
2172 read_slice!(src, dst, f32, from_le_bytes);
2173 }
2174
2175 #[inline]
2176 fn read_f64_into(src: &[u8], dst: &mut [f64]) {
2177 read_slice!(src, dst, f64, from_le_bytes);
2178 }
2179
2180 #[inline]
2181 fn write_u16_into(src: &[u16], dst: &mut [u8]) {
2182 write_slice!(src, dst, u16, to_le_bytes);
2183 }
2184
2185 #[inline]
2186 fn write_u32_into(src: &[u32], dst: &mut [u8]) {
2187 write_slice!(src, dst, u32, to_le_bytes);
2188 }
2189
2190 #[inline]
2191 fn write_u64_into(src: &[u64], dst: &mut [u8]) {
2192 write_slice!(src, dst, u64, to_le_bytes);
2193 }
2194
2195 #[inline]
2196 fn write_u128_into(src: &[u128], dst: &mut [u8]) {
2197 write_slice!(src, dst, u128, to_le_bytes);
2198 }
2199
2200 #[inline]
2201 fn write_i16_into(src: &[i16], dst: &mut [u8]) {
2202 write_slice!(src, dst, i16, to_le_bytes);
2203 }
2204
2205 #[inline]
2206 fn write_i32_into(src: &[i32], dst: &mut [u8]) {
2207 write_slice!(src, dst, i32, to_le_bytes);
2208 }
2209
2210 #[inline]
2211 fn write_i64_into(src: &[i64], dst: &mut [u8]) {
2212 write_slice!(src, dst, i64, to_le_bytes);
2213 }
2214
2215 #[inline]
2216 fn write_i128_into(src: &[i128], dst: &mut [u8]) {
2217 write_slice!(src, dst, i128, to_le_bytes);
2218 }
2219
2220 #[inline]
2221 fn write_f32_into(src: &[f32], dst: &mut [u8]) {
2222 write_slice!(src, dst, f32, to_le_bytes);
2223 }
2224
2225 #[inline]
2226 fn write_f64_into(src: &[f64], dst: &mut [u8]) {
2227 write_slice!(src, dst, f64, to_le_bytes);
2228 }
2229
2230 #[inline]
2231 fn from_slice_u16(numbers: &mut [u16]) {
2232 if cfg!(target_endian = "big") {
2233 for n in numbers {
2234 *n = n.to_le();
2235 }
2236 }
2237 }
2238
2239 #[inline]
2240 fn from_slice_u32(numbers: &mut [u32]) {
2241 if cfg!(target_endian = "big") {
2242 for n in numbers {
2243 *n = n.to_le();
2244 }
2245 }
2246 }
2247
2248 #[inline]
2249 fn from_slice_u64(numbers: &mut [u64]) {
2250 if cfg!(target_endian = "big") {
2251 for n in numbers {
2252 *n = n.to_le();
2253 }
2254 }
2255 }
2256
2257 #[inline]
2258 fn from_slice_u128(numbers: &mut [u128]) {
2259 if cfg!(target_endian = "big") {
2260 for n in numbers {
2261 *n = n.to_le();
2262 }
2263 }
2264 }
2265
2266 #[inline]
2267 fn from_slice_i16(numbers: &mut [i16]) {
2268 if cfg!(target_endian = "big") {
2269 for n in numbers {
2270 *n = n.to_le();
2271 }
2272 }
2273 }
2274
2275 #[inline]
2276 fn from_slice_i32(numbers: &mut [i32]) {
2277 if cfg!(target_endian = "big") {
2278 for n in numbers {
2279 *n = n.to_le();
2280 }
2281 }
2282 }
2283
2284 #[inline]
2285 fn from_slice_i64(numbers: &mut [i64]) {
2286 if cfg!(target_endian = "big") {
2287 for n in numbers {
2288 *n = n.to_le();
2289 }
2290 }
2291 }
2292
2293 #[inline]
2294 fn from_slice_i128(numbers: &mut [i128]) {
2295 if cfg!(target_endian = "big") {
2296 for n in numbers {
2297 *n = n.to_le();
2298 }
2299 }
2300 }
2301
2302 #[inline]
2303 fn from_slice_f32(numbers: &mut [f32]) {
2304 if cfg!(target_endian = "big") {
2305 for n in numbers {
2306 *n = f32::from_bits(n.to_bits().to_le());
2307 }
2308 }
2309 }
2310
2311 #[inline]
2312 fn from_slice_f64(numbers: &mut [f64]) {
2313 if cfg!(target_endian = "big") {
2314 for n in numbers {
2315 *n = f64::from_bits(n.to_bits().to_le());
2316 }
2317 }
2318 }
2319}
2320
2321#[cfg(test)]
2322mod test {
2323 use quickcheck::{Arbitrary, Gen, QuickCheck, StdGen, Testable};
2324 use rand::{thread_rng, Rng};
2325
2326 pub const U24_MAX: u32 = 16_777_215;
2327 pub const I24_MAX: i32 = 8_388_607;
2328 pub const U48_MAX: u64 = 281_474_976_710_655;
2329 pub const I48_MAX: i64 = 140_737_488_355_327;
2330
2331 pub const U64_MAX: u64 = ::core::u64::MAX;
2332 pub const I64_MAX: u64 = ::core::i64::MAX as u64;
2333
2334 macro_rules! calc_max {
2335 ($max:expr, $bytes:expr) => {
2336 calc_max!($max, $bytes, 8)
2337 };
2338 ($max:expr, $bytes:expr, $maxbytes:expr) => {
2339 ($max - 1) >> (8 * ($maxbytes - $bytes))
2340 };
2341 }
2342
2343 #[derive(Clone, Debug)]
2344 pub struct Wi128<T>(pub T);
2345
2346 impl<T: Clone> Wi128<T> {
2347 pub fn clone(&self) -> T {
2348 self.0.clone()
2349 }
2350 }
2351
2352 impl<T: PartialEq> PartialEq<T> for Wi128<T> {
2353 fn eq(&self, other: &T) -> bool {
2354 self.0.eq(other)
2355 }
2356 }
2357
2358 impl Arbitrary for Wi128<u128> {
2359 fn arbitrary<G: Gen>(gen: &mut G) -> Wi128<u128> {
2360 let max = calc_max!(::core::u128::MAX, gen.size(), 16);
2361 let output = (gen.gen::<u64>() as u128)
2362 | ((gen.gen::<u64>() as u128) << 64);
2363 Wi128(output & (max - 1))
2364 }
2365 }
2366
2367 impl Arbitrary for Wi128<i128> {
2368 fn arbitrary<G: Gen>(gen: &mut G) -> Wi128<i128> {
2369 let max = calc_max!(::core::i128::MAX, gen.size(), 16);
2370 let output = (gen.gen::<i64>() as i128)
2371 | ((gen.gen::<i64>() as i128) << 64);
2372 Wi128(output & (max - 1))
2373 }
2374 }
2375
2376 pub fn qc_sized<A: Testable>(f: A, size: u64) {
2377 QuickCheck::new()
2378 .gen(StdGen::new(thread_rng(), size as usize))
2379 .tests(1_00)
2380 .max_tests(10_000)
2381 .quickcheck(f);
2382 }
2383
2384 macro_rules! qc_byte_order {
2385 ($name:ident, $ty_int:ty, $max:expr,
2386 $bytes:expr, $read:ident, $write:ident) => {
2387 #[cfg(not(miri))]
2388 mod $name {
2389 #[allow(unused_imports)]
2390 use super::{qc_sized, Wi128};
2391 use crate::{
2392 BigEndian, ByteOrder, LittleEndian, NativeEndian,
2393 };
2394
2395 #[test]
2396 fn big_endian() {
2397 fn prop(n: $ty_int) -> bool {
2398 let mut buf = [0; 16];
2399 BigEndian::$write(&mut buf, n.clone(), $bytes);
2400 n == BigEndian::$read(&buf[..$bytes], $bytes)
2401 }
2402 qc_sized(prop as fn($ty_int) -> bool, $max);
2403 }
2404
2405 #[test]
2406 fn little_endian() {
2407 fn prop(n: $ty_int) -> bool {
2408 let mut buf = [0; 16];
2409 LittleEndian::$write(&mut buf, n.clone(), $bytes);
2410 n == LittleEndian::$read(&buf[..$bytes], $bytes)
2411 }
2412 qc_sized(prop as fn($ty_int) -> bool, $max);
2413 }
2414
2415 #[test]
2416 fn native_endian() {
2417 fn prop(n: $ty_int) -> bool {
2418 let mut buf = [0; 16];
2419 NativeEndian::$write(&mut buf, n.clone(), $bytes);
2420 n == NativeEndian::$read(&buf[..$bytes], $bytes)
2421 }
2422 qc_sized(prop as fn($ty_int) -> bool, $max);
2423 }
2424 }
2425 };
2426 ($name:ident, $ty_int:ty, $max:expr,
2427 $read:ident, $write:ident) => {
2428 #[cfg(not(miri))]
2429 mod $name {
2430 #[allow(unused_imports)]
2431 use super::{qc_sized, Wi128};
2432 use crate::{
2433 BigEndian, ByteOrder, LittleEndian, NativeEndian,
2434 };
2435 use core::mem::size_of;
2436
2437 #[test]
2438 fn big_endian() {
2439 fn prop(n: $ty_int) -> bool {
2440 let bytes = size_of::<$ty_int>();
2441 let mut buf = [0; 16];
2442 BigEndian::$write(&mut buf[16 - bytes..], n.clone());
2443 n == BigEndian::$read(&buf[16 - bytes..])
2444 }
2445 qc_sized(prop as fn($ty_int) -> bool, $max - 1);
2446 }
2447
2448 #[test]
2449 fn little_endian() {
2450 fn prop(n: $ty_int) -> bool {
2451 let bytes = size_of::<$ty_int>();
2452 let mut buf = [0; 16];
2453 LittleEndian::$write(&mut buf[..bytes], n.clone());
2454 n == LittleEndian::$read(&buf[..bytes])
2455 }
2456 qc_sized(prop as fn($ty_int) -> bool, $max - 1);
2457 }
2458
2459 #[test]
2460 fn native_endian() {
2461 fn prop(n: $ty_int) -> bool {
2462 let bytes = size_of::<$ty_int>();
2463 let mut buf = [0; 16];
2464 NativeEndian::$write(&mut buf[..bytes], n.clone());
2465 n == NativeEndian::$read(&buf[..bytes])
2466 }
2467 qc_sized(prop as fn($ty_int) -> bool, $max - 1);
2468 }
2469 }
2470 };
2471 }
2472
2473 qc_byte_order!(
2474 prop_u16,
2475 u16,
2476 ::core::u16::MAX as u64,
2477 read_u16,
2478 write_u16
2479 );
2480 qc_byte_order!(
2481 prop_i16,
2482 i16,
2483 ::core::i16::MAX as u64,
2484 read_i16,
2485 write_i16
2486 );
2487 qc_byte_order!(
2488 prop_u24,
2489 u32,
2490 crate::test::U24_MAX as u64,
2491 read_u24,
2492 write_u24
2493 );
2494 qc_byte_order!(
2495 prop_i24,
2496 i32,
2497 crate::test::I24_MAX as u64,
2498 read_i24,
2499 write_i24
2500 );
2501 qc_byte_order!(
2502 prop_u32,
2503 u32,
2504 ::core::u32::MAX as u64,
2505 read_u32,
2506 write_u32
2507 );
2508 qc_byte_order!(
2509 prop_i32,
2510 i32,
2511 ::core::i32::MAX as u64,
2512 read_i32,
2513 write_i32
2514 );
2515 qc_byte_order!(
2516 prop_u48,
2517 u64,
2518 crate::test::U48_MAX as u64,
2519 read_u48,
2520 write_u48
2521 );
2522 qc_byte_order!(
2523 prop_i48,
2524 i64,
2525 crate::test::I48_MAX as u64,
2526 read_i48,
2527 write_i48
2528 );
2529 qc_byte_order!(
2530 prop_u64,
2531 u64,
2532 ::core::u64::MAX as u64,
2533 read_u64,
2534 write_u64
2535 );
2536 qc_byte_order!(
2537 prop_i64,
2538 i64,
2539 ::core::i64::MAX as u64,
2540 read_i64,
2541 write_i64
2542 );
2543 qc_byte_order!(
2544 prop_f32,
2545 f32,
2546 ::core::u64::MAX as u64,
2547 read_f32,
2548 write_f32
2549 );
2550 qc_byte_order!(
2551 prop_f64,
2552 f64,
2553 ::core::i64::MAX as u64,
2554 read_f64,
2555 write_f64
2556 );
2557
2558 qc_byte_order!(prop_u128, Wi128<u128>, 16 + 1, read_u128, write_u128);
2559 qc_byte_order!(prop_i128, Wi128<i128>, 16 + 1, read_i128, write_i128);
2560
2561 qc_byte_order!(
2562 prop_uint_1,
2563 u64,
2564 calc_max!(super::U64_MAX, 1),
2565 1,
2566 read_uint,
2567 write_uint
2568 );
2569 qc_byte_order!(
2570 prop_uint_2,
2571 u64,
2572 calc_max!(super::U64_MAX, 2),
2573 2,
2574 read_uint,
2575 write_uint
2576 );
2577 qc_byte_order!(
2578 prop_uint_3,
2579 u64,
2580 calc_max!(super::U64_MAX, 3),
2581 3,
2582 read_uint,
2583 write_uint
2584 );
2585 qc_byte_order!(
2586 prop_uint_4,
2587 u64,
2588 calc_max!(super::U64_MAX, 4),
2589 4,
2590 read_uint,
2591 write_uint
2592 );
2593 qc_byte_order!(
2594 prop_uint_5,
2595 u64,
2596 calc_max!(super::U64_MAX, 5),
2597 5,
2598 read_uint,
2599 write_uint
2600 );
2601 qc_byte_order!(
2602 prop_uint_6,
2603 u64,
2604 calc_max!(super::U64_MAX, 6),
2605 6,
2606 read_uint,
2607 write_uint
2608 );
2609 qc_byte_order!(
2610 prop_uint_7,
2611 u64,
2612 calc_max!(super::U64_MAX, 7),
2613 7,
2614 read_uint,
2615 write_uint
2616 );
2617 qc_byte_order!(
2618 prop_uint_8,
2619 u64,
2620 calc_max!(super::U64_MAX, 8),
2621 8,
2622 read_uint,
2623 write_uint
2624 );
2625
2626 qc_byte_order!(
2627 prop_uint128_1,
2628 Wi128<u128>,
2629 1,
2630 1,
2631 read_uint128,
2632 write_uint128
2633 );
2634 qc_byte_order!(
2635 prop_uint128_2,
2636 Wi128<u128>,
2637 2,
2638 2,
2639 read_uint128,
2640 write_uint128
2641 );
2642 qc_byte_order!(
2643 prop_uint128_3,
2644 Wi128<u128>,
2645 3,
2646 3,
2647 read_uint128,
2648 write_uint128
2649 );
2650 qc_byte_order!(
2651 prop_uint128_4,
2652 Wi128<u128>,
2653 4,
2654 4,
2655 read_uint128,
2656 write_uint128
2657 );
2658 qc_byte_order!(
2659 prop_uint128_5,
2660 Wi128<u128>,
2661 5,
2662 5,
2663 read_uint128,
2664 write_uint128
2665 );
2666 qc_byte_order!(
2667 prop_uint128_6,
2668 Wi128<u128>,
2669 6,
2670 6,
2671 read_uint128,
2672 write_uint128
2673 );
2674 qc_byte_order!(
2675 prop_uint128_7,
2676 Wi128<u128>,
2677 7,
2678 7,
2679 read_uint128,
2680 write_uint128
2681 );
2682 qc_byte_order!(
2683 prop_uint128_8,
2684 Wi128<u128>,
2685 8,
2686 8,
2687 read_uint128,
2688 write_uint128
2689 );
2690 qc_byte_order!(
2691 prop_uint128_9,
2692 Wi128<u128>,
2693 9,
2694 9,
2695 read_uint128,
2696 write_uint128
2697 );
2698 qc_byte_order!(
2699 prop_uint128_10,
2700 Wi128<u128>,
2701 10,
2702 10,
2703 read_uint128,
2704 write_uint128
2705 );
2706 qc_byte_order!(
2707 prop_uint128_11,
2708 Wi128<u128>,
2709 11,
2710 11,
2711 read_uint128,
2712 write_uint128
2713 );
2714 qc_byte_order!(
2715 prop_uint128_12,
2716 Wi128<u128>,
2717 12,
2718 12,
2719 read_uint128,
2720 write_uint128
2721 );
2722 qc_byte_order!(
2723 prop_uint128_13,
2724 Wi128<u128>,
2725 13,
2726 13,
2727 read_uint128,
2728 write_uint128
2729 );
2730 qc_byte_order!(
2731 prop_uint128_14,
2732 Wi128<u128>,
2733 14,
2734 14,
2735 read_uint128,
2736 write_uint128
2737 );
2738 qc_byte_order!(
2739 prop_uint128_15,
2740 Wi128<u128>,
2741 15,
2742 15,
2743 read_uint128,
2744 write_uint128
2745 );
2746 qc_byte_order!(
2747 prop_uint128_16,
2748 Wi128<u128>,
2749 16,
2750 16,
2751 read_uint128,
2752 write_uint128
2753 );
2754
2755 qc_byte_order!(
2756 prop_int_1,
2757 i64,
2758 calc_max!(super::I64_MAX, 1),
2759 1,
2760 read_int,
2761 write_int
2762 );
2763 qc_byte_order!(
2764 prop_int_2,
2765 i64,
2766 calc_max!(super::I64_MAX, 2),
2767 2,
2768 read_int,
2769 write_int
2770 );
2771 qc_byte_order!(
2772 prop_int_3,
2773 i64,
2774 calc_max!(super::I64_MAX, 3),
2775 3,
2776 read_int,
2777 write_int
2778 );
2779 qc_byte_order!(
2780 prop_int_4,
2781 i64,
2782 calc_max!(super::I64_MAX, 4),
2783 4,
2784 read_int,
2785 write_int
2786 );
2787 qc_byte_order!(
2788 prop_int_5,
2789 i64,
2790 calc_max!(super::I64_MAX, 5),
2791 5,
2792 read_int,
2793 write_int
2794 );
2795 qc_byte_order!(
2796 prop_int_6,
2797 i64,
2798 calc_max!(super::I64_MAX, 6),
2799 6,
2800 read_int,
2801 write_int
2802 );
2803 qc_byte_order!(
2804 prop_int_7,
2805 i64,
2806 calc_max!(super::I64_MAX, 7),
2807 7,
2808 read_int,
2809 write_int
2810 );
2811 qc_byte_order!(
2812 prop_int_8,
2813 i64,
2814 calc_max!(super::I64_MAX, 8),
2815 8,
2816 read_int,
2817 write_int
2818 );
2819
2820 qc_byte_order!(
2821 prop_int128_1,
2822 Wi128<i128>,
2823 1,
2824 1,
2825 read_int128,
2826 write_int128
2827 );
2828 qc_byte_order!(
2829 prop_int128_2,
2830 Wi128<i128>,
2831 2,
2832 2,
2833 read_int128,
2834 write_int128
2835 );
2836 qc_byte_order!(
2837 prop_int128_3,
2838 Wi128<i128>,
2839 3,
2840 3,
2841 read_int128,
2842 write_int128
2843 );
2844 qc_byte_order!(
2845 prop_int128_4,
2846 Wi128<i128>,
2847 4,
2848 4,
2849 read_int128,
2850 write_int128
2851 );
2852 qc_byte_order!(
2853 prop_int128_5,
2854 Wi128<i128>,
2855 5,
2856 5,
2857 read_int128,
2858 write_int128
2859 );
2860 qc_byte_order!(
2861 prop_int128_6,
2862 Wi128<i128>,
2863 6,
2864 6,
2865 read_int128,
2866 write_int128
2867 );
2868 qc_byte_order!(
2869 prop_int128_7,
2870 Wi128<i128>,
2871 7,
2872 7,
2873 read_int128,
2874 write_int128
2875 );
2876 qc_byte_order!(
2877 prop_int128_8,
2878 Wi128<i128>,
2879 8,
2880 8,
2881 read_int128,
2882 write_int128
2883 );
2884 qc_byte_order!(
2885 prop_int128_9,
2886 Wi128<i128>,
2887 9,
2888 9,
2889 read_int128,
2890 write_int128
2891 );
2892 qc_byte_order!(
2893 prop_int128_10,
2894 Wi128<i128>,
2895 10,
2896 10,
2897 read_int128,
2898 write_int128
2899 );
2900 qc_byte_order!(
2901 prop_int128_11,
2902 Wi128<i128>,
2903 11,
2904 11,
2905 read_int128,
2906 write_int128
2907 );
2908 qc_byte_order!(
2909 prop_int128_12,
2910 Wi128<i128>,
2911 12,
2912 12,
2913 read_int128,
2914 write_int128
2915 );
2916 qc_byte_order!(
2917 prop_int128_13,
2918 Wi128<i128>,
2919 13,
2920 13,
2921 read_int128,
2922 write_int128
2923 );
2924 qc_byte_order!(
2925 prop_int128_14,
2926 Wi128<i128>,
2927 14,
2928 14,
2929 read_int128,
2930 write_int128
2931 );
2932 qc_byte_order!(
2933 prop_int128_15,
2934 Wi128<i128>,
2935 15,
2936 15,
2937 read_int128,
2938 write_int128
2939 );
2940 qc_byte_order!(
2941 prop_int128_16,
2942 Wi128<i128>,
2943 16,
2944 16,
2945 read_int128,
2946 write_int128
2947 );
2948
2949 // Test that all of the byte conversion functions panic when given a
2950 // buffer that is too small.
2951 //
2952 // These tests are critical to ensure safety, otherwise we might end up
2953 // with a buffer overflow.
2954 macro_rules! too_small {
2955 ($name:ident, $maximally_small:expr, $zero:expr,
2956 $read:ident, $write:ident) => {
2957 mod $name {
2958 use crate::{
2959 BigEndian, ByteOrder, LittleEndian, NativeEndian,
2960 };
2961
2962 #[test]
2963 #[should_panic]
2964 fn read_big_endian() {
2965 let buf = [0; $maximally_small];
2966 BigEndian::$read(&buf);
2967 }
2968
2969 #[test]
2970 #[should_panic]
2971 fn read_little_endian() {
2972 let buf = [0; $maximally_small];
2973 LittleEndian::$read(&buf);
2974 }
2975
2976 #[test]
2977 #[should_panic]
2978 fn read_native_endian() {
2979 let buf = [0; $maximally_small];
2980 NativeEndian::$read(&buf);
2981 }
2982
2983 #[test]
2984 #[should_panic]
2985 fn write_big_endian() {
2986 let mut buf = [0; $maximally_small];
2987 BigEndian::$write(&mut buf, $zero);
2988 }
2989
2990 #[test]
2991 #[should_panic]
2992 fn write_little_endian() {
2993 let mut buf = [0; $maximally_small];
2994 LittleEndian::$write(&mut buf, $zero);
2995 }
2996
2997 #[test]
2998 #[should_panic]
2999 fn write_native_endian() {
3000 let mut buf = [0; $maximally_small];
3001 NativeEndian::$write(&mut buf, $zero);
3002 }
3003 }
3004 };
3005 ($name:ident, $maximally_small:expr, $read:ident) => {
3006 mod $name {
3007 use crate::{
3008 BigEndian, ByteOrder, LittleEndian, NativeEndian,
3009 };
3010
3011 #[test]
3012 #[should_panic]
3013 fn read_big_endian() {
3014 let buf = [0; $maximally_small];
3015 BigEndian::$read(&buf, $maximally_small + 1);
3016 }
3017
3018 #[test]
3019 #[should_panic]
3020 fn read_little_endian() {
3021 let buf = [0; $maximally_small];
3022 LittleEndian::$read(&buf, $maximally_small + 1);
3023 }
3024
3025 #[test]
3026 #[should_panic]
3027 fn read_native_endian() {
3028 let buf = [0; $maximally_small];
3029 NativeEndian::$read(&buf, $maximally_small + 1);
3030 }
3031 }
3032 };
3033 }
3034
3035 too_small!(small_u16, 1, 0, read_u16, write_u16);
3036 too_small!(small_i16, 1, 0, read_i16, write_i16);
3037 too_small!(small_u32, 3, 0, read_u32, write_u32);
3038 too_small!(small_i32, 3, 0, read_i32, write_i32);
3039 too_small!(small_u64, 7, 0, read_u64, write_u64);
3040 too_small!(small_i64, 7, 0, read_i64, write_i64);
3041 too_small!(small_f32, 3, 0.0, read_f32, write_f32);
3042 too_small!(small_f64, 7, 0.0, read_f64, write_f64);
3043 too_small!(small_u128, 15, 0, read_u128, write_u128);
3044 too_small!(small_i128, 15, 0, read_i128, write_i128);
3045
3046 too_small!(small_uint_1, 1, read_uint);
3047 too_small!(small_uint_2, 2, read_uint);
3048 too_small!(small_uint_3, 3, read_uint);
3049 too_small!(small_uint_4, 4, read_uint);
3050 too_small!(small_uint_5, 5, read_uint);
3051 too_small!(small_uint_6, 6, read_uint);
3052 too_small!(small_uint_7, 7, read_uint);
3053
3054 too_small!(small_uint128_1, 1, read_uint128);
3055 too_small!(small_uint128_2, 2, read_uint128);
3056 too_small!(small_uint128_3, 3, read_uint128);
3057 too_small!(small_uint128_4, 4, read_uint128);
3058 too_small!(small_uint128_5, 5, read_uint128);
3059 too_small!(small_uint128_6, 6, read_uint128);
3060 too_small!(small_uint128_7, 7, read_uint128);
3061 too_small!(small_uint128_8, 8, read_uint128);
3062 too_small!(small_uint128_9, 9, read_uint128);
3063 too_small!(small_uint128_10, 10, read_uint128);
3064 too_small!(small_uint128_11, 11, read_uint128);
3065 too_small!(small_uint128_12, 12, read_uint128);
3066 too_small!(small_uint128_13, 13, read_uint128);
3067 too_small!(small_uint128_14, 14, read_uint128);
3068 too_small!(small_uint128_15, 15, read_uint128);
3069
3070 too_small!(small_int_1, 1, read_int);
3071 too_small!(small_int_2, 2, read_int);
3072 too_small!(small_int_3, 3, read_int);
3073 too_small!(small_int_4, 4, read_int);
3074 too_small!(small_int_5, 5, read_int);
3075 too_small!(small_int_6, 6, read_int);
3076 too_small!(small_int_7, 7, read_int);
3077
3078 too_small!(small_int128_1, 1, read_int128);
3079 too_small!(small_int128_2, 2, read_int128);
3080 too_small!(small_int128_3, 3, read_int128);
3081 too_small!(small_int128_4, 4, read_int128);
3082 too_small!(small_int128_5, 5, read_int128);
3083 too_small!(small_int128_6, 6, read_int128);
3084 too_small!(small_int128_7, 7, read_int128);
3085 too_small!(small_int128_8, 8, read_int128);
3086 too_small!(small_int128_9, 9, read_int128);
3087 too_small!(small_int128_10, 10, read_int128);
3088 too_small!(small_int128_11, 11, read_int128);
3089 too_small!(small_int128_12, 12, read_int128);
3090 too_small!(small_int128_13, 13, read_int128);
3091 too_small!(small_int128_14, 14, read_int128);
3092 too_small!(small_int128_15, 15, read_int128);
3093
3094 // Test that reading/writing slices enforces the correct lengths.
3095 macro_rules! slice_lengths {
3096 ($name:ident, $read:ident, $write:ident,
3097 $num_bytes:expr, $numbers:expr) => {
3098 mod $name {
3099 use crate::{
3100 BigEndian, ByteOrder, LittleEndian, NativeEndian,
3101 };
3102
3103 #[test]
3104 #[should_panic]
3105 fn read_big_endian() {
3106 let bytes = [0; $num_bytes];
3107 let mut numbers = $numbers;
3108 BigEndian::$read(&bytes, &mut numbers);
3109 }
3110
3111 #[test]
3112 #[should_panic]
3113 fn read_little_endian() {
3114 let bytes = [0; $num_bytes];
3115 let mut numbers = $numbers;
3116 LittleEndian::$read(&bytes, &mut numbers);
3117 }
3118
3119 #[test]
3120 #[should_panic]
3121 fn read_native_endian() {
3122 let bytes = [0; $num_bytes];
3123 let mut numbers = $numbers;
3124 NativeEndian::$read(&bytes, &mut numbers);
3125 }
3126
3127 #[test]
3128 #[should_panic]
3129 fn write_big_endian() {
3130 let mut bytes = [0; $num_bytes];
3131 let numbers = $numbers;
3132 BigEndian::$write(&numbers, &mut bytes);
3133 }
3134
3135 #[test]
3136 #[should_panic]
3137 fn write_little_endian() {
3138 let mut bytes = [0; $num_bytes];
3139 let numbers = $numbers;
3140 LittleEndian::$write(&numbers, &mut bytes);
3141 }
3142
3143 #[test]
3144 #[should_panic]
3145 fn write_native_endian() {
3146 let mut bytes = [0; $num_bytes];
3147 let numbers = $numbers;
3148 NativeEndian::$write(&numbers, &mut bytes);
3149 }
3150 }
3151 };
3152 }
3153
3154 slice_lengths!(
3155 slice_len_too_small_u16,
3156 read_u16_into,
3157 write_u16_into,
3158 3,
3159 [0, 0]
3160 );
3161 slice_lengths!(
3162 slice_len_too_big_u16,
3163 read_u16_into,
3164 write_u16_into,
3165 5,
3166 [0, 0]
3167 );
3168 slice_lengths!(
3169 slice_len_too_small_i16,
3170 read_i16_into,
3171 write_i16_into,
3172 3,
3173 [0, 0]
3174 );
3175 slice_lengths!(
3176 slice_len_too_big_i16,
3177 read_i16_into,
3178 write_i16_into,
3179 5,
3180 [0, 0]
3181 );
3182
3183 slice_lengths!(
3184 slice_len_too_small_u32,
3185 read_u32_into,
3186 write_u32_into,
3187 7,
3188 [0, 0]
3189 );
3190 slice_lengths!(
3191 slice_len_too_big_u32,
3192 read_u32_into,
3193 write_u32_into,
3194 9,
3195 [0, 0]
3196 );
3197 slice_lengths!(
3198 slice_len_too_small_i32,
3199 read_i32_into,
3200 write_i32_into,
3201 7,
3202 [0, 0]
3203 );
3204 slice_lengths!(
3205 slice_len_too_big_i32,
3206 read_i32_into,
3207 write_i32_into,
3208 9,
3209 [0, 0]
3210 );
3211
3212 slice_lengths!(
3213 slice_len_too_small_u64,
3214 read_u64_into,
3215 write_u64_into,
3216 15,
3217 [0, 0]
3218 );
3219 slice_lengths!(
3220 slice_len_too_big_u64,
3221 read_u64_into,
3222 write_u64_into,
3223 17,
3224 [0, 0]
3225 );
3226 slice_lengths!(
3227 slice_len_too_small_i64,
3228 read_i64_into,
3229 write_i64_into,
3230 15,
3231 [0, 0]
3232 );
3233 slice_lengths!(
3234 slice_len_too_big_i64,
3235 read_i64_into,
3236 write_i64_into,
3237 17,
3238 [0, 0]
3239 );
3240
3241 slice_lengths!(
3242 slice_len_too_small_u128,
3243 read_u128_into,
3244 write_u128_into,
3245 31,
3246 [0, 0]
3247 );
3248 slice_lengths!(
3249 slice_len_too_big_u128,
3250 read_u128_into,
3251 write_u128_into,
3252 33,
3253 [0, 0]
3254 );
3255 slice_lengths!(
3256 slice_len_too_small_i128,
3257 read_i128_into,
3258 write_i128_into,
3259 31,
3260 [0, 0]
3261 );
3262 slice_lengths!(
3263 slice_len_too_big_i128,
3264 read_i128_into,
3265 write_i128_into,
3266 33,
3267 [0, 0]
3268 );
3269
3270 #[test]
3271 fn uint_bigger_buffer() {
3272 use crate::{ByteOrder, LittleEndian};
3273 let n = LittleEndian::read_uint(&[1, 2, 3, 4, 5, 6, 7, 8], 5);
3274 assert_eq!(n, 0x05_0403_0201);
3275 }
3276
3277 #[test]
3278 fn regression173_array_impl() {
3279 use crate::{BigEndian, ByteOrder, LittleEndian};
3280
3281 let xs = [0; 100];
3282
3283 let x = BigEndian::read_u16(&xs);
3284 assert_eq!(x, 0);
3285 let x = BigEndian::read_u32(&xs);
3286 assert_eq!(x, 0);
3287 let x = BigEndian::read_u64(&xs);
3288 assert_eq!(x, 0);
3289 let x = BigEndian::read_u128(&xs);
3290 assert_eq!(x, 0);
3291 let x = BigEndian::read_i16(&xs);
3292 assert_eq!(x, 0);
3293 let x = BigEndian::read_i32(&xs);
3294 assert_eq!(x, 0);
3295 let x = BigEndian::read_i64(&xs);
3296 assert_eq!(x, 0);
3297 let x = BigEndian::read_i128(&xs);
3298 assert_eq!(x, 0);
3299
3300 let x = LittleEndian::read_u16(&xs);
3301 assert_eq!(x, 0);
3302 let x = LittleEndian::read_u32(&xs);
3303 assert_eq!(x, 0);
3304 let x = LittleEndian::read_u64(&xs);
3305 assert_eq!(x, 0);
3306 let x = LittleEndian::read_u128(&xs);
3307 assert_eq!(x, 0);
3308 let x = LittleEndian::read_i16(&xs);
3309 assert_eq!(x, 0);
3310 let x = LittleEndian::read_i32(&xs);
3311 assert_eq!(x, 0);
3312 let x = LittleEndian::read_i64(&xs);
3313 assert_eq!(x, 0);
3314 let x = LittleEndian::read_i128(&xs);
3315 assert_eq!(x, 0);
3316 }
3317}
3318
3319#[cfg(test)]
3320#[cfg(feature = "std")]
3321mod stdtests {
3322 extern crate quickcheck;
3323 extern crate rand;
3324
3325 use self::quickcheck::{QuickCheck, StdGen, Testable};
3326 use self::rand::thread_rng;
3327
3328 fn qc_unsized<A: Testable>(f: A) {
3329 QuickCheck::new()
3330 .gen(StdGen::new(thread_rng(), 16))
3331 .tests(1_00)
3332 .max_tests(10_000)
3333 .quickcheck(f);
3334 }
3335
3336 macro_rules! calc_max {
3337 ($max:expr, $bytes:expr) => {
3338 ($max - 1) >> (8 * (8 - $bytes))
3339 };
3340 }
3341
3342 macro_rules! qc_bytes_ext {
3343 ($name:ident, $ty_int:ty, $max:expr,
3344 $bytes:expr, $read:ident, $write:ident) => {
3345 #[cfg(not(miri))]
3346 mod $name {
3347 #[allow(unused_imports)]
3348 use crate::test::{qc_sized, Wi128};
3349 use crate::{
3350 BigEndian, LittleEndian, NativeEndian, ReadBytesExt,
3351 WriteBytesExt,
3352 };
3353 use std::io::Cursor;
3354
3355 #[test]
3356 fn big_endian() {
3357 fn prop(n: $ty_int) -> bool {
3358 let mut wtr = vec![];
3359 wtr.$write::<BigEndian>(n.clone()).unwrap();
3360 let offset = wtr.len() - $bytes;
3361 let mut rdr = Cursor::new(&mut wtr[offset..]);
3362 n == rdr.$read::<BigEndian>($bytes).unwrap()
3363 }
3364 qc_sized(prop as fn($ty_int) -> bool, $max);
3365 }
3366
3367 #[test]
3368 fn little_endian() {
3369 fn prop(n: $ty_int) -> bool {
3370 let mut wtr = vec![];
3371 wtr.$write::<LittleEndian>(n.clone()).unwrap();
3372 let mut rdr = Cursor::new(wtr);
3373 n == rdr.$read::<LittleEndian>($bytes).unwrap()
3374 }
3375 qc_sized(prop as fn($ty_int) -> bool, $max);
3376 }
3377
3378 #[test]
3379 fn native_endian() {
3380 fn prop(n: $ty_int) -> bool {
3381 let mut wtr = vec![];
3382 wtr.$write::<NativeEndian>(n.clone()).unwrap();
3383 let offset = if cfg!(target_endian = "big") {
3384 wtr.len() - $bytes
3385 } else {
3386 0
3387 };
3388 let mut rdr = Cursor::new(&mut wtr[offset..]);
3389 n == rdr.$read::<NativeEndian>($bytes).unwrap()
3390 }
3391 qc_sized(prop as fn($ty_int) -> bool, $max);
3392 }
3393 }
3394 };
3395 ($name:ident, $ty_int:ty, $max:expr, $read:ident, $write:ident) => {
3396 #[cfg(not(miri))]
3397 mod $name {
3398 #[allow(unused_imports)]
3399 use crate::test::{qc_sized, Wi128};
3400 use crate::{
3401 BigEndian, LittleEndian, NativeEndian, ReadBytesExt,
3402 WriteBytesExt,
3403 };
3404 use std::io::Cursor;
3405
3406 #[test]
3407 fn big_endian() {
3408 fn prop(n: $ty_int) -> bool {
3409 let mut wtr = vec![];
3410 wtr.$write::<BigEndian>(n.clone()).unwrap();
3411 let mut rdr = Cursor::new(wtr);
3412 n == rdr.$read::<BigEndian>().unwrap()
3413 }
3414 qc_sized(prop as fn($ty_int) -> bool, $max - 1);
3415 }
3416
3417 #[test]
3418 fn little_endian() {
3419 fn prop(n: $ty_int) -> bool {
3420 let mut wtr = vec![];
3421 wtr.$write::<LittleEndian>(n.clone()).unwrap();
3422 let mut rdr = Cursor::new(wtr);
3423 n == rdr.$read::<LittleEndian>().unwrap()
3424 }
3425 qc_sized(prop as fn($ty_int) -> bool, $max - 1);
3426 }
3427
3428 #[test]
3429 fn native_endian() {
3430 fn prop(n: $ty_int) -> bool {
3431 let mut wtr = vec![];
3432 wtr.$write::<NativeEndian>(n.clone()).unwrap();
3433 let mut rdr = Cursor::new(wtr);
3434 n == rdr.$read::<NativeEndian>().unwrap()
3435 }
3436 qc_sized(prop as fn($ty_int) -> bool, $max - 1);
3437 }
3438 }
3439 };
3440 }
3441
3442 qc_bytes_ext!(
3443 prop_ext_u16,
3444 u16,
3445 ::std::u16::MAX as u64,
3446 read_u16,
3447 write_u16
3448 );
3449 qc_bytes_ext!(
3450 prop_ext_i16,
3451 i16,
3452 ::std::i16::MAX as u64,
3453 read_i16,
3454 write_i16
3455 );
3456 qc_bytes_ext!(
3457 prop_ext_u32,
3458 u32,
3459 ::std::u32::MAX as u64,
3460 read_u32,
3461 write_u32
3462 );
3463 qc_bytes_ext!(
3464 prop_ext_i32,
3465 i32,
3466 ::std::i32::MAX as u64,
3467 read_i32,
3468 write_i32
3469 );
3470 qc_bytes_ext!(
3471 prop_ext_u64,
3472 u64,
3473 ::std::u64::MAX as u64,
3474 read_u64,
3475 write_u64
3476 );
3477 qc_bytes_ext!(
3478 prop_ext_i64,
3479 i64,
3480 ::std::i64::MAX as u64,
3481 read_i64,
3482 write_i64
3483 );
3484 qc_bytes_ext!(
3485 prop_ext_f32,
3486 f32,
3487 ::std::u64::MAX as u64,
3488 read_f32,
3489 write_f32
3490 );
3491 qc_bytes_ext!(
3492 prop_ext_f64,
3493 f64,
3494 ::std::i64::MAX as u64,
3495 read_f64,
3496 write_f64
3497 );
3498
3499 qc_bytes_ext!(prop_ext_u128, Wi128<u128>, 16 + 1, read_u128, write_u128);
3500 qc_bytes_ext!(prop_ext_i128, Wi128<i128>, 16 + 1, read_i128, write_i128);
3501
3502 qc_bytes_ext!(
3503 prop_ext_uint_1,
3504 u64,
3505 calc_max!(crate::test::U64_MAX, 1),
3506 1,
3507 read_uint,
3508 write_u64
3509 );
3510 qc_bytes_ext!(
3511 prop_ext_uint_2,
3512 u64,
3513 calc_max!(crate::test::U64_MAX, 2),
3514 2,
3515 read_uint,
3516 write_u64
3517 );
3518 qc_bytes_ext!(
3519 prop_ext_uint_3,
3520 u64,
3521 calc_max!(crate::test::U64_MAX, 3),
3522 3,
3523 read_uint,
3524 write_u64
3525 );
3526 qc_bytes_ext!(
3527 prop_ext_uint_4,
3528 u64,
3529 calc_max!(crate::test::U64_MAX, 4),
3530 4,
3531 read_uint,
3532 write_u64
3533 );
3534 qc_bytes_ext!(
3535 prop_ext_uint_5,
3536 u64,
3537 calc_max!(crate::test::U64_MAX, 5),
3538 5,
3539 read_uint,
3540 write_u64
3541 );
3542 qc_bytes_ext!(
3543 prop_ext_uint_6,
3544 u64,
3545 calc_max!(crate::test::U64_MAX, 6),
3546 6,
3547 read_uint,
3548 write_u64
3549 );
3550 qc_bytes_ext!(
3551 prop_ext_uint_7,
3552 u64,
3553 calc_max!(crate::test::U64_MAX, 7),
3554 7,
3555 read_uint,
3556 write_u64
3557 );
3558 qc_bytes_ext!(
3559 prop_ext_uint_8,
3560 u64,
3561 calc_max!(crate::test::U64_MAX, 8),
3562 8,
3563 read_uint,
3564 write_u64
3565 );
3566
3567 qc_bytes_ext!(
3568 prop_ext_uint128_1,
3569 Wi128<u128>,
3570 1,
3571 1,
3572 read_uint128,
3573 write_u128
3574 );
3575 qc_bytes_ext!(
3576 prop_ext_uint128_2,
3577 Wi128<u128>,
3578 2,
3579 2,
3580 read_uint128,
3581 write_u128
3582 );
3583 qc_bytes_ext!(
3584 prop_ext_uint128_3,
3585 Wi128<u128>,
3586 3,
3587 3,
3588 read_uint128,
3589 write_u128
3590 );
3591 qc_bytes_ext!(
3592 prop_ext_uint128_4,
3593 Wi128<u128>,
3594 4,
3595 4,
3596 read_uint128,
3597 write_u128
3598 );
3599 qc_bytes_ext!(
3600 prop_ext_uint128_5,
3601 Wi128<u128>,
3602 5,
3603 5,
3604 read_uint128,
3605 write_u128
3606 );
3607 qc_bytes_ext!(
3608 prop_ext_uint128_6,
3609 Wi128<u128>,
3610 6,
3611 6,
3612 read_uint128,
3613 write_u128
3614 );
3615 qc_bytes_ext!(
3616 prop_ext_uint128_7,
3617 Wi128<u128>,
3618 7,
3619 7,
3620 read_uint128,
3621 write_u128
3622 );
3623 qc_bytes_ext!(
3624 prop_ext_uint128_8,
3625 Wi128<u128>,
3626 8,
3627 8,
3628 read_uint128,
3629 write_u128
3630 );
3631 qc_bytes_ext!(
3632 prop_ext_uint128_9,
3633 Wi128<u128>,
3634 9,
3635 9,
3636 read_uint128,
3637 write_u128
3638 );
3639 qc_bytes_ext!(
3640 prop_ext_uint128_10,
3641 Wi128<u128>,
3642 10,
3643 10,
3644 read_uint128,
3645 write_u128
3646 );
3647 qc_bytes_ext!(
3648 prop_ext_uint128_11,
3649 Wi128<u128>,
3650 11,
3651 11,
3652 read_uint128,
3653 write_u128
3654 );
3655 qc_bytes_ext!(
3656 prop_ext_uint128_12,
3657 Wi128<u128>,
3658 12,
3659 12,
3660 read_uint128,
3661 write_u128
3662 );
3663 qc_bytes_ext!(
3664 prop_ext_uint128_13,
3665 Wi128<u128>,
3666 13,
3667 13,
3668 read_uint128,
3669 write_u128
3670 );
3671 qc_bytes_ext!(
3672 prop_ext_uint128_14,
3673 Wi128<u128>,
3674 14,
3675 14,
3676 read_uint128,
3677 write_u128
3678 );
3679 qc_bytes_ext!(
3680 prop_ext_uint128_15,
3681 Wi128<u128>,
3682 15,
3683 15,
3684 read_uint128,
3685 write_u128
3686 );
3687 qc_bytes_ext!(
3688 prop_ext_uint128_16,
3689 Wi128<u128>,
3690 16,
3691 16,
3692 read_uint128,
3693 write_u128
3694 );
3695
3696 qc_bytes_ext!(
3697 prop_ext_int_1,
3698 i64,
3699 calc_max!(crate::test::I64_MAX, 1),
3700 1,
3701 read_int,
3702 write_i64
3703 );
3704 qc_bytes_ext!(
3705 prop_ext_int_2,
3706 i64,
3707 calc_max!(crate::test::I64_MAX, 2),
3708 2,
3709 read_int,
3710 write_i64
3711 );
3712 qc_bytes_ext!(
3713 prop_ext_int_3,
3714 i64,
3715 calc_max!(crate::test::I64_MAX, 3),
3716 3,
3717 read_int,
3718 write_i64
3719 );
3720 qc_bytes_ext!(
3721 prop_ext_int_4,
3722 i64,
3723 calc_max!(crate::test::I64_MAX, 4),
3724 4,
3725 read_int,
3726 write_i64
3727 );
3728 qc_bytes_ext!(
3729 prop_ext_int_5,
3730 i64,
3731 calc_max!(crate::test::I64_MAX, 5),
3732 5,
3733 read_int,
3734 write_i64
3735 );
3736 qc_bytes_ext!(
3737 prop_ext_int_6,
3738 i64,
3739 calc_max!(crate::test::I64_MAX, 6),
3740 6,
3741 read_int,
3742 write_i64
3743 );
3744 qc_bytes_ext!(
3745 prop_ext_int_7,
3746 i64,
3747 calc_max!(crate::test::I64_MAX, 1),
3748 7,
3749 read_int,
3750 write_i64
3751 );
3752 qc_bytes_ext!(
3753 prop_ext_int_8,
3754 i64,
3755 calc_max!(crate::test::I64_MAX, 8),
3756 8,
3757 read_int,
3758 write_i64
3759 );
3760
3761 qc_bytes_ext!(
3762 prop_ext_int128_1,
3763 Wi128<i128>,
3764 1,
3765 1,
3766 read_int128,
3767 write_i128
3768 );
3769 qc_bytes_ext!(
3770 prop_ext_int128_2,
3771 Wi128<i128>,
3772 2,
3773 2,
3774 read_int128,
3775 write_i128
3776 );
3777 qc_bytes_ext!(
3778 prop_ext_int128_3,
3779 Wi128<i128>,
3780 3,
3781 3,
3782 read_int128,
3783 write_i128
3784 );
3785 qc_bytes_ext!(
3786 prop_ext_int128_4,
3787 Wi128<i128>,
3788 4,
3789 4,
3790 read_int128,
3791 write_i128
3792 );
3793 qc_bytes_ext!(
3794 prop_ext_int128_5,
3795 Wi128<i128>,
3796 5,
3797 5,
3798 read_int128,
3799 write_i128
3800 );
3801 qc_bytes_ext!(
3802 prop_ext_int128_6,
3803 Wi128<i128>,
3804 6,
3805 6,
3806 read_int128,
3807 write_i128
3808 );
3809 qc_bytes_ext!(
3810 prop_ext_int128_7,
3811 Wi128<i128>,
3812 7,
3813 7,
3814 read_int128,
3815 write_i128
3816 );
3817 qc_bytes_ext!(
3818 prop_ext_int128_8,
3819 Wi128<i128>,
3820 8,
3821 8,
3822 read_int128,
3823 write_i128
3824 );
3825 qc_bytes_ext!(
3826 prop_ext_int128_9,
3827 Wi128<i128>,
3828 9,
3829 9,
3830 read_int128,
3831 write_i128
3832 );
3833 qc_bytes_ext!(
3834 prop_ext_int128_10,
3835 Wi128<i128>,
3836 10,
3837 10,
3838 read_int128,
3839 write_i128
3840 );
3841 qc_bytes_ext!(
3842 prop_ext_int128_11,
3843 Wi128<i128>,
3844 11,
3845 11,
3846 read_int128,
3847 write_i128
3848 );
3849 qc_bytes_ext!(
3850 prop_ext_int128_12,
3851 Wi128<i128>,
3852 12,
3853 12,
3854 read_int128,
3855 write_i128
3856 );
3857 qc_bytes_ext!(
3858 prop_ext_int128_13,
3859 Wi128<i128>,
3860 13,
3861 13,
3862 read_int128,
3863 write_i128
3864 );
3865 qc_bytes_ext!(
3866 prop_ext_int128_14,
3867 Wi128<i128>,
3868 14,
3869 14,
3870 read_int128,
3871 write_i128
3872 );
3873 qc_bytes_ext!(
3874 prop_ext_int128_15,
3875 Wi128<i128>,
3876 15,
3877 15,
3878 read_int128,
3879 write_i128
3880 );
3881 qc_bytes_ext!(
3882 prop_ext_int128_16,
3883 Wi128<i128>,
3884 16,
3885 16,
3886 read_int128,
3887 write_i128
3888 );
3889
3890 // Test slice serialization/deserialization.
3891 macro_rules! qc_slice {
3892 ($name:ident, $ty_int:ty, $read:ident, $write:ident, $zero:expr) => {
3893 #[cfg(not(miri))]
3894 mod $name {
3895 use super::qc_unsized;
3896 #[allow(unused_imports)]
3897 use crate::test::Wi128;
3898 use crate::{
3899 BigEndian, ByteOrder, LittleEndian, NativeEndian,
3900 };
3901 use core::mem::size_of;
3902
3903 #[test]
3904 fn big_endian() {
3905 fn prop(numbers: Vec<$ty_int>) -> bool {
3906 let numbers: Vec<_> =
3907 numbers.into_iter().map(|x| x.clone()).collect();
3908 let num_bytes = size_of::<$ty_int>() * numbers.len();
3909 let mut bytes = vec![0; num_bytes];
3910
3911 BigEndian::$write(&numbers, &mut bytes);
3912
3913 let mut got = vec![$zero; numbers.len()];
3914 BigEndian::$read(&bytes, &mut got);
3915
3916 numbers == got
3917 }
3918 qc_unsized(prop as fn(_) -> bool);
3919 }
3920
3921 #[test]
3922 fn little_endian() {
3923 fn prop(numbers: Vec<$ty_int>) -> bool {
3924 let numbers: Vec<_> =
3925 numbers.into_iter().map(|x| x.clone()).collect();
3926 let num_bytes = size_of::<$ty_int>() * numbers.len();
3927 let mut bytes = vec![0; num_bytes];
3928
3929 LittleEndian::$write(&numbers, &mut bytes);
3930
3931 let mut got = vec![$zero; numbers.len()];
3932 LittleEndian::$read(&bytes, &mut got);
3933
3934 numbers == got
3935 }
3936 qc_unsized(prop as fn(_) -> bool);
3937 }
3938
3939 #[test]
3940 fn native_endian() {
3941 fn prop(numbers: Vec<$ty_int>) -> bool {
3942 let numbers: Vec<_> =
3943 numbers.into_iter().map(|x| x.clone()).collect();
3944 let num_bytes = size_of::<$ty_int>() * numbers.len();
3945 let mut bytes = vec![0; num_bytes];
3946
3947 NativeEndian::$write(&numbers, &mut bytes);
3948
3949 let mut got = vec![$zero; numbers.len()];
3950 NativeEndian::$read(&bytes, &mut got);
3951
3952 numbers == got
3953 }
3954 qc_unsized(prop as fn(_) -> bool);
3955 }
3956 }
3957 };
3958 }
3959
3960 qc_slice!(prop_slice_u16, u16, read_u16_into, write_u16_into, 0);
3961 qc_slice!(prop_slice_i16, i16, read_i16_into, write_i16_into, 0);
3962 qc_slice!(prop_slice_u32, u32, read_u32_into, write_u32_into, 0);
3963 qc_slice!(prop_slice_i32, i32, read_i32_into, write_i32_into, 0);
3964 qc_slice!(prop_slice_u64, u64, read_u64_into, write_u64_into, 0);
3965 qc_slice!(prop_slice_i64, i64, read_i64_into, write_i64_into, 0);
3966 qc_slice!(
3967 prop_slice_u128,
3968 Wi128<u128>,
3969 read_u128_into,
3970 write_u128_into,
3971 0
3972 );
3973 qc_slice!(
3974 prop_slice_i128,
3975 Wi128<i128>,
3976 read_i128_into,
3977 write_i128_into,
3978 0
3979 );
3980
3981 qc_slice!(prop_slice_f32, f32, read_f32_into, write_f32_into, 0.0);
3982 qc_slice!(prop_slice_f64, f64, read_f64_into, write_f64_into, 0.0);
3983}