Coverage Report

Created: 2026-03-26 07:41

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/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;