musli_binary_common/int/
byteorder.rs1use 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
10pub trait ByteOrder:
12 Clone + Copy + Debug + Eq + Hash + Ord + PartialEq + PartialOrd + private::Sealed
13{
14 fn read_u16(bytes: [u8; 2]) -> u16;
16
17 fn read_u32(bytes: [u8; 4]) -> u32;
19
20 fn read_u64(bytes: [u8; 8]) -> u64;
22
23 fn read_u128(bytes: [u8; 16]) -> u128;
25
26 fn read_i16(bytes: [u8; 2]) -> i16;
28
29 fn read_i32(bytes: [u8; 4]) -> i32;
31
32 fn read_i64(bytes: [u8; 8]) -> i64;
34
35 fn read_i128(bytes: [u8; 16]) -> i128;
37
38 fn write_u16(value: u16) -> [u8; 2];
40
41 fn write_u32(value: u32) -> [u8; 4];
43
44 fn write_u64(value: u64) -> [u8; 8];
46
47 fn write_u128(value: u128) -> [u8; 16];
49
50 fn write_i16(value: i16) -> [u8; 2];
52
53 fn write_i32(value: i32) -> [u8; 4];
55
56 fn write_i64(value: i64) -> [u8; 8];
58
59 fn write_i128(value: i128) -> [u8; 16];
61}
62
63#[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#[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
235pub type NetworkEndian = BigEndian;
237
238#[cfg(target_endian = "little")]
240pub type NativeEndian = LittleEndian;
241
242#[cfg(target_endian = "big")]
244pub type NativeEndian = BigEndian;