/rust/registry/src/index.crates.io-1949cf8c6b5b557f/gimli-0.33.0/src/endianity.rs
Line | Count | Source |
1 | | //! Types for compile-time and run-time endianity. |
2 | | |
3 | | use core::convert::TryInto; |
4 | | use core::fmt::Debug; |
5 | | |
6 | | /// A trait describing the endianity of some buffer. |
7 | | pub trait Endianity: Debug + Default + Clone + Copy + PartialEq + Eq { |
8 | | /// Return true for big endian byte order. |
9 | | fn is_big_endian(self) -> bool; |
10 | | |
11 | | /// Return true for little endian byte order. |
12 | | #[inline] |
13 | 0 | fn is_little_endian(self) -> bool { |
14 | 0 | !self.is_big_endian() |
15 | 0 | } |
16 | | |
17 | | /// Reads an unsigned 16 bit integer from `buf`. |
18 | | /// |
19 | | /// # Panics |
20 | | /// |
21 | | /// Panics when `buf.len() < 2`. |
22 | | #[inline] |
23 | 0 | fn read_u16(self, buf: &[u8]) -> u16 { |
24 | 0 | let bytes: &[u8; 2] = buf[..2].try_into().unwrap(); |
25 | 0 | if self.is_big_endian() { |
26 | 0 | u16::from_be_bytes(*bytes) |
27 | | } else { |
28 | 0 | u16::from_le_bytes(*bytes) |
29 | | } |
30 | 0 | } |
31 | | |
32 | | /// Reads an unsigned 32 bit integer from `buf`. |
33 | | /// |
34 | | /// # Panics |
35 | | /// |
36 | | /// Panics when `buf.len() < 4`. |
37 | | #[inline] |
38 | 0 | fn read_u32(self, buf: &[u8]) -> u32 { |
39 | 0 | let bytes: &[u8; 4] = buf[..4].try_into().unwrap(); |
40 | 0 | if self.is_big_endian() { |
41 | 0 | u32::from_be_bytes(*bytes) |
42 | | } else { |
43 | 0 | u32::from_le_bytes(*bytes) |
44 | | } |
45 | 0 | } |
46 | | |
47 | | /// Reads an unsigned 64 bit integer from `buf`. |
48 | | /// |
49 | | /// # Panics |
50 | | /// |
51 | | /// Panics when `buf.len() < 8`. |
52 | | #[inline] |
53 | 0 | fn read_u64(self, buf: &[u8]) -> u64 { |
54 | 0 | let bytes: &[u8; 8] = buf[..8].try_into().unwrap(); |
55 | 0 | if self.is_big_endian() { |
56 | 0 | u64::from_be_bytes(*bytes) |
57 | | } else { |
58 | 0 | u64::from_le_bytes(*bytes) |
59 | | } |
60 | 0 | } |
61 | | |
62 | | /// Reads an unsigned 128 bit integer from `buf`. |
63 | | /// |
64 | | /// # Panics |
65 | | /// |
66 | | /// Panics when `buf.len() < 16`. |
67 | | #[inline] |
68 | 0 | fn read_u128(self, buf: &[u8]) -> u128 { |
69 | 0 | let bytes: &[u8; 16] = buf[..16].try_into().unwrap(); |
70 | 0 | if self.is_big_endian() { |
71 | 0 | u128::from_be_bytes(*bytes) |
72 | | } else { |
73 | 0 | u128::from_le_bytes(*bytes) |
74 | | } |
75 | 0 | } |
76 | | |
77 | | /// Read an unsigned n-bytes integer u64. |
78 | | /// |
79 | | /// # Panics |
80 | | /// |
81 | | /// Panics when `buf.len() < 1` or `buf.len() > 8`. |
82 | | #[inline] |
83 | 0 | fn read_uint(&mut self, buf: &[u8]) -> u64 { |
84 | 0 | let mut tmp = [0; 8]; |
85 | 0 | if self.is_big_endian() { |
86 | 0 | tmp[8 - buf.len()..].copy_from_slice(buf); |
87 | 0 | } else { |
88 | 0 | tmp[..buf.len()].copy_from_slice(buf); |
89 | 0 | } |
90 | 0 | self.read_u64(&tmp) |
91 | 0 | } |
92 | | |
93 | | /// Reads a signed 16 bit integer from `buf`. |
94 | | /// |
95 | | /// # Panics |
96 | | /// |
97 | | /// Panics when `buf.len() < 2`. |
98 | | #[inline] |
99 | 0 | fn read_i16(self, buf: &[u8]) -> i16 { |
100 | 0 | self.read_u16(buf) as i16 |
101 | 0 | } |
102 | | |
103 | | /// Reads a signed 32 bit integer from `buf`. |
104 | | /// |
105 | | /// # Panics |
106 | | /// |
107 | | /// Panics when `buf.len() < 4`. |
108 | | #[inline] |
109 | 0 | fn read_i32(self, buf: &[u8]) -> i32 { |
110 | 0 | self.read_u32(buf) as i32 |
111 | 0 | } |
112 | | |
113 | | /// Reads a signed 64 bit integer from `buf`. |
114 | | /// |
115 | | /// # Panics |
116 | | /// |
117 | | /// Panics when `buf.len() < 8`. |
118 | | #[inline] |
119 | 0 | fn read_i64(self, buf: &[u8]) -> i64 { |
120 | 0 | self.read_u64(buf) as i64 |
121 | 0 | } |
122 | | |
123 | | /// Reads a 32 bit floating point number from `buf`. |
124 | | /// |
125 | | /// # Panics |
126 | | /// |
127 | | /// Panics when `buf.len() < 8`. |
128 | | #[inline] |
129 | 0 | fn read_f32(self, buf: &[u8]) -> f32 { |
130 | 0 | f32::from_bits(self.read_u32(buf)) |
131 | 0 | } |
132 | | |
133 | | /// Reads a 32 bit floating point number from `buf`. |
134 | | /// |
135 | | /// # Panics |
136 | | /// |
137 | | /// Panics when `buf.len() < 8`. |
138 | | #[inline] |
139 | 0 | fn read_f64(self, buf: &[u8]) -> f64 { |
140 | 0 | f64::from_bits(self.read_u64(buf)) |
141 | 0 | } |
142 | | |
143 | | /// Writes an unsigned 16 bit integer `n` to `buf`. |
144 | | /// |
145 | | /// # Panics |
146 | | /// |
147 | | /// Panics when `buf.len() < 2`. |
148 | | #[inline] |
149 | 0 | fn write_u16(self, buf: &mut [u8], n: u16) { |
150 | 0 | let bytes = if self.is_big_endian() { |
151 | 0 | n.to_be_bytes() |
152 | | } else { |
153 | 0 | n.to_le_bytes() |
154 | | }; |
155 | 0 | buf[..2].copy_from_slice(&bytes); |
156 | 0 | } Unexecuted instantiation: <gimli::endianity::RunTimeEndian as gimli::endianity::Endianity>::write_u16 Unexecuted instantiation: <_ as gimli::endianity::Endianity>::write_u16 Unexecuted instantiation: <gimli::endianity::RunTimeEndian as gimli::endianity::Endianity>::write_u16 Unexecuted instantiation: <gimli::endianity::RunTimeEndian as gimli::endianity::Endianity>::write_u16 Unexecuted instantiation: <gimli::endianity::RunTimeEndian as gimli::endianity::Endianity>::write_u16 |
157 | | |
158 | | /// Writes an unsigned 32 bit integer `n` to `buf`. |
159 | | /// |
160 | | /// # Panics |
161 | | /// |
162 | | /// Panics when `buf.len() < 4`. |
163 | | #[inline] |
164 | 445k | fn write_u32(self, buf: &mut [u8], n: u32) { |
165 | 445k | let bytes = if self.is_big_endian() { |
166 | 0 | n.to_be_bytes() |
167 | | } else { |
168 | 445k | n.to_le_bytes() |
169 | | }; |
170 | 445k | buf[..4].copy_from_slice(&bytes); |
171 | 445k | } Unexecuted instantiation: <gimli::endianity::RunTimeEndian as gimli::endianity::Endianity>::write_u32 Unexecuted instantiation: <_ as gimli::endianity::Endianity>::write_u32 <gimli::endianity::RunTimeEndian as gimli::endianity::Endianity>::write_u32 Line | Count | Source | 164 | 77.3k | fn write_u32(self, buf: &mut [u8], n: u32) { | 165 | 77.3k | let bytes = if self.is_big_endian() { | 166 | 0 | n.to_be_bytes() | 167 | | } else { | 168 | 77.3k | n.to_le_bytes() | 169 | | }; | 170 | 77.3k | buf[..4].copy_from_slice(&bytes); | 171 | 77.3k | } |
<gimli::endianity::RunTimeEndian as gimli::endianity::Endianity>::write_u32 Line | Count | Source | 164 | 367k | fn write_u32(self, buf: &mut [u8], n: u32) { | 165 | 367k | let bytes = if self.is_big_endian() { | 166 | 0 | n.to_be_bytes() | 167 | | } else { | 168 | 367k | n.to_le_bytes() | 169 | | }; | 170 | 367k | buf[..4].copy_from_slice(&bytes); | 171 | 367k | } |
Unexecuted instantiation: <gimli::endianity::RunTimeEndian as gimli::endianity::Endianity>::write_u32 |
172 | | |
173 | | /// Writes an unsigned 64 bit integer `n` to `buf`. |
174 | | /// |
175 | | /// # Panics |
176 | | /// |
177 | | /// Panics when `buf.len() < 8`. |
178 | | #[inline] |
179 | 413k | fn write_u64(self, buf: &mut [u8], n: u64) { |
180 | 413k | let bytes = if self.is_big_endian() { |
181 | 0 | n.to_be_bytes() |
182 | | } else { |
183 | 413k | n.to_le_bytes() |
184 | | }; |
185 | 413k | buf[..8].copy_from_slice(&bytes); |
186 | 413k | } Unexecuted instantiation: <gimli::endianity::RunTimeEndian as gimli::endianity::Endianity>::write_u64 Unexecuted instantiation: <_ as gimli::endianity::Endianity>::write_u64 <gimli::endianity::RunTimeEndian as gimli::endianity::Endianity>::write_u64 Line | Count | Source | 179 | 51.2k | fn write_u64(self, buf: &mut [u8], n: u64) { | 180 | 51.2k | let bytes = if self.is_big_endian() { | 181 | 0 | n.to_be_bytes() | 182 | | } else { | 183 | 51.2k | n.to_le_bytes() | 184 | | }; | 185 | 51.2k | buf[..8].copy_from_slice(&bytes); | 186 | 51.2k | } |
<gimli::endianity::RunTimeEndian as gimli::endianity::Endianity>::write_u64 Line | Count | Source | 179 | 361k | fn write_u64(self, buf: &mut [u8], n: u64) { | 180 | 361k | let bytes = if self.is_big_endian() { | 181 | 0 | n.to_be_bytes() | 182 | | } else { | 183 | 361k | n.to_le_bytes() | 184 | | }; | 185 | 361k | buf[..8].copy_from_slice(&bytes); | 186 | 361k | } |
Unexecuted instantiation: <gimli::endianity::RunTimeEndian as gimli::endianity::Endianity>::write_u64 |
187 | | |
188 | | /// Writes an unsigned 128 bit integer `n` to `buf`. |
189 | | /// |
190 | | /// # Panics |
191 | | /// |
192 | | /// Panics when `buf.len() < 16`. |
193 | | #[inline] |
194 | 0 | fn write_u128(self, buf: &mut [u8], n: u128) { |
195 | 0 | let bytes = if self.is_big_endian() { |
196 | 0 | n.to_be_bytes() |
197 | | } else { |
198 | 0 | n.to_le_bytes() |
199 | | }; |
200 | 0 | buf[..16].copy_from_slice(&bytes); |
201 | 0 | } |
202 | | } |
203 | | |
204 | | /// Byte order that is selectable at runtime. |
205 | | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
206 | | pub enum RunTimeEndian { |
207 | | /// Little endian byte order. |
208 | | Little, |
209 | | /// Big endian byte order. |
210 | | Big, |
211 | | } |
212 | | |
213 | | impl Default for RunTimeEndian { |
214 | | #[cfg(target_endian = "little")] |
215 | | #[inline] |
216 | 0 | fn default() -> RunTimeEndian { |
217 | 0 | RunTimeEndian::Little |
218 | 0 | } |
219 | | |
220 | | #[cfg(target_endian = "big")] |
221 | | #[inline] |
222 | | fn default() -> RunTimeEndian { |
223 | | RunTimeEndian::Big |
224 | | } |
225 | | } |
226 | | |
227 | | impl Endianity for RunTimeEndian { |
228 | | #[inline] |
229 | 858k | fn is_big_endian(self) -> bool { |
230 | 858k | self != RunTimeEndian::Little |
231 | 858k | } |
232 | | } |
233 | | |
234 | | /// Little endian byte order. |
235 | | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
236 | | pub struct LittleEndian; |
237 | | |
238 | | impl Default for LittleEndian { |
239 | | #[inline] |
240 | 0 | fn default() -> LittleEndian { |
241 | 0 | LittleEndian |
242 | 0 | } |
243 | | } |
244 | | |
245 | | impl Endianity for LittleEndian { |
246 | | #[inline] |
247 | 0 | fn is_big_endian(self) -> bool { |
248 | 0 | false |
249 | 0 | } |
250 | | } |
251 | | |
252 | | /// Big endian byte order. |
253 | | #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)] |
254 | | pub struct BigEndian; |
255 | | |
256 | | impl Default for BigEndian { |
257 | | #[inline] |
258 | 0 | fn default() -> BigEndian { |
259 | 0 | BigEndian |
260 | 0 | } |
261 | | } |
262 | | |
263 | | impl Endianity for BigEndian { |
264 | | #[inline] |
265 | 0 | fn is_big_endian(self) -> bool { |
266 | 0 | true |
267 | 0 | } |
268 | | } |
269 | | |
270 | | /// The native endianity for the target platform. |
271 | | #[cfg(target_endian = "little")] |
272 | | pub type NativeEndian = LittleEndian; |
273 | | |
274 | | #[cfg(target_endian = "little")] |
275 | | #[allow(non_upper_case_globals)] |
276 | | #[doc(hidden)] |
277 | | pub const NativeEndian: LittleEndian = LittleEndian; |
278 | | |
279 | | /// The native endianity for the target platform. |
280 | | #[cfg(target_endian = "big")] |
281 | | pub type NativeEndian = BigEndian; |
282 | | |
283 | | #[cfg(target_endian = "big")] |
284 | | #[allow(non_upper_case_globals)] |
285 | | #[doc(hidden)] |
286 | | pub const NativeEndian: BigEndian = BigEndian; |