musli_binary_common/int/
byteorder.rs

1use core::fmt::Debug;
2use core::hash::Hash;
3
4mod private {
5    pub trait Sealed {}
6    impl Sealed for super::LittleEndian {}
7    impl Sealed for super::BigEndian {}
8}
9
10/// Trait governing byte orders.
11pub trait ByteOrder:
12    Clone + Copy + Debug + Eq + Hash + Ord + PartialEq + PartialOrd + private::Sealed
13{
14    /// Read a 16-bit unsigned integer.
15    fn read_u16(bytes: [u8; 2]) -> u16;
16
17    /// Read a 32-bit unsigned integer.
18    fn read_u32(bytes: [u8; 4]) -> u32;
19
20    /// Read a 64-bit unsigned integer.
21    fn read_u64(bytes: [u8; 8]) -> u64;
22
23    /// Read a 128-bit unsigned integer.
24    fn read_u128(bytes: [u8; 16]) -> u128;
25
26    /// Read a 16-bit signed integer.
27    fn read_i16(bytes: [u8; 2]) -> i16;
28
29    /// Read a 32-bit signed integer.
30    fn read_i32(bytes: [u8; 4]) -> i32;
31
32    /// Read a 64-bit signed integer.
33    fn read_i64(bytes: [u8; 8]) -> i64;
34
35    /// Read a 128-bit signed integer.
36    fn read_i128(bytes: [u8; 16]) -> i128;
37
38    /// Write a 16-bit unsigned integer.
39    fn write_u16(value: u16) -> [u8; 2];
40
41    /// Write a 32-bit unsigned integer.
42    fn write_u32(value: u32) -> [u8; 4];
43
44    /// Write a 64-bit unsigned integer.
45    fn write_u64(value: u64) -> [u8; 8];
46
47    /// Write a 128-bit unsigned integer.
48    fn write_u128(value: u128) -> [u8; 16];
49
50    /// Write a 16-bit signed integer.
51    fn write_i16(value: i16) -> [u8; 2];
52
53    /// Write a 32-bit signed integer.
54    fn write_i32(value: i32) -> [u8; 4];
55
56    /// Write a 64-bit signed integer.
57    fn write_i64(value: i64) -> [u8; 8];
58
59    /// Write a 128-bit signed integer.
60    fn write_i128(value: i128) -> [u8; 16];
61}
62
63/// Defines little-endian serialization.
64#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
65pub enum LittleEndian {}
66
67impl ByteOrder for LittleEndian {
68    #[inline]
69    fn read_u16(bytes: [u8; 2]) -> u16 {
70        u16::from_le_bytes(bytes)
71    }
72
73    #[inline]
74    fn read_u32(bytes: [u8; 4]) -> u32 {
75        u32::from_le_bytes(bytes)
76    }
77
78    #[inline]
79    fn read_u64(bytes: [u8; 8]) -> u64 {
80        u64::from_le_bytes(bytes)
81    }
82
83    #[inline]
84    fn read_u128(bytes: [u8; 16]) -> u128 {
85        u128::from_le_bytes(bytes)
86    }
87
88    #[inline]
89    fn read_i16(bytes: [u8; 2]) -> i16 {
90        i16::from_le_bytes(bytes)
91    }
92
93    #[inline]
94    fn read_i32(bytes: [u8; 4]) -> i32 {
95        i32::from_le_bytes(bytes)
96    }
97
98    #[inline]
99    fn read_i64(bytes: [u8; 8]) -> i64 {
100        i64::from_le_bytes(bytes)
101    }
102
103    #[inline]
104    fn read_i128(bytes: [u8; 16]) -> i128 {
105        i128::from_le_bytes(bytes)
106    }
107
108    #[inline]
109    fn write_u16(value: u16) -> [u8; 2] {
110        u16::to_le_bytes(value)
111    }
112
113    #[inline]
114    fn write_u32(value: u32) -> [u8; 4] {
115        u32::to_le_bytes(value)
116    }
117
118    #[inline]
119    fn write_u64(value: u64) -> [u8; 8] {
120        u64::to_le_bytes(value)
121    }
122
123    #[inline]
124    fn write_u128(value: u128) -> [u8; 16] {
125        u128::to_le_bytes(value)
126    }
127
128    #[inline]
129    fn write_i16(value: i16) -> [u8; 2] {
130        i16::to_le_bytes(value)
131    }
132
133    #[inline]
134    fn write_i32(value: i32) -> [u8; 4] {
135        i32::to_le_bytes(value)
136    }
137
138    #[inline]
139    fn write_i64(value: i64) -> [u8; 8] {
140        i64::to_le_bytes(value)
141    }
142
143    #[inline]
144    fn write_i128(value: i128) -> [u8; 16] {
145        i128::to_le_bytes(value)
146    }
147}
148
149/// Defines big-endian serialization.
150#[derive(Clone, Copy, Debug, Eq, Hash, Ord, PartialEq, PartialOrd)]
151pub enum BigEndian {}
152
153impl ByteOrder for BigEndian {
154    #[inline]
155    fn read_u16(bytes: [u8; 2]) -> u16 {
156        u16::from_be_bytes(bytes)
157    }
158
159    #[inline]
160    fn read_u32(bytes: [u8; 4]) -> u32 {
161        u32::from_be_bytes(bytes)
162    }
163
164    #[inline]
165    fn read_u64(bytes: [u8; 8]) -> u64 {
166        u64::from_be_bytes(bytes)
167    }
168
169    #[inline]
170    fn read_u128(bytes: [u8; 16]) -> u128 {
171        u128::from_be_bytes(bytes)
172    }
173
174    #[inline]
175    fn read_i16(bytes: [u8; 2]) -> i16 {
176        i16::from_be_bytes(bytes)
177    }
178
179    #[inline]
180    fn read_i32(bytes: [u8; 4]) -> i32 {
181        i32::from_be_bytes(bytes)
182    }
183
184    #[inline]
185    fn read_i64(bytes: [u8; 8]) -> i64 {
186        i64::from_be_bytes(bytes)
187    }
188
189    #[inline]
190    fn read_i128(bytes: [u8; 16]) -> i128 {
191        i128::from_be_bytes(bytes)
192    }
193
194    #[inline]
195    fn write_u16(value: u16) -> [u8; 2] {
196        u16::to_be_bytes(value)
197    }
198
199    #[inline]
200    fn write_u32(value: u32) -> [u8; 4] {
201        u32::to_be_bytes(value)
202    }
203
204    #[inline]
205    fn write_u64(value: u64) -> [u8; 8] {
206        u64::to_be_bytes(value)
207    }
208
209    #[inline]
210    fn write_u128(value: u128) -> [u8; 16] {
211        u128::to_be_bytes(value)
212    }
213
214    #[inline]
215    fn write_i16(value: i16) -> [u8; 2] {
216        i16::to_be_bytes(value)
217    }
218
219    #[inline]
220    fn write_i32(value: i32) -> [u8; 4] {
221        i32::to_be_bytes(value)
222    }
223
224    #[inline]
225    fn write_i64(value: i64) -> [u8; 8] {
226        i64::to_be_bytes(value)
227    }
228
229    #[inline]
230    fn write_i128(value: i128) -> [u8; 16] {
231        i128::to_be_bytes(value)
232    }
233}
234
235/// Defines the network byte order, which is the same as [BigEndian].
236pub type NetworkEndian = BigEndian;
237
238/// Defines system native-endian byte order.
239#[cfg(target_endian = "little")]
240pub type NativeEndian = LittleEndian;
241
242/// Defines system native-endian byte order.
243#[cfg(target_endian = "big")]
244pub type NativeEndian = BigEndian;