bytecodec/
fixnum.rs

1//! Encoders and decoders for numbers which have fixed length binary representation.
2use crate::bytes::{BytesEncoder, CopyableBytesDecoder};
3use crate::{ByteCount, Decode, Encode, Eos, ErrorKind, Result, SizedEncode};
4use byteorder::{BigEndian, ByteOrder, LittleEndian};
5
6macro_rules! impl_decode {
7    ($ty:ty, $item:ty) => {
8        impl Decode for $ty {
9            type Item = $item;
10
11            fn decode(&mut self, buf: &[u8], eos: Eos) -> Result<usize> {
12                track!(self.0.decode(buf, eos))
13            }
14
15            fn finish_decoding(&mut self) -> Result<Self::Item> {
16                track!(self.0.finish_decoding()).map(Self::decode_item)
17            }
18
19            fn requiring_bytes(&self) -> ByteCount {
20                self.0.requiring_bytes()
21            }
22
23            fn is_idle(&self) -> bool {
24                self.0.is_idle()
25            }
26        }
27    };
28}
29
30macro_rules! impl_encode {
31    ($ty:ty, $item:ty) => {
32        impl Encode for $ty {
33            type Item = $item;
34
35            fn encode(&mut self, buf: &mut [u8], eos: Eos) -> Result<usize> {
36                track!(self.0.encode(buf, eos))
37            }
38
39            fn start_encoding(&mut self, item: Self::Item) -> Result<()> {
40                let mut b = Default::default();
41                track!(Self::encode_item(item, &mut b))?;
42                track!(self.0.start_encoding(b))
43            }
44
45            fn requiring_bytes(&self) -> ByteCount {
46                self.0.requiring_bytes()
47            }
48
49            fn is_idle(&self) -> bool {
50                self.0.is_idle()
51            }
52        }
53        impl SizedEncode for $ty {
54            fn exact_requiring_bytes(&self) -> u64 {
55                self.0.exact_requiring_bytes()
56            }
57        }
58    };
59}
60
61/// Decoder which decodes `u8` values.
62///
63/// # Examples
64///
65/// ```
66/// use bytecodec::Decode;
67/// use bytecodec::fixnum::U8Decoder;
68/// use bytecodec::io::IoDecodeExt;
69///
70/// let mut decoder = U8Decoder::new();
71/// let item = decoder.decode_exact([7].as_ref()).unwrap();
72/// assert_eq!(item, 7);
73/// ```
74#[derive(Debug, Default)]
75pub struct U8Decoder(CopyableBytesDecoder<[u8; 1]>);
76impl U8Decoder {
77    /// Makes a new `U8Decoder` instance.
78    pub fn new() -> Self {
79        Self::default()
80    }
81
82    fn decode_item(b: [u8; 1]) -> u8 {
83        b[0]
84    }
85}
86impl_decode!(U8Decoder, u8);
87
88/// Encoder which encodes `u8` values.
89///
90/// # Examples
91///
92/// ```
93/// use bytecodec::EncodeExt;
94/// use bytecodec::fixnum::U8Encoder;
95/// use bytecodec::io::IoEncodeExt;
96///
97/// let mut output = Vec::new();
98/// let mut encoder = U8Encoder::with_item(7).unwrap();
99/// encoder.encode_all(&mut output).unwrap();
100/// assert_eq!(output, [7]);
101/// ```
102#[derive(Debug, Default)]
103pub struct U8Encoder(BytesEncoder<[u8; 1]>);
104impl U8Encoder {
105    /// Makes a new `U8Encoder` instance.
106    pub fn new() -> Self {
107        Self::default()
108    }
109
110    #[allow(clippy::unnecessary_wraps)]
111    fn encode_item(n: u8, b: &mut [u8; 1]) -> Result<()> {
112        b[0] = n;
113        Ok(())
114    }
115}
116impl_encode!(U8Encoder, u8);
117
118/// Decoder which decodes `i8` values.
119///
120/// # Examples
121///
122/// ```
123/// use bytecodec::Decode;
124/// use bytecodec::fixnum::I8Decoder;
125/// use bytecodec::io::IoDecodeExt;
126///
127/// let mut decoder = I8Decoder::new();
128/// let item = decoder.decode_exact([255].as_ref()).unwrap();
129/// assert_eq!(item, -1);
130/// ```
131#[derive(Debug, Default)]
132pub struct I8Decoder(CopyableBytesDecoder<[u8; 1]>);
133impl I8Decoder {
134    /// Makes a new `I8Decoder` instance.
135    pub fn new() -> Self {
136        Self::default()
137    }
138
139    fn decode_item(b: [u8; 1]) -> i8 {
140        b[0] as i8
141    }
142}
143impl_decode!(I8Decoder, i8);
144
145/// Encoder which encodes `i8` values.
146///
147/// # Examples
148///
149/// ```
150/// use bytecodec::EncodeExt;
151/// use bytecodec::fixnum::I8Encoder;
152/// use bytecodec::io::IoEncodeExt;
153///
154/// let mut output = Vec::new();
155/// let mut encoder = I8Encoder::with_item(-1).unwrap();
156/// encoder.encode_all(&mut output).unwrap();
157/// assert_eq!(output, [255]);
158/// ```
159#[derive(Debug, Default)]
160pub struct I8Encoder(BytesEncoder<[u8; 1]>);
161impl I8Encoder {
162    /// Makes a new `I8Encoder` instance.
163    pub fn new() -> Self {
164        Self::default()
165    }
166
167    #[allow(clippy::unnecessary_wraps)]
168    fn encode_item(n: i8, b: &mut [u8; 1]) -> Result<()> {
169        b[0] = n as u8;
170        Ok(())
171    }
172}
173impl_encode!(I8Encoder, i8);
174
175/// Decoder which decodes `u16` values by big-endian byte order.
176///
177/// # Examples
178///
179/// ```
180/// use bytecodec::Decode;
181/// use bytecodec::fixnum::U16beDecoder;
182/// use bytecodec::io::IoDecodeExt;
183///
184/// let mut decoder = U16beDecoder::new();
185/// let item = decoder.decode_exact([0x01, 0x02].as_ref()).unwrap();
186/// assert_eq!(item, 0x0102u16);
187/// ```
188#[derive(Debug, Default)]
189pub struct U16beDecoder(CopyableBytesDecoder<[u8; 2]>);
190impl U16beDecoder {
191    /// Makes a new `U16beDecoder` instance.
192    pub fn new() -> Self {
193        Self::default()
194    }
195
196    fn decode_item(b: [u8; 2]) -> u16 {
197        BigEndian::read_u16(&b)
198    }
199}
200impl_decode!(U16beDecoder, u16);
201
202/// Decoder which decodes `u16` values by little-endian byte order.
203///
204/// # Examples
205///
206/// ```
207/// use bytecodec::Decode;
208/// use bytecodec::fixnum::U16leDecoder;
209/// use bytecodec::io::IoDecodeExt;
210///
211/// let mut decoder = U16leDecoder::new();
212/// let item = decoder.decode_exact([0x01, 0x02].as_ref()).unwrap();
213/// assert_eq!(item, 0x0201u16);
214/// ```
215#[derive(Debug, Default)]
216pub struct U16leDecoder(CopyableBytesDecoder<[u8; 2]>);
217impl U16leDecoder {
218    /// Makes a new `U16leDecoder` instance.
219    pub fn new() -> Self {
220        Self::default()
221    }
222
223    fn decode_item(b: [u8; 2]) -> u16 {
224        LittleEndian::read_u16(&b)
225    }
226}
227impl_decode!(U16leDecoder, u16);
228
229/// Encoder which encodes `u16` values by big-endian byte order.
230///
231/// # Examples
232///
233/// ```
234/// use bytecodec::EncodeExt;
235/// use bytecodec::fixnum::U16beEncoder;
236/// use bytecodec::io::IoEncodeExt;
237///
238/// let mut output = Vec::new();
239/// let mut encoder = U16beEncoder::with_item(0x0102).unwrap();
240/// encoder.encode_all(&mut output).unwrap();
241/// assert_eq!(output, [0x01, 0x02]);
242/// ```
243#[derive(Debug, Default)]
244pub struct U16beEncoder(BytesEncoder<[u8; 2]>);
245impl U16beEncoder {
246    /// Makes a new `U16beEncoder` instance.
247    pub fn new() -> Self {
248        Self::default()
249    }
250
251    #[allow(clippy::unnecessary_wraps)]
252    fn encode_item(n: u16, b: &mut [u8; 2]) -> Result<()> {
253        BigEndian::write_u16(b, n);
254        Ok(())
255    }
256}
257impl_encode!(U16beEncoder, u16);
258
259/// Encoder which encodes `u16` values by little-endian byte order.
260///
261/// # Examples
262///
263/// ```
264/// use bytecodec::EncodeExt;
265/// use bytecodec::fixnum::U16leEncoder;
266/// use bytecodec::io::IoEncodeExt;
267///
268/// let mut output = Vec::new();
269/// let mut encoder = U16leEncoder::with_item(0x0102).unwrap();
270/// encoder.encode_all(&mut output).unwrap();
271/// assert_eq!(output, [0x02, 0x01]);
272/// ```
273#[derive(Debug, Default)]
274pub struct U16leEncoder(BytesEncoder<[u8; 2]>);
275impl U16leEncoder {
276    /// Makes a new `U16leEncoder` instance.
277    pub fn new() -> Self {
278        Self::default()
279    }
280
281    #[allow(clippy::unnecessary_wraps)]
282    fn encode_item(n: u16, b: &mut [u8; 2]) -> Result<()> {
283        LittleEndian::write_u16(b, n);
284        Ok(())
285    }
286}
287impl_encode!(U16leEncoder, u16);
288
289/// Decoder which decodes `i16` values by big-endian byte order.
290///
291/// # Examples
292///
293/// ```
294/// use bytecodec::Decode;
295/// use bytecodec::fixnum::I16beDecoder;
296/// use bytecodec::io::IoDecodeExt;
297///
298/// let mut decoder = I16beDecoder::new();
299/// let item = decoder.decode_exact([0x01, 0x02].as_ref()).unwrap();
300/// assert_eq!(item, 0x0102i16);
301/// ```
302#[derive(Debug, Default)]
303pub struct I16beDecoder(CopyableBytesDecoder<[u8; 2]>);
304impl I16beDecoder {
305    /// Makes a new `I16beDecoder` instance.
306    pub fn new() -> Self {
307        Self::default()
308    }
309
310    fn decode_item(b: [u8; 2]) -> i16 {
311        BigEndian::read_i16(&b)
312    }
313}
314impl_decode!(I16beDecoder, i16);
315
316/// Decoder which decodes `i16` values by little-endian byte order.
317///
318/// # Examples
319///
320/// ```
321/// use bytecodec::Decode;
322/// use bytecodec::fixnum::I16leDecoder;
323/// use bytecodec::io::IoDecodeExt;
324///
325/// let mut decoder = I16leDecoder::new();
326/// let item = decoder.decode_exact([0x01, 0x02].as_ref()).unwrap();
327/// assert_eq!(item, 0x0201i16);
328/// ```
329#[derive(Debug, Default)]
330pub struct I16leDecoder(CopyableBytesDecoder<[u8; 2]>);
331impl I16leDecoder {
332    /// Makes a new `I16leDecoder` instance.
333    pub fn new() -> Self {
334        Self::default()
335    }
336
337    fn decode_item(b: [u8; 2]) -> i16 {
338        LittleEndian::read_i16(&b)
339    }
340}
341impl_decode!(I16leDecoder, i16);
342
343/// Encoder which encodes `i16` values by big-endian byte order.
344///
345/// # Examples
346///
347/// ```
348/// use bytecodec::EncodeExt;
349/// use bytecodec::fixnum::I16beEncoder;
350/// use bytecodec::io::IoEncodeExt;
351///
352/// let mut output = Vec::new();
353/// let mut encoder = I16beEncoder::with_item(-2).unwrap();
354/// encoder.encode_all(&mut output).unwrap();
355/// assert_eq!(output, [0xFF, 0xFE]);
356/// ```
357#[derive(Debug, Default)]
358pub struct I16beEncoder(BytesEncoder<[u8; 2]>);
359impl I16beEncoder {
360    /// Makes a new `I16beEncoder` instance.
361    pub fn new() -> Self {
362        Self::default()
363    }
364
365    #[allow(clippy::unnecessary_wraps)]
366    fn encode_item(n: i16, b: &mut [u8; 2]) -> Result<()> {
367        BigEndian::write_i16(b, n);
368        Ok(())
369    }
370}
371impl_encode!(I16beEncoder, i16);
372
373/// Encoder which encodes `i16` values by little-endian byte order.
374///
375/// # Examples
376///
377/// ```
378/// use bytecodec::EncodeExt;
379/// use bytecodec::fixnum::I16leEncoder;
380/// use bytecodec::io::IoEncodeExt;
381///
382/// let mut output = Vec::new();
383/// let mut encoder = I16leEncoder::with_item(-2).unwrap();
384/// encoder.encode_all(&mut output).unwrap();
385/// assert_eq!(output, [0xFE, 0xFF]);
386/// ```
387#[derive(Debug, Default)]
388pub struct I16leEncoder(BytesEncoder<[u8; 2]>);
389impl I16leEncoder {
390    /// Makes a new `I16leEncoder` instance.
391    pub fn new() -> Self {
392        Self::default()
393    }
394
395    #[allow(clippy::unnecessary_wraps)]
396    fn encode_item(n: i16, b: &mut [u8; 2]) -> Result<()> {
397        LittleEndian::write_i16(b, n);
398        Ok(())
399    }
400}
401impl_encode!(I16leEncoder, i16);
402
403/// Decoder which decodes unsigned 24-bit integers by big-endian byte order.
404///
405/// The type of decoded values is `u32`, but the most significant 8-bits always be `0`.
406///
407/// # Examples
408///
409/// ```
410/// use bytecodec::Decode;
411/// use bytecodec::fixnum::U24beDecoder;
412/// use bytecodec::io::IoDecodeExt;
413///
414/// let mut decoder = U24beDecoder::new();
415/// let item = decoder.decode_exact([0x01, 0x02, 0x03].as_ref()).unwrap();
416/// assert_eq!(item, 0x0001_0203u32);
417/// ```
418#[derive(Debug, Default)]
419pub struct U24beDecoder(CopyableBytesDecoder<[u8; 3]>);
420impl U24beDecoder {
421    /// Makes a new `U24beDecoder` instance.
422    pub fn new() -> Self {
423        Self::default()
424    }
425
426    fn decode_item(b: [u8; 3]) -> u32 {
427        BigEndian::read_u24(&b)
428    }
429}
430impl_decode!(U24beDecoder, u32);
431
432/// Decoder which decodes unsigned 24-bit integers by little-endian byte order.
433///
434/// The type of decoded values is `u32`, but the most significant 8-bits always be `0`.
435///
436/// # Examples
437///
438/// ```
439/// use bytecodec::Decode;
440/// use bytecodec::fixnum::U24leDecoder;
441/// use bytecodec::io::IoDecodeExt;
442///
443/// let mut decoder = U24leDecoder::new();
444/// let item = decoder.decode_exact([0x01, 0x02, 0x03].as_ref()).unwrap();
445/// assert_eq!(item, 0x0003_0201u32);
446/// ```
447#[derive(Debug, Default)]
448pub struct U24leDecoder(CopyableBytesDecoder<[u8; 3]>);
449impl U24leDecoder {
450    /// Makes a new `U24leDecoder` instance.
451    pub fn new() -> Self {
452        Self::default()
453    }
454
455    fn decode_item(b: [u8; 3]) -> u32 {
456        LittleEndian::read_u24(&b)
457    }
458}
459impl_decode!(U24leDecoder, u32);
460
461/// Encoder which encodes unsigned 24-bit integers by big-endian byte order.
462///
463/// Although the type of items is `u32`, the most significant 8-bits must be `0`.
464///
465/// # Examples
466///
467/// ```
468/// use bytecodec::EncodeExt;
469/// use bytecodec::fixnum::U24beEncoder;
470/// use bytecodec::io::IoEncodeExt;
471///
472/// let mut output = Vec::new();
473/// let mut encoder = U24beEncoder::with_item(0x0001_0203).unwrap();
474/// encoder.encode_all(&mut output).unwrap();
475/// assert_eq!(output, [0x01, 0x02, 0x03]);
476/// ```
477#[derive(Debug, Default)]
478pub struct U24beEncoder(BytesEncoder<[u8; 3]>);
479impl U24beEncoder {
480    /// Makes a new `U24beEncoder` instance.
481    pub fn new() -> Self {
482        Self::default()
483    }
484
485    fn encode_item(n: u32, b: &mut [u8; 3]) -> Result<()> {
486        track_assert!(n <= 0xFF_FFFF, ErrorKind::InvalidInput);
487        BigEndian::write_u24(b, n);
488        Ok(())
489    }
490}
491impl_encode!(U24beEncoder, u32);
492
493/// Encoder which encodes unsigned 24-bit integers by little-endian byte order.
494///
495/// Although the type of items is `u32`, the most significant 8-bits must be `0`.
496///
497/// # Examples
498///
499/// ```
500/// use bytecodec::EncodeExt;
501/// use bytecodec::fixnum::U24leEncoder;
502/// use bytecodec::io::IoEncodeExt;
503///
504/// let mut output = Vec::new();
505/// let mut encoder = U24leEncoder::with_item(0x0001_0203).unwrap();
506/// encoder.encode_all(&mut output).unwrap();
507/// assert_eq!(output, [0x03, 0x02, 0x01]);
508/// ```
509#[derive(Debug, Default)]
510pub struct U24leEncoder(BytesEncoder<[u8; 3]>);
511impl U24leEncoder {
512    /// Makes a new `U24leEncoder` instance.
513    pub fn new() -> Self {
514        Self::default()
515    }
516
517    fn encode_item(n: u32, b: &mut [u8; 3]) -> Result<()> {
518        track_assert!(n <= 0xFF_FFFF, ErrorKind::InvalidInput);
519        LittleEndian::write_u24(b, n);
520        Ok(())
521    }
522}
523impl_encode!(U24leEncoder, u32);
524
525/// Decoder which decodes `u32` values by big-endian byte order.
526///
527/// # Examples
528///
529/// ```
530/// use bytecodec::Decode;
531/// use bytecodec::fixnum::U32beDecoder;
532/// use bytecodec::io::IoDecodeExt;
533///
534/// let mut decoder = U32beDecoder::new();
535/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04].as_ref()).unwrap();
536/// assert_eq!(item, 0x0102_0304u32);
537/// ```
538#[derive(Debug, Default)]
539pub struct U32beDecoder(CopyableBytesDecoder<[u8; 4]>);
540impl U32beDecoder {
541    /// Makes a new `U32beDecoder` instance.
542    pub fn new() -> Self {
543        Self::default()
544    }
545
546    fn decode_item(b: [u8; 4]) -> u32 {
547        BigEndian::read_u32(&b)
548    }
549}
550impl_decode!(U32beDecoder, u32);
551
552/// Decoder which decodes `u32` values by little-endian byte order.
553///
554/// # Examples
555///
556/// ```
557/// use bytecodec::Decode;
558/// use bytecodec::fixnum::U32leDecoder;
559/// use bytecodec::io::IoDecodeExt;
560///
561/// let mut decoder = U32leDecoder::new();
562/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04].as_ref()).unwrap();
563/// assert_eq!(item, 0x0403_0201u32);
564/// ```
565#[derive(Debug, Default)]
566pub struct U32leDecoder(CopyableBytesDecoder<[u8; 4]>);
567impl U32leDecoder {
568    /// Makes a new `U32leDecoder` instance.
569    pub fn new() -> Self {
570        Self::default()
571    }
572
573    fn decode_item(b: [u8; 4]) -> u32 {
574        LittleEndian::read_u32(&b)
575    }
576}
577impl_decode!(U32leDecoder, u32);
578
579/// Encoder which encodes `u32` values by big-endian byte order.
580///
581/// # Examples
582///
583/// ```
584/// use bytecodec::EncodeExt;
585/// use bytecodec::fixnum::U32beEncoder;
586/// use bytecodec::io::IoEncodeExt;
587///
588/// let mut output = Vec::new();
589/// let mut encoder = U32beEncoder::with_item(0x0102_0304).unwrap();
590/// encoder.encode_all(&mut output).unwrap();
591/// assert_eq!(output, [0x01, 0x02, 0x03, 0x04]);
592/// ```
593#[derive(Debug, Default)]
594pub struct U32beEncoder(BytesEncoder<[u8; 4]>);
595impl U32beEncoder {
596    /// Makes a new `U32beEncoder` instance.
597    pub fn new() -> Self {
598        Self::default()
599    }
600
601    #[allow(clippy::unnecessary_wraps)]
602    fn encode_item(n: u32, b: &mut [u8; 4]) -> Result<()> {
603        BigEndian::write_u32(b, n);
604        Ok(())
605    }
606}
607impl_encode!(U32beEncoder, u32);
608
609/// Encoder which encodes `u32` values by little-endian byte order.
610///
611/// # Examples
612///
613/// ```
614/// use bytecodec::EncodeExt;
615/// use bytecodec::fixnum::U32leEncoder;
616/// use bytecodec::io::IoEncodeExt;
617///
618/// let mut output = Vec::new();
619/// let mut encoder = U32leEncoder::with_item(0x0102_0304).unwrap();
620/// encoder.encode_all(&mut output).unwrap();
621/// assert_eq!(output, [0x04, 0x03, 0x02, 0x01]);
622/// ```
623#[derive(Debug, Default)]
624pub struct U32leEncoder(BytesEncoder<[u8; 4]>);
625impl U32leEncoder {
626    /// Makes a new `U32leEncoder` instance.
627    pub fn new() -> Self {
628        Self::default()
629    }
630
631    #[allow(clippy::unnecessary_wraps)]
632    fn encode_item(n: u32, b: &mut [u8; 4]) -> Result<()> {
633        LittleEndian::write_u32(b, n);
634        Ok(())
635    }
636}
637impl_encode!(U32leEncoder, u32);
638
639/// Decoder which decodes `i32` values by big-endian byte order.
640///
641/// # Examples
642///
643/// ```
644/// use bytecodec::Decode;
645/// use bytecodec::fixnum::I32beDecoder;
646/// use bytecodec::io::IoDecodeExt;
647///
648/// let mut decoder = I32beDecoder::new();
649/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04].as_ref()).unwrap();
650/// assert_eq!(item, 0x0102_0304i32);
651/// ```
652#[derive(Debug, Default)]
653pub struct I32beDecoder(CopyableBytesDecoder<[u8; 4]>);
654impl I32beDecoder {
655    /// Makes a new `I32beDecoder` instance.
656    pub fn new() -> Self {
657        Self::default()
658    }
659
660    fn decode_item(b: [u8; 4]) -> i32 {
661        BigEndian::read_i32(&b)
662    }
663}
664impl_decode!(I32beDecoder, i32);
665
666/// Decoder which decodes `i32` values by little-endian byte order.
667///
668/// # Examples
669///
670/// ```
671/// use bytecodec::Decode;
672/// use bytecodec::fixnum::I32leDecoder;
673/// use bytecodec::io::IoDecodeExt;
674///
675/// let mut decoder = I32leDecoder::new();
676/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04].as_ref()).unwrap();
677/// assert_eq!(item, 0x0403_0201i32);
678/// ```
679#[derive(Debug, Default)]
680pub struct I32leDecoder(CopyableBytesDecoder<[u8; 4]>);
681impl I32leDecoder {
682    /// Makes a new `I32leDecoder` instance.
683    pub fn new() -> Self {
684        Self::default()
685    }
686
687    fn decode_item(b: [u8; 4]) -> i32 {
688        LittleEndian::read_i32(&b)
689    }
690}
691impl_decode!(I32leDecoder, i32);
692
693/// Encoder which encodes `i32` values by big-endian byte order.
694///
695/// # Examples
696///
697/// ```
698/// use bytecodec::EncodeExt;
699/// use bytecodec::fixnum::I32beEncoder;
700/// use bytecodec::io::IoEncodeExt;
701///
702/// let mut output = Vec::new();
703/// let mut encoder = I32beEncoder::with_item(-2).unwrap();
704/// encoder.encode_all(&mut output).unwrap();
705/// assert_eq!(output, [0xFF, 0xFF, 0xFF, 0xFE]);
706/// ```
707#[derive(Debug, Default)]
708pub struct I32beEncoder(BytesEncoder<[u8; 4]>);
709impl I32beEncoder {
710    /// Makes a new `I32beEncoder` instance.
711    pub fn new() -> Self {
712        Self::default()
713    }
714
715    #[allow(clippy::unnecessary_wraps)]
716    fn encode_item(n: i32, b: &mut [u8; 4]) -> Result<()> {
717        BigEndian::write_i32(b, n);
718        Ok(())
719    }
720}
721impl_encode!(I32beEncoder, i32);
722
723/// Encoder which encodes `i32` values by little-endian byte order.
724///
725/// # Examples
726///
727/// ```
728/// use bytecodec::EncodeExt;
729/// use bytecodec::fixnum::I32leEncoder;
730/// use bytecodec::io::IoEncodeExt;
731///
732/// let mut output = Vec::new();
733/// let mut encoder = I32leEncoder::with_item(-2).unwrap();
734/// encoder.encode_all(&mut output).unwrap();
735/// assert_eq!(output, [0xFE, 0xFF, 0xFF, 0xFF]);
736/// ```
737#[derive(Debug, Default)]
738pub struct I32leEncoder(BytesEncoder<[u8; 4]>);
739impl I32leEncoder {
740    /// Makes a new `I32leEncoder` instance.
741    pub fn new() -> Self {
742        Self::default()
743    }
744
745    #[allow(clippy::unnecessary_wraps)]
746    fn encode_item(n: i32, b: &mut [u8; 4]) -> Result<()> {
747        LittleEndian::write_i32(b, n);
748        Ok(())
749    }
750}
751impl_encode!(I32leEncoder, i32);
752
753/// Decoder which decodes unsigned 40-bit integers by big-endian byte order.
754///
755/// The type of decoded values is `u64`, but the most significant 24-bits always be `0`.
756///
757/// # Examples
758///
759/// ```
760/// use bytecodec::Decode;
761/// use bytecodec::fixnum::U40beDecoder;
762/// use bytecodec::io::IoDecodeExt;
763///
764/// let mut decoder = U40beDecoder::new();
765/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04, 0x05].as_ref()).unwrap();
766/// assert_eq!(item, 0x0000_0001_0203_0405u64);
767/// ```
768#[derive(Debug, Default)]
769pub struct U40beDecoder(CopyableBytesDecoder<[u8; 5]>);
770impl U40beDecoder {
771    /// Makes a new `U40beDecoder` instance.
772    pub fn new() -> Self {
773        Self::default()
774    }
775
776    fn decode_item(b: [u8; 5]) -> u64 {
777        BigEndian::read_uint(&b, b.len())
778    }
779}
780impl_decode!(U40beDecoder, u64);
781
782/// Decoder which decodes unsigned 40-bit integers by little-endian byte order.
783///
784/// The type of decoded values is `u64`, but the most significant 24-bits always be `0`.
785///
786/// # Examples
787///
788/// ```
789/// use bytecodec::Decode;
790/// use bytecodec::fixnum::U40leDecoder;
791/// use bytecodec::io::IoDecodeExt;
792///
793/// let mut decoder = U40leDecoder::new();
794/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04, 0x05].as_ref()).unwrap();
795/// assert_eq!(item, 0x0000_0005_0403_0201u64);
796/// ```
797#[derive(Debug, Default)]
798pub struct U40leDecoder(CopyableBytesDecoder<[u8; 5]>);
799impl U40leDecoder {
800    /// Makes a new `U40leDecoder` instance.
801    pub fn new() -> Self {
802        Self::default()
803    }
804
805    fn decode_item(b: [u8; 5]) -> u64 {
806        LittleEndian::read_uint(&b, b.len())
807    }
808}
809impl_decode!(U40leDecoder, u64);
810
811/// Encoder which encodes unsigned 40-bit integers by big-endian byte order.
812///
813/// Although the type of items is `u64`, the most significant 24-bits must be `0`.
814///
815/// # Examples
816///
817/// ```
818/// use bytecodec::EncodeExt;
819/// use bytecodec::fixnum::U40beEncoder;
820/// use bytecodec::io::IoEncodeExt;
821///
822/// let mut output = Vec::new();
823/// let mut encoder = U40beEncoder::with_item(0x0000_0001_0203_0405).unwrap();
824/// encoder.encode_all(&mut output).unwrap();
825/// assert_eq!(output, [0x01, 0x02, 0x03, 0x04, 0x05]);
826/// ```
827#[derive(Debug, Default)]
828pub struct U40beEncoder(BytesEncoder<[u8; 5]>);
829impl U40beEncoder {
830    /// Makes a new `U40beEncoder` instance.
831    pub fn new() -> Self {
832        Self::default()
833    }
834
835    fn encode_item(n: u64, b: &mut [u8; 5]) -> Result<()> {
836        track_assert!(n <= 0xFF_FFFF_FFFF, ErrorKind::InvalidInput);
837        let len = b.len();
838        BigEndian::write_uint(b, n, len);
839        Ok(())
840    }
841}
842impl_encode!(U40beEncoder, u64);
843
844/// Encoder which encodes unsigned 40-bit integers by little-endian byte order.
845///
846/// Although the type of items is `u64`, the most significant 24-bits must be `0`.
847///
848/// # Examples
849///
850/// ```
851/// use bytecodec::EncodeExt;
852/// use bytecodec::fixnum::U40leEncoder;
853/// use bytecodec::io::IoEncodeExt;
854///
855/// let mut output = Vec::new();
856/// let mut encoder = U40leEncoder::with_item(0x0000_0001_0203_0405).unwrap();
857/// encoder.encode_all(&mut output).unwrap();
858/// assert_eq!(output, [0x05, 0x04, 0x03, 0x02, 0x01]);
859/// ```
860#[derive(Debug, Default)]
861pub struct U40leEncoder(BytesEncoder<[u8; 5]>);
862impl U40leEncoder {
863    /// Makes a new `U40leEncoder` instance.
864    pub fn new() -> Self {
865        Self::default()
866    }
867
868    fn encode_item(n: u64, b: &mut [u8; 5]) -> Result<()> {
869        track_assert!(n <= 0xFF_FFFF_FFFF, ErrorKind::InvalidInput);
870        let len = b.len();
871        LittleEndian::write_uint(b, n, len);
872        Ok(())
873    }
874}
875impl_encode!(U40leEncoder, u64);
876
877/// Decoder which decodes unsigned 48-bit integers by big-endian byte order.
878///
879/// The type of decoded values is `u64`, but the most significant 16-bits always be `0`.
880///
881/// # Examples
882///
883/// ```
884/// use bytecodec::Decode;
885/// use bytecodec::fixnum::U48beDecoder;
886/// use bytecodec::io::IoDecodeExt;
887///
888/// let mut decoder = U48beDecoder::new();
889/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04, 0x05, 0x06].as_ref()).unwrap();
890/// assert_eq!(item, 0x0000_0102_0304_0506u64);
891/// ```
892#[derive(Debug, Default)]
893pub struct U48beDecoder(CopyableBytesDecoder<[u8; 6]>);
894impl U48beDecoder {
895    /// Makes a new `U48beDecoder` instance.
896    pub fn new() -> Self {
897        Self::default()
898    }
899
900    fn decode_item(b: [u8; 6]) -> u64 {
901        BigEndian::read_uint(&b, b.len())
902    }
903}
904impl_decode!(U48beDecoder, u64);
905
906/// Decoder which decodes unsigned 48-bit integers by little-endian byte order.
907///
908/// The type of decoded values is `u64`, but the most significant 16-bits always be `0`.
909///
910/// # Examples
911///
912/// ```
913/// use bytecodec::Decode;
914/// use bytecodec::fixnum::U48leDecoder;
915/// use bytecodec::io::IoDecodeExt;
916///
917/// let mut decoder = U48leDecoder::new();
918/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04, 0x05, 0x06].as_ref()).unwrap();
919/// assert_eq!(item, 0x0000_0605_0403_0201u64);
920/// ```
921#[derive(Debug, Default)]
922pub struct U48leDecoder(CopyableBytesDecoder<[u8; 6]>);
923impl U48leDecoder {
924    /// Makes a new `U48leDecoder` instance.
925    pub fn new() -> Self {
926        Self::default()
927    }
928
929    fn decode_item(b: [u8; 6]) -> u64 {
930        LittleEndian::read_uint(&b, b.len())
931    }
932}
933impl_decode!(U48leDecoder, u64);
934
935/// Encoder which encodes unsigned 48-bit integers by big-endian byte order.
936///
937/// Although the type of items is `u64`, the most significant 16-bits must be `0`.
938///
939/// # Examples
940///
941/// ```
942/// use bytecodec::EncodeExt;
943/// use bytecodec::fixnum::U48beEncoder;
944/// use bytecodec::io::IoEncodeExt;
945///
946/// let mut output = Vec::new();
947/// let mut encoder = U48beEncoder::with_item(0x0000_0102_0304_0506).unwrap();
948/// encoder.encode_all(&mut output).unwrap();
949/// assert_eq!(output, [0x01, 0x02, 0x03, 0x04, 0x05, 0x06]);
950/// ```
951#[derive(Debug, Default)]
952pub struct U48beEncoder(BytesEncoder<[u8; 6]>);
953impl U48beEncoder {
954    /// Makes a new `U48beEncoder` integers.
955    pub fn new() -> Self {
956        Self::default()
957    }
958
959    fn encode_item(n: u64, b: &mut [u8; 6]) -> Result<()> {
960        track_assert!(n <= 0xFFFF_FFFF_FFFF, ErrorKind::InvalidInput);
961        let len = b.len();
962        BigEndian::write_uint(b, n, len);
963        Ok(())
964    }
965}
966impl_encode!(U48beEncoder, u64);
967
968/// Encoder which encodes unsigned 48-bit integers by little-endian byte order.
969///
970/// Although the type of items is `u64`, the most significant 16-bits must be `0`.
971///
972/// # Examples
973///
974/// ```
975/// use bytecodec::EncodeExt;
976/// use bytecodec::fixnum::U48leEncoder;
977/// use bytecodec::io::IoEncodeExt;
978///
979/// let mut output = Vec::new();
980/// let mut encoder = U48leEncoder::with_item(0x0000_0102_0304_0506).unwrap();
981/// encoder.encode_all(&mut output).unwrap();
982/// assert_eq!(output, [0x06, 0x05, 0x04, 0x03, 0x02, 0x01]);
983/// ```
984#[derive(Debug, Default)]
985pub struct U48leEncoder(BytesEncoder<[u8; 6]>);
986impl U48leEncoder {
987    /// Makes a new `U48leEncoder` instance.
988    pub fn new() -> Self {
989        Self::default()
990    }
991
992    fn encode_item(n: u64, b: &mut [u8; 6]) -> Result<()> {
993        track_assert!(n <= 0xFFFF_FFFF_FFFF, ErrorKind::InvalidInput);
994        let len = b.len();
995        LittleEndian::write_uint(b, n, len);
996        Ok(())
997    }
998}
999impl_encode!(U48leEncoder, u64);
1000
1001/// Decoder which decodes unsigned 56-bit integers by big-endian byte order.
1002///
1003/// The type of decoded values is `u64`, but the most significant 8-bits always be `0`.
1004///
1005/// # Examples
1006///
1007/// ```
1008/// use bytecodec::Decode;
1009/// use bytecodec::fixnum::U56beDecoder;
1010/// use bytecodec::io::IoDecodeExt;
1011///
1012/// let mut decoder = U56beDecoder::new();
1013/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07].as_ref()).unwrap();
1014/// assert_eq!(item, 0x0001_0203_0405_0607u64);
1015/// ```
1016#[derive(Debug, Default)]
1017pub struct U56beDecoder(CopyableBytesDecoder<[u8; 7]>);
1018impl U56beDecoder {
1019    /// Makes a new `U56beDecoder` instance.
1020    pub fn new() -> Self {
1021        Self::default()
1022    }
1023
1024    fn decode_item(b: [u8; 7]) -> u64 {
1025        BigEndian::read_uint(&b, b.len())
1026    }
1027}
1028impl_decode!(U56beDecoder, u64);
1029
1030/// Decoder which decodes unsigned 56-bit integers by little-endian byte order.
1031///
1032/// The type of decoded values is `u64`, but the most significant 8-bits always be `0`.
1033///
1034/// # Examples
1035///
1036/// ```
1037/// use bytecodec::Decode;
1038/// use bytecodec::fixnum::U56leDecoder;
1039/// use bytecodec::io::IoDecodeExt;
1040///
1041/// let mut decoder = U56leDecoder::new();
1042/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07].as_ref()).unwrap();
1043/// assert_eq!(item, 0x0007_0605_0403_0201u64);
1044/// ```
1045#[derive(Debug, Default)]
1046pub struct U56leDecoder(CopyableBytesDecoder<[u8; 7]>);
1047impl U56leDecoder {
1048    /// Makes a new `U56leDecoder` instance.
1049    pub fn new() -> Self {
1050        Self::default()
1051    }
1052
1053    fn decode_item(b: [u8; 7]) -> u64 {
1054        LittleEndian::read_uint(&b, b.len())
1055    }
1056}
1057impl_decode!(U56leDecoder, u64);
1058
1059/// Encoder which encodes unsigned 56-bit integers by big-endian byte order.
1060///
1061/// Although the type of items is `u64`, the most significant 8-bits must be `0`.
1062///
1063/// # Examples
1064///
1065/// ```
1066/// use bytecodec::EncodeExt;
1067/// use bytecodec::fixnum::U56beEncoder;
1068/// use bytecodec::io::IoEncodeExt;
1069///
1070/// let mut output = Vec::new();
1071/// let mut encoder = U56beEncoder::with_item(0x0001_0203_0405_0607).unwrap();
1072/// encoder.encode_all(&mut output).unwrap();
1073/// assert_eq!(output, [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]);
1074/// ```
1075#[derive(Debug, Default)]
1076pub struct U56beEncoder(BytesEncoder<[u8; 7]>);
1077impl U56beEncoder {
1078    /// Makes a new `U56beEncoder` instance.
1079    pub fn new() -> Self {
1080        Self::default()
1081    }
1082
1083    fn encode_item(n: u64, b: &mut [u8; 7]) -> Result<()> {
1084        track_assert!(n <= 0xFF_FFFF_FFFF_FFFF, ErrorKind::InvalidInput);
1085        let len = b.len();
1086        BigEndian::write_uint(b, n, len);
1087        Ok(())
1088    }
1089}
1090impl_encode!(U56beEncoder, u64);
1091
1092/// Encoder which encodes unsigned 56-bit integers by little-endian byte order.
1093///
1094/// Although the type of items is `u64`, the most significant 8-bits must be `0`.
1095///
1096/// # Examples
1097///
1098/// ```
1099/// use bytecodec::EncodeExt;
1100/// use bytecodec::fixnum::U56leEncoder;
1101/// use bytecodec::io::IoEncodeExt;
1102///
1103/// let mut output = Vec::new();
1104/// let mut encoder = U56leEncoder::with_item(0x0001_0203_0405_0607).unwrap();
1105/// encoder.encode_all(&mut output).unwrap();
1106/// assert_eq!(output, [0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01]);
1107/// ```
1108#[derive(Debug, Default)]
1109pub struct U56leEncoder(BytesEncoder<[u8; 7]>);
1110impl U56leEncoder {
1111    /// Makes a new `U56leEncoder` instance.
1112    pub fn new() -> Self {
1113        Self::default()
1114    }
1115
1116    fn encode_item(n: u64, b: &mut [u8; 7]) -> Result<()> {
1117        track_assert!(n <= 0xFF_FFFF_FFFF_FFFF, ErrorKind::InvalidInput);
1118        let len = b.len();
1119        LittleEndian::write_uint(b, n, len);
1120        Ok(())
1121    }
1122}
1123impl_encode!(U56leEncoder, u64);
1124
1125/// Decoder which decodes `u64` values by big-endian byte order.
1126///
1127/// # Examples
1128///
1129/// ```
1130/// use bytecodec::Decode;
1131/// use bytecodec::fixnum::U64beDecoder;
1132/// use bytecodec::io::IoDecodeExt;
1133///
1134/// let mut decoder = U64beDecoder::new();
1135/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08].as_ref()).unwrap();
1136/// assert_eq!(item, 0x0102_0304_0506_0708u64);
1137/// ```
1138#[derive(Debug, Default)]
1139pub struct U64beDecoder(CopyableBytesDecoder<[u8; 8]>);
1140impl U64beDecoder {
1141    /// Makes a new `U64beDecoder` instance.
1142    pub fn new() -> Self {
1143        Self::default()
1144    }
1145
1146    fn decode_item(b: [u8; 8]) -> u64 {
1147        BigEndian::read_u64(&b)
1148    }
1149}
1150impl_decode!(U64beDecoder, u64);
1151
1152/// Decoder which decodes `u64` values by little-endian byte order.
1153///
1154/// # Examples
1155///
1156/// ```
1157/// use bytecodec::Decode;
1158/// use bytecodec::fixnum::U64leDecoder;
1159/// use bytecodec::io::IoDecodeExt;
1160///
1161/// let mut decoder = U64leDecoder::new();
1162/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08].as_ref()).unwrap();
1163/// assert_eq!(item, 0x0807_0605_0403_0201u64);
1164/// ```
1165#[derive(Debug, Default)]
1166pub struct U64leDecoder(CopyableBytesDecoder<[u8; 8]>);
1167impl U64leDecoder {
1168    /// Makes a new `U64leDecoder` instance.
1169    pub fn new() -> Self {
1170        Self::default()
1171    }
1172
1173    fn decode_item(b: [u8; 8]) -> u64 {
1174        LittleEndian::read_u64(&b)
1175    }
1176}
1177impl_decode!(U64leDecoder, u64);
1178
1179/// Encoder which encodes `u64` values by big-endian byte order.
1180///
1181/// # Examples
1182///
1183/// ```
1184/// use bytecodec::EncodeExt;
1185/// use bytecodec::fixnum::U64beEncoder;
1186/// use bytecodec::io::IoEncodeExt;
1187///
1188/// let mut output = Vec::new();
1189/// let mut encoder = U64beEncoder::with_item(0x0102_0304_0506_0708).unwrap();
1190/// encoder.encode_all(&mut output).unwrap();
1191/// assert_eq!(output, [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]);
1192/// ```
1193#[derive(Debug, Default)]
1194pub struct U64beEncoder(BytesEncoder<[u8; 8]>);
1195impl U64beEncoder {
1196    /// Makes a new `U64beEncoder` instance.
1197    pub fn new() -> Self {
1198        Self::default()
1199    }
1200
1201    #[allow(clippy::unnecessary_wraps)]
1202    fn encode_item(n: u64, b: &mut [u8; 8]) -> Result<()> {
1203        BigEndian::write_u64(b, n);
1204        Ok(())
1205    }
1206}
1207impl_encode!(U64beEncoder, u64);
1208
1209/// Encoder which encodes `u64` values by big-endian byte order.
1210///
1211/// # Examples
1212///
1213/// ```
1214/// use bytecodec::EncodeExt;
1215/// use bytecodec::fixnum::U64leEncoder;
1216/// use bytecodec::io::IoEncodeExt;
1217///
1218/// let mut output = Vec::new();
1219/// let mut encoder = U64leEncoder::with_item(0x0102_0304_0506_0708).unwrap();
1220/// encoder.encode_all(&mut output).unwrap();
1221/// assert_eq!(output, [0x08, 0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01]);
1222/// ```
1223#[derive(Debug, Default)]
1224pub struct U64leEncoder(BytesEncoder<[u8; 8]>);
1225impl U64leEncoder {
1226    /// Makes a new `U64leEncoder` instance.
1227    pub fn new() -> Self {
1228        Self::default()
1229    }
1230
1231    #[allow(clippy::unnecessary_wraps)]
1232    fn encode_item(n: u64, b: &mut [u8; 8]) -> Result<()> {
1233        LittleEndian::write_u64(b, n);
1234        Ok(())
1235    }
1236}
1237impl_encode!(U64leEncoder, u64);
1238
1239/// Decoder which decodes `i64` values by big-endian byte order.
1240///
1241/// # Examples
1242///
1243/// ```
1244/// use bytecodec::Decode;
1245/// use bytecodec::fixnum::I64beDecoder;
1246/// use bytecodec::io::IoDecodeExt;
1247///
1248/// let mut decoder = I64beDecoder::new();
1249/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08].as_ref()).unwrap();
1250/// assert_eq!(item, 0x0102_0304_0506_0708i64);
1251/// ```
1252#[derive(Debug, Default)]
1253pub struct I64beDecoder(CopyableBytesDecoder<[u8; 8]>);
1254impl I64beDecoder {
1255    /// Makes a new `I64beDecoder` instance.
1256    pub fn new() -> Self {
1257        Self::default()
1258    }
1259
1260    fn decode_item(b: [u8; 8]) -> i64 {
1261        BigEndian::read_i64(&b)
1262    }
1263}
1264impl_decode!(I64beDecoder, i64);
1265
1266/// Decoder which decodes `i64` values by little-endian byte order.
1267///
1268/// # Examples
1269///
1270/// ```
1271/// use bytecodec::Decode;
1272/// use bytecodec::fixnum::I64leDecoder;
1273/// use bytecodec::io::IoDecodeExt;
1274///
1275/// let mut decoder = I64leDecoder::new();
1276/// let item = decoder.decode_exact([0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08].as_ref()).unwrap();
1277/// assert_eq!(item, 0x0807_0605_0403_0201i64);
1278/// ```
1279#[derive(Debug, Default)]
1280pub struct I64leDecoder(CopyableBytesDecoder<[u8; 8]>);
1281impl I64leDecoder {
1282    /// Makes a new `I64leDecoder` instance.
1283    pub fn new() -> Self {
1284        Self::default()
1285    }
1286
1287    fn decode_item(b: [u8; 8]) -> i64 {
1288        LittleEndian::read_i64(&b)
1289    }
1290}
1291impl_decode!(I64leDecoder, i64);
1292
1293/// Encoder which encodes `i64` values by big-endian byte order.
1294///
1295/// # Examples
1296///
1297/// ```
1298/// use bytecodec::EncodeExt;
1299/// use bytecodec::fixnum::I64beEncoder;
1300/// use bytecodec::io::IoEncodeExt;
1301///
1302/// let mut output = Vec::new();
1303/// let mut encoder = I64beEncoder::with_item(-2).unwrap();
1304/// encoder.encode_all(&mut output).unwrap();
1305/// assert_eq!(output, [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE]);
1306/// ```
1307#[derive(Debug, Default)]
1308pub struct I64beEncoder(BytesEncoder<[u8; 8]>);
1309impl I64beEncoder {
1310    /// Makes a new `I64beEncoder` instance.
1311    pub fn new() -> Self {
1312        Self::default()
1313    }
1314
1315    #[allow(clippy::unnecessary_wraps)]
1316    fn encode_item(n: i64, b: &mut [u8; 8]) -> Result<()> {
1317        BigEndian::write_i64(b, n);
1318        Ok(())
1319    }
1320}
1321impl_encode!(I64beEncoder, i64);
1322
1323/// Encoder which encodes `i64` values by little-endian byte order.
1324///
1325/// # Examples
1326///
1327/// ```
1328/// use bytecodec::EncodeExt;
1329/// use bytecodec::fixnum::I64leEncoder;
1330/// use bytecodec::io::IoEncodeExt;
1331///
1332/// let mut output = Vec::new();
1333/// let mut encoder = I64leEncoder::with_item(-2).unwrap();
1334/// encoder.encode_all(&mut output).unwrap();
1335/// assert_eq!(output, [0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]);
1336/// ```
1337#[derive(Debug, Default)]
1338pub struct I64leEncoder(BytesEncoder<[u8; 8]>);
1339impl I64leEncoder {
1340    /// Makes a new `I64leEncoder` instance.
1341    pub fn new() -> Self {
1342        Self::default()
1343    }
1344
1345    #[allow(clippy::unnecessary_wraps)]
1346    fn encode_item(n: i64, b: &mut [u8; 8]) -> Result<()> {
1347        LittleEndian::write_i64(b, n);
1348        Ok(())
1349    }
1350}
1351impl_encode!(I64leEncoder, i64);
1352
1353/// Decoder which decodes `f32` values by big-endian byte order.
1354///
1355/// # Examples
1356///
1357/// ```
1358/// use bytecodec::Decode;
1359/// use bytecodec::fixnum::F32beDecoder;
1360/// use bytecodec::io::IoDecodeExt;
1361///
1362/// let mut decoder = F32beDecoder::new();
1363/// let item = decoder.decode_exact([66, 246, 204, 205].as_ref()).unwrap();
1364/// assert_eq!(item, 123.4);
1365/// ```
1366#[derive(Debug, Default)]
1367pub struct F32beDecoder(CopyableBytesDecoder<[u8; 4]>);
1368impl F32beDecoder {
1369    /// Makes a new `F32beDecoder` instance.
1370    pub fn new() -> Self {
1371        Self::default()
1372    }
1373
1374    fn decode_item(b: [u8; 4]) -> f32 {
1375        BigEndian::read_f32(&b)
1376    }
1377}
1378impl_decode!(F32beDecoder, f32);
1379
1380/// Decoder which decodes `f32` values by little-endian byte order.
1381///
1382/// # Examples
1383///
1384/// ```
1385/// use bytecodec::Decode;
1386/// use bytecodec::fixnum::F32leDecoder;
1387/// use bytecodec::io::IoDecodeExt;
1388///
1389/// let mut decoder = F32leDecoder::new();
1390/// let item = decoder.decode_exact([205, 204, 246, 66].as_ref()).unwrap();
1391/// assert_eq!(item, 123.4);
1392/// ```
1393#[derive(Debug, Default)]
1394pub struct F32leDecoder(CopyableBytesDecoder<[u8; 4]>);
1395impl F32leDecoder {
1396    /// Makes a new `F32leDecoder` instance.
1397    pub fn new() -> Self {
1398        Self::default()
1399    }
1400
1401    fn decode_item(b: [u8; 4]) -> f32 {
1402        LittleEndian::read_f32(&b)
1403    }
1404}
1405impl_decode!(F32leDecoder, f32);
1406
1407/// Encoder which encodes `f32` values by big-endian byte order.
1408///
1409/// # Examples
1410///
1411/// ```
1412/// use bytecodec::EncodeExt;
1413/// use bytecodec::fixnum::F32beEncoder;
1414/// use bytecodec::io::IoEncodeExt;
1415///
1416/// let mut output = Vec::new();
1417/// let mut encoder = F32beEncoder::with_item(123.4).unwrap();
1418/// encoder.encode_all(&mut output).unwrap();
1419/// assert_eq!(output, [66, 246, 204, 205]);
1420/// ```
1421#[derive(Debug, Default)]
1422pub struct F32beEncoder(BytesEncoder<[u8; 4]>);
1423impl F32beEncoder {
1424    /// Makes a new `F32beEncoder` instance.
1425    pub fn new() -> Self {
1426        Self::default()
1427    }
1428
1429    #[allow(clippy::unnecessary_wraps)]
1430    fn encode_item(n: f32, b: &mut [u8; 4]) -> Result<()> {
1431        BigEndian::write_f32(b, n);
1432        Ok(())
1433    }
1434}
1435impl_encode!(F32beEncoder, f32);
1436
1437/// Encoder which encodes `f32` values by little-endian byte order.
1438///
1439/// # Examples
1440///
1441/// ```
1442/// use bytecodec::EncodeExt;
1443/// use bytecodec::fixnum::F32leEncoder;
1444/// use bytecodec::io::IoEncodeExt;
1445///
1446/// let mut output = Vec::new();
1447/// let mut encoder = F32leEncoder::with_item(123.4).unwrap();
1448/// encoder.encode_all(&mut output).unwrap();
1449/// assert_eq!(output, [205, 204, 246, 66]);
1450/// ```
1451#[derive(Debug, Default)]
1452pub struct F32leEncoder(BytesEncoder<[u8; 4]>);
1453impl F32leEncoder {
1454    /// Makes a new `F32leEncoder` instance.
1455    pub fn new() -> Self {
1456        Self::default()
1457    }
1458
1459    #[allow(clippy::unnecessary_wraps)]
1460    fn encode_item(n: f32, b: &mut [u8; 4]) -> Result<()> {
1461        LittleEndian::write_f32(b, n);
1462        Ok(())
1463    }
1464}
1465impl_encode!(F32leEncoder, f32);
1466
1467/// Decoder which decodes `f64` values by big-endian byte order.
1468///
1469/// # Examples
1470///
1471/// ```
1472/// use bytecodec::Decode;
1473/// use bytecodec::fixnum::F64beDecoder;
1474/// use bytecodec::io::IoDecodeExt;
1475///
1476/// let mut decoder = F64beDecoder::new();
1477/// let item = decoder.decode_exact([64, 94, 221, 47, 26, 159, 190, 119].as_ref()).unwrap();
1478/// assert_eq!(item, 123.456);
1479/// ```
1480#[derive(Debug, Default)]
1481pub struct F64beDecoder(CopyableBytesDecoder<[u8; 8]>);
1482impl F64beDecoder {
1483    /// Makes a new `F64beDecoder` instance.
1484    pub fn new() -> Self {
1485        Self::default()
1486    }
1487
1488    fn decode_item(b: [u8; 8]) -> f64 {
1489        BigEndian::read_f64(&b)
1490    }
1491}
1492impl_decode!(F64beDecoder, f64);
1493
1494/// Decoder which decodes `f64` values by little-endian byte order.
1495///
1496/// # Examples
1497///
1498/// ```
1499/// use bytecodec::Decode;
1500/// use bytecodec::fixnum::F64leDecoder;
1501/// use bytecodec::io::IoDecodeExt;
1502///
1503/// let mut decoder = F64leDecoder::new();
1504/// let item = decoder.decode_exact([119, 190, 159, 26, 47, 221, 94, 64].as_ref()).unwrap();
1505/// assert_eq!(item, 123.456);
1506/// ```
1507#[derive(Debug, Default)]
1508pub struct F64leDecoder(CopyableBytesDecoder<[u8; 8]>);
1509impl F64leDecoder {
1510    /// Makes a new `F64leDecoder` instance.
1511    pub fn new() -> Self {
1512        Self::default()
1513    }
1514
1515    fn decode_item(b: [u8; 8]) -> f64 {
1516        LittleEndian::read_f64(&b)
1517    }
1518}
1519impl_decode!(F64leDecoder, f64);
1520
1521/// Encoder which encodes `f64` values by big-endian byte order.
1522///
1523/// # Examples
1524///
1525/// ```
1526/// use bytecodec::EncodeExt;
1527/// use bytecodec::fixnum::F64beEncoder;
1528/// use bytecodec::io::IoEncodeExt;
1529///
1530/// let mut output = Vec::new();
1531/// let mut encoder = F64beEncoder::with_item(123.456).unwrap();
1532/// encoder.encode_all(&mut output).unwrap();
1533/// assert_eq!(output, [64, 94, 221, 47, 26, 159, 190, 119]);
1534/// ```
1535#[derive(Debug, Default)]
1536pub struct F64beEncoder(BytesEncoder<[u8; 8]>);
1537impl F64beEncoder {
1538    /// Makes a new `F64beEncoder` instance.
1539    pub fn new() -> Self {
1540        Self::default()
1541    }
1542
1543    #[allow(clippy::unnecessary_wraps)]
1544    fn encode_item(n: f64, b: &mut [u8; 8]) -> Result<()> {
1545        BigEndian::write_f64(b, n);
1546        Ok(())
1547    }
1548}
1549impl_encode!(F64beEncoder, f64);
1550
1551/// Encoder which encodes `f64` values by little-endian byte order.
1552///
1553/// # Examples
1554///
1555/// ```
1556/// use bytecodec::EncodeExt;
1557/// use bytecodec::fixnum::F64leEncoder;
1558/// use bytecodec::io::IoEncodeExt;
1559///
1560/// let mut output = Vec::new();
1561/// let mut encoder = F64leEncoder::with_item(123.456).unwrap();
1562/// encoder.encode_all(&mut output).unwrap();
1563/// assert_eq!(output, [119, 190, 159, 26, 47, 221, 94, 64]);
1564/// ```
1565#[derive(Debug, Default)]
1566pub struct F64leEncoder(BytesEncoder<[u8; 8]>);
1567impl F64leEncoder {
1568    /// Makes a new `F64leEncoder` instance.
1569    pub fn new() -> Self {
1570        Self::default()
1571    }
1572
1573    #[allow(clippy::unnecessary_wraps)]
1574    fn encode_item(n: f64, b: &mut [u8; 8]) -> Result<()> {
1575        LittleEndian::write_f64(b, n);
1576        Ok(())
1577    }
1578}
1579impl_encode!(F64leEncoder, f64);
1580
1581#[cfg(test)]
1582mod test {
1583    use super::*;
1584    use crate::io::{IoDecodeExt, IoEncodeExt};
1585    use crate::Encode;
1586
1587    macro_rules! assert_encode_decode {
1588        ($encoder:ident, $decoder:ident, $item:expr, $bytes:expr) => {
1589            let mut output = Vec::new();
1590            let mut encoder = $encoder::new();
1591            track_try_unwrap!(encoder.start_encoding($item));
1592            track_try_unwrap!(encoder.encode_all(&mut output));
1593            assert_eq!(output, $bytes);
1594
1595            let mut decoder = $decoder::new();
1596            let item = track_try_unwrap!(decoder.decode_exact(&$bytes[..]));
1597            assert_eq!(item, $item);
1598        };
1599    }
1600
1601    #[test]
1602    fn fixnum_works() {
1603        assert_encode_decode!(U8Encoder, U8Decoder, 7, [7]);
1604        assert_encode_decode!(I8Encoder, I8Decoder, -1, [255]);
1605        assert_encode_decode!(U16beEncoder, U16beDecoder, 0x0102, [0x01, 0x02]);
1606        assert_encode_decode!(U16leEncoder, U16leDecoder, 0x0102, [0x02, 0x01]);
1607        assert_encode_decode!(I16beEncoder, I16beDecoder, -2, [0xFF, 0xFE]);
1608        assert_encode_decode!(I16leEncoder, I16leDecoder, -2, [0xFE, 0xFF]);
1609        assert_encode_decode!(U24beEncoder, U24beDecoder, 0x01_0203, [0x01, 0x02, 0x03]);
1610        assert_encode_decode!(U24leEncoder, U24leDecoder, 0x01_0203, [0x03, 0x02, 0x01]);
1611        assert_encode_decode!(
1612            U32beEncoder,
1613            U32beDecoder,
1614            0x0102_0304,
1615            [0x01, 0x02, 0x03, 0x04]
1616        );
1617        assert_encode_decode!(
1618            U32leEncoder,
1619            U32leDecoder,
1620            0x0102_0304,
1621            [0x04, 0x03, 0x02, 0x01]
1622        );
1623        assert_encode_decode!(I32beEncoder, I32beDecoder, -2, [0xFF, 0xFF, 0xFF, 0xFE]);
1624        assert_encode_decode!(I32leEncoder, I32leDecoder, -2, [0xFE, 0xFF, 0xFF, 0xFF]);
1625        assert_encode_decode!(
1626            U40beEncoder,
1627            U40beDecoder,
1628            0x01_0203_0405,
1629            [0x01, 0x02, 0x03, 0x04, 0x05]
1630        );
1631        assert_encode_decode!(
1632            U40leEncoder,
1633            U40leDecoder,
1634            0x01_0203_0405,
1635            [0x05, 0x04, 0x03, 0x02, 0x01]
1636        );
1637        assert_encode_decode!(
1638            U48beEncoder,
1639            U48beDecoder,
1640            0x0102_0304_0506,
1641            [0x01, 0x02, 0x03, 0x04, 0x05, 0x06]
1642        );
1643        assert_encode_decode!(
1644            U48leEncoder,
1645            U48leDecoder,
1646            0x0102_0304_0506,
1647            [0x06, 0x05, 0x04, 0x03, 0x02, 0x01]
1648        );
1649        assert_encode_decode!(
1650            U56beEncoder,
1651            U56beDecoder,
1652            0x01_0203_0405_0607,
1653            [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07]
1654        );
1655        assert_encode_decode!(
1656            U56leEncoder,
1657            U56leDecoder,
1658            0x01_0203_0405_0607,
1659            [0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01]
1660        );
1661        assert_encode_decode!(
1662            U64beEncoder,
1663            U64beDecoder,
1664            0x0102_0304_0506_0708,
1665            [0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08]
1666        );
1667        assert_encode_decode!(
1668            U64leEncoder,
1669            U64leDecoder,
1670            0x0102_0304_0506_0708,
1671            [0x08, 0x7, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01]
1672        );
1673        assert_encode_decode!(
1674            I64beEncoder,
1675            I64beDecoder,
1676            -2,
1677            [0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE]
1678        );
1679        assert_encode_decode!(
1680            I64leEncoder,
1681            I64leDecoder,
1682            -2,
1683            [0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF]
1684        );
1685        assert_encode_decode!(F32beEncoder, F32beDecoder, -123.4, [194, 246, 204, 205]);
1686        assert_encode_decode!(F32leEncoder, F32leDecoder, -123.4, [205, 204, 246, 194]);
1687        assert_encode_decode!(
1688            F64beEncoder,
1689            F64beDecoder,
1690            -123.456,
1691            [192, 94, 221, 47, 26, 159, 190, 119]
1692        );
1693        assert_encode_decode!(
1694            F64leEncoder,
1695            F64leDecoder,
1696            -123.456,
1697            [119, 190, 159, 26, 47, 221, 94, 192]
1698        );
1699    }
1700}