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}