Coverage Report

Created: 2025-07-01 06:46

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