/rust/registry/src/index.crates.io-6f17d22bba15001f/num-traits-0.2.15/src/int.rs
Line | Count | Source (jump to first uncovered line) |
1 | | use core::ops::{BitAnd, BitOr, BitXor, Not, Shl, Shr}; |
2 | | |
3 | | use bounds::Bounded; |
4 | | use ops::checked::*; |
5 | | use ops::saturating::Saturating; |
6 | | use {Num, NumCast}; |
7 | | |
8 | | /// Generic trait for primitive integers. |
9 | | /// |
10 | | /// The `PrimInt` trait is an abstraction over the builtin primitive integer types (e.g., `u8`, |
11 | | /// `u32`, `isize`, `i128`, ...). It inherits the basic numeric traits and extends them with |
12 | | /// bitwise operators and non-wrapping arithmetic. |
13 | | /// |
14 | | /// The trait explicitly inherits `Copy`, `Eq`, `Ord`, and `Sized`. The intention is that all |
15 | | /// types implementing this trait behave like primitive types that are passed by value by default |
16 | | /// and behave like builtin integers. Furthermore, the types are expected to expose the integer |
17 | | /// value in binary representation and support bitwise operators. The standard bitwise operations |
18 | | /// (e.g., bitwise-and, bitwise-or, right-shift, left-shift) are inherited and the trait extends |
19 | | /// these with introspective queries (e.g., `PrimInt::count_ones()`, `PrimInt::leading_zeros()`), |
20 | | /// bitwise combinators (e.g., `PrimInt::rotate_left()`), and endianness converters (e.g., |
21 | | /// `PrimInt::to_be()`). |
22 | | /// |
23 | | /// All `PrimInt` types are expected to be fixed-width binary integers. The width can be queried |
24 | | /// via `T::zero().count_zeros()`. The trait currently lacks a way to query the width at |
25 | | /// compile-time. |
26 | | /// |
27 | | /// While a default implementation for all builtin primitive integers is provided, the trait is in |
28 | | /// no way restricted to these. Other integer types that fulfil the requirements are free to |
29 | | /// implement the trait was well. |
30 | | /// |
31 | | /// This trait and many of the method names originate in the unstable `core::num::Int` trait from |
32 | | /// the rust standard library. The original trait was never stabilized and thus removed from the |
33 | | /// standard library. |
34 | | pub trait PrimInt: |
35 | | Sized |
36 | | + Copy |
37 | | + Num |
38 | | + NumCast |
39 | | + Bounded |
40 | | + PartialOrd |
41 | | + Ord |
42 | | + Eq |
43 | | + Not<Output = Self> |
44 | | + BitAnd<Output = Self> |
45 | | + BitOr<Output = Self> |
46 | | + BitXor<Output = Self> |
47 | | + Shl<usize, Output = Self> |
48 | | + Shr<usize, Output = Self> |
49 | | + CheckedAdd<Output = Self> |
50 | | + CheckedSub<Output = Self> |
51 | | + CheckedMul<Output = Self> |
52 | | + CheckedDiv<Output = Self> |
53 | | + Saturating |
54 | | { |
55 | | /// Returns the number of ones in the binary representation of `self`. |
56 | | /// |
57 | | /// # Examples |
58 | | /// |
59 | | /// ``` |
60 | | /// use num_traits::PrimInt; |
61 | | /// |
62 | | /// let n = 0b01001100u8; |
63 | | /// |
64 | | /// assert_eq!(n.count_ones(), 3); |
65 | | /// ``` |
66 | | fn count_ones(self) -> u32; |
67 | | |
68 | | /// Returns the number of zeros in the binary representation of `self`. |
69 | | /// |
70 | | /// # Examples |
71 | | /// |
72 | | /// ``` |
73 | | /// use num_traits::PrimInt; |
74 | | /// |
75 | | /// let n = 0b01001100u8; |
76 | | /// |
77 | | /// assert_eq!(n.count_zeros(), 5); |
78 | | /// ``` |
79 | | fn count_zeros(self) -> u32; |
80 | | |
81 | | /// Returns the number of leading ones in the binary representation |
82 | | /// of `self`. |
83 | | /// |
84 | | /// # Examples |
85 | | /// |
86 | | /// ``` |
87 | | /// use num_traits::PrimInt; |
88 | | /// |
89 | | /// let n = 0xF00Du16; |
90 | | /// |
91 | | /// assert_eq!(n.leading_ones(), 4); |
92 | | /// ``` |
93 | 0 | fn leading_ones(self) -> u32 { |
94 | 0 | (!self).leading_zeros() |
95 | 0 | } |
96 | | |
97 | | /// Returns the number of leading zeros in the binary representation |
98 | | /// of `self`. |
99 | | /// |
100 | | /// # Examples |
101 | | /// |
102 | | /// ``` |
103 | | /// use num_traits::PrimInt; |
104 | | /// |
105 | | /// let n = 0b0101000u16; |
106 | | /// |
107 | | /// assert_eq!(n.leading_zeros(), 10); |
108 | | /// ``` |
109 | | fn leading_zeros(self) -> u32; |
110 | | |
111 | | /// Returns the number of trailing ones in the binary representation |
112 | | /// of `self`. |
113 | | /// |
114 | | /// # Examples |
115 | | /// |
116 | | /// ``` |
117 | | /// use num_traits::PrimInt; |
118 | | /// |
119 | | /// let n = 0xBEEFu16; |
120 | | /// |
121 | | /// assert_eq!(n.trailing_ones(), 4); |
122 | | /// ``` |
123 | 0 | fn trailing_ones(self) -> u32 { |
124 | 0 | (!self).trailing_zeros() |
125 | 0 | } |
126 | | |
127 | | /// Returns the number of trailing zeros in the binary representation |
128 | | /// of `self`. |
129 | | /// |
130 | | /// # Examples |
131 | | /// |
132 | | /// ``` |
133 | | /// use num_traits::PrimInt; |
134 | | /// |
135 | | /// let n = 0b0101000u16; |
136 | | /// |
137 | | /// assert_eq!(n.trailing_zeros(), 3); |
138 | | /// ``` |
139 | | fn trailing_zeros(self) -> u32; |
140 | | |
141 | | /// Shifts the bits to the left by a specified amount, `n`, wrapping |
142 | | /// the truncated bits to the end of the resulting integer. |
143 | | /// |
144 | | /// # Examples |
145 | | /// |
146 | | /// ``` |
147 | | /// use num_traits::PrimInt; |
148 | | /// |
149 | | /// let n = 0x0123456789ABCDEFu64; |
150 | | /// let m = 0x3456789ABCDEF012u64; |
151 | | /// |
152 | | /// assert_eq!(n.rotate_left(12), m); |
153 | | /// ``` |
154 | | fn rotate_left(self, n: u32) -> Self; |
155 | | |
156 | | /// Shifts the bits to the right by a specified amount, `n`, wrapping |
157 | | /// the truncated bits to the beginning of the resulting integer. |
158 | | /// |
159 | | /// # Examples |
160 | | /// |
161 | | /// ``` |
162 | | /// use num_traits::PrimInt; |
163 | | /// |
164 | | /// let n = 0x0123456789ABCDEFu64; |
165 | | /// let m = 0xDEF0123456789ABCu64; |
166 | | /// |
167 | | /// assert_eq!(n.rotate_right(12), m); |
168 | | /// ``` |
169 | | fn rotate_right(self, n: u32) -> Self; |
170 | | |
171 | | /// Shifts the bits to the left by a specified amount, `n`, filling |
172 | | /// zeros in the least significant bits. |
173 | | /// |
174 | | /// This is bitwise equivalent to signed `Shl`. |
175 | | /// |
176 | | /// # Examples |
177 | | /// |
178 | | /// ``` |
179 | | /// use num_traits::PrimInt; |
180 | | /// |
181 | | /// let n = 0x0123456789ABCDEFu64; |
182 | | /// let m = 0x3456789ABCDEF000u64; |
183 | | /// |
184 | | /// assert_eq!(n.signed_shl(12), m); |
185 | | /// ``` |
186 | | fn signed_shl(self, n: u32) -> Self; |
187 | | |
188 | | /// Shifts the bits to the right by a specified amount, `n`, copying |
189 | | /// the "sign bit" in the most significant bits even for unsigned types. |
190 | | /// |
191 | | /// This is bitwise equivalent to signed `Shr`. |
192 | | /// |
193 | | /// # Examples |
194 | | /// |
195 | | /// ``` |
196 | | /// use num_traits::PrimInt; |
197 | | /// |
198 | | /// let n = 0xFEDCBA9876543210u64; |
199 | | /// let m = 0xFFFFEDCBA9876543u64; |
200 | | /// |
201 | | /// assert_eq!(n.signed_shr(12), m); |
202 | | /// ``` |
203 | | fn signed_shr(self, n: u32) -> Self; |
204 | | |
205 | | /// Shifts the bits to the left by a specified amount, `n`, filling |
206 | | /// zeros in the least significant bits. |
207 | | /// |
208 | | /// This is bitwise equivalent to unsigned `Shl`. |
209 | | /// |
210 | | /// # Examples |
211 | | /// |
212 | | /// ``` |
213 | | /// use num_traits::PrimInt; |
214 | | /// |
215 | | /// let n = 0x0123456789ABCDEFi64; |
216 | | /// let m = 0x3456789ABCDEF000i64; |
217 | | /// |
218 | | /// assert_eq!(n.unsigned_shl(12), m); |
219 | | /// ``` |
220 | | fn unsigned_shl(self, n: u32) -> Self; |
221 | | |
222 | | /// Shifts the bits to the right by a specified amount, `n`, filling |
223 | | /// zeros in the most significant bits. |
224 | | /// |
225 | | /// This is bitwise equivalent to unsigned `Shr`. |
226 | | /// |
227 | | /// # Examples |
228 | | /// |
229 | | /// ``` |
230 | | /// use num_traits::PrimInt; |
231 | | /// |
232 | | /// let n = -8i8; // 0b11111000 |
233 | | /// let m = 62i8; // 0b00111110 |
234 | | /// |
235 | | /// assert_eq!(n.unsigned_shr(2), m); |
236 | | /// ``` |
237 | | fn unsigned_shr(self, n: u32) -> Self; |
238 | | |
239 | | /// Reverses the byte order of the integer. |
240 | | /// |
241 | | /// # Examples |
242 | | /// |
243 | | /// ``` |
244 | | /// use num_traits::PrimInt; |
245 | | /// |
246 | | /// let n = 0x0123456789ABCDEFu64; |
247 | | /// let m = 0xEFCDAB8967452301u64; |
248 | | /// |
249 | | /// assert_eq!(n.swap_bytes(), m); |
250 | | /// ``` |
251 | | fn swap_bytes(self) -> Self; |
252 | | |
253 | | /// Reverses the order of bits in the integer. |
254 | | /// |
255 | | /// The least significant bit becomes the most significant bit, second least-significant bit |
256 | | /// becomes second most-significant bit, etc. |
257 | | /// |
258 | | /// # Examples |
259 | | /// |
260 | | /// ``` |
261 | | /// use num_traits::PrimInt; |
262 | | /// |
263 | | /// let n = 0x12345678u32; |
264 | | /// let m = 0x1e6a2c48u32; |
265 | | /// |
266 | | /// assert_eq!(n.reverse_bits(), m); |
267 | | /// assert_eq!(0u32.reverse_bits(), 0); |
268 | | /// ``` |
269 | 0 | fn reverse_bits(self) -> Self { |
270 | 0 | reverse_bits_fallback(self) |
271 | 0 | } |
272 | | |
273 | | /// Convert an integer from big endian to the target's endianness. |
274 | | /// |
275 | | /// On big endian this is a no-op. On little endian the bytes are swapped. |
276 | | /// |
277 | | /// # Examples |
278 | | /// |
279 | | /// ``` |
280 | | /// use num_traits::PrimInt; |
281 | | /// |
282 | | /// let n = 0x0123456789ABCDEFu64; |
283 | | /// |
284 | | /// if cfg!(target_endian = "big") { |
285 | | /// assert_eq!(u64::from_be(n), n) |
286 | | /// } else { |
287 | | /// assert_eq!(u64::from_be(n), n.swap_bytes()) |
288 | | /// } |
289 | | /// ``` |
290 | | fn from_be(x: Self) -> Self; |
291 | | |
292 | | /// Convert an integer from little endian to the target's endianness. |
293 | | /// |
294 | | /// On little endian this is a no-op. On big endian the bytes are swapped. |
295 | | /// |
296 | | /// # Examples |
297 | | /// |
298 | | /// ``` |
299 | | /// use num_traits::PrimInt; |
300 | | /// |
301 | | /// let n = 0x0123456789ABCDEFu64; |
302 | | /// |
303 | | /// if cfg!(target_endian = "little") { |
304 | | /// assert_eq!(u64::from_le(n), n) |
305 | | /// } else { |
306 | | /// assert_eq!(u64::from_le(n), n.swap_bytes()) |
307 | | /// } |
308 | | /// ``` |
309 | | fn from_le(x: Self) -> Self; |
310 | | |
311 | | /// Convert `self` to big endian from the target's endianness. |
312 | | /// |
313 | | /// On big endian this is a no-op. On little endian the bytes are swapped. |
314 | | /// |
315 | | /// # Examples |
316 | | /// |
317 | | /// ``` |
318 | | /// use num_traits::PrimInt; |
319 | | /// |
320 | | /// let n = 0x0123456789ABCDEFu64; |
321 | | /// |
322 | | /// if cfg!(target_endian = "big") { |
323 | | /// assert_eq!(n.to_be(), n) |
324 | | /// } else { |
325 | | /// assert_eq!(n.to_be(), n.swap_bytes()) |
326 | | /// } |
327 | | /// ``` |
328 | | fn to_be(self) -> Self; |
329 | | |
330 | | /// Convert `self` to little endian from the target's endianness. |
331 | | /// |
332 | | /// On little endian this is a no-op. On big endian the bytes are swapped. |
333 | | /// |
334 | | /// # Examples |
335 | | /// |
336 | | /// ``` |
337 | | /// use num_traits::PrimInt; |
338 | | /// |
339 | | /// let n = 0x0123456789ABCDEFu64; |
340 | | /// |
341 | | /// if cfg!(target_endian = "little") { |
342 | | /// assert_eq!(n.to_le(), n) |
343 | | /// } else { |
344 | | /// assert_eq!(n.to_le(), n.swap_bytes()) |
345 | | /// } |
346 | | /// ``` |
347 | | fn to_le(self) -> Self; |
348 | | |
349 | | /// Raises self to the power of `exp`, using exponentiation by squaring. |
350 | | /// |
351 | | /// # Examples |
352 | | /// |
353 | | /// ``` |
354 | | /// use num_traits::PrimInt; |
355 | | /// |
356 | | /// assert_eq!(2i32.pow(4), 16); |
357 | | /// ``` |
358 | | fn pow(self, exp: u32) -> Self; |
359 | | } |
360 | | |
361 | 0 | fn one_per_byte<P: PrimInt>() -> P { |
362 | 0 | // i8, u8: return 0x01 |
363 | 0 | // i16, u16: return 0x0101 = (0x01 << 8) | 0x01 |
364 | 0 | // i32, u32: return 0x01010101 = (0x0101 << 16) | 0x0101 |
365 | 0 | // ... |
366 | 0 | let mut ret = P::one(); |
367 | 0 | let mut shift = 8; |
368 | 0 | let mut b = ret.count_zeros() >> 3; |
369 | 0 | while b != 0 { |
370 | 0 | ret = (ret << shift) | ret; |
371 | 0 | shift <<= 1; |
372 | 0 | b >>= 1; |
373 | 0 | } |
374 | 0 | ret |
375 | 0 | } |
376 | | |
377 | 0 | fn reverse_bits_fallback<P: PrimInt>(i: P) -> P { |
378 | 0 | let rep_01: P = one_per_byte(); |
379 | 0 | let rep_03 = (rep_01 << 1) | rep_01; |
380 | 0 | let rep_05 = (rep_01 << 2) | rep_01; |
381 | 0 | let rep_0f = (rep_03 << 2) | rep_03; |
382 | 0 | let rep_33 = (rep_03 << 4) | rep_03; |
383 | 0 | let rep_55 = (rep_05 << 4) | rep_05; |
384 | 0 |
|
385 | 0 | // code above only used to determine rep_0f, rep_33, rep_55; |
386 | 0 | // optimizer should be able to do it in compile time |
387 | 0 | let mut ret = i.swap_bytes(); |
388 | 0 | ret = ((ret & rep_0f) << 4) | ((ret >> 4) & rep_0f); |
389 | 0 | ret = ((ret & rep_33) << 2) | ((ret >> 2) & rep_33); |
390 | 0 | ret = ((ret & rep_55) << 1) | ((ret >> 1) & rep_55); |
391 | 0 | ret |
392 | 0 | } |
393 | | |
394 | | macro_rules! prim_int_impl { |
395 | | ($T:ty, $S:ty, $U:ty) => { |
396 | | impl PrimInt for $T { |
397 | | #[inline] |
398 | 0 | fn count_ones(self) -> u32 { |
399 | 0 | <$T>::count_ones(self) |
400 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::count_ones Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::count_ones Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::count_ones Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::count_ones Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::count_ones Unexecuted instantiation: <usize as num_traits::int::PrimInt>::count_ones Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::count_ones Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::count_ones Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::count_ones Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::count_ones Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::count_ones Unexecuted instantiation: <isize as num_traits::int::PrimInt>::count_ones |
401 | | |
402 | | #[inline] |
403 | 0 | fn count_zeros(self) -> u32 { |
404 | 0 | <$T>::count_zeros(self) |
405 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::count_zeros Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::count_zeros Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::count_zeros Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::count_zeros Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::count_zeros Unexecuted instantiation: <usize as num_traits::int::PrimInt>::count_zeros Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::count_zeros Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::count_zeros Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::count_zeros Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::count_zeros Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::count_zeros Unexecuted instantiation: <isize as num_traits::int::PrimInt>::count_zeros |
406 | | |
407 | | #[cfg(has_leading_trailing_ones)] |
408 | | #[inline] |
409 | 0 | fn leading_ones(self) -> u32 { |
410 | 0 | <$T>::leading_ones(self) |
411 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::leading_ones Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::leading_ones Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::leading_ones Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::leading_ones Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::leading_ones Unexecuted instantiation: <usize as num_traits::int::PrimInt>::leading_ones Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::leading_ones Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::leading_ones Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::leading_ones Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::leading_ones Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::leading_ones Unexecuted instantiation: <isize as num_traits::int::PrimInt>::leading_ones |
412 | | |
413 | | #[inline] |
414 | 0 | fn leading_zeros(self) -> u32 { |
415 | 0 | <$T>::leading_zeros(self) |
416 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::leading_zeros Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::leading_zeros Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::leading_zeros Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::leading_zeros Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::leading_zeros Unexecuted instantiation: <usize as num_traits::int::PrimInt>::leading_zeros Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::leading_zeros Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::leading_zeros Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::leading_zeros Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::leading_zeros Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::leading_zeros Unexecuted instantiation: <isize as num_traits::int::PrimInt>::leading_zeros |
417 | | |
418 | | #[cfg(has_leading_trailing_ones)] |
419 | | #[inline] |
420 | 0 | fn trailing_ones(self) -> u32 { |
421 | 0 | <$T>::trailing_ones(self) |
422 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::trailing_ones Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::trailing_ones Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::trailing_ones Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::trailing_ones Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::trailing_ones Unexecuted instantiation: <usize as num_traits::int::PrimInt>::trailing_ones Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::trailing_ones Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::trailing_ones Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::trailing_ones Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::trailing_ones Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::trailing_ones Unexecuted instantiation: <isize as num_traits::int::PrimInt>::trailing_ones |
423 | | |
424 | | #[inline] |
425 | 0 | fn trailing_zeros(self) -> u32 { |
426 | 0 | <$T>::trailing_zeros(self) |
427 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::trailing_zeros Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::trailing_zeros Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::trailing_zeros Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::trailing_zeros Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::trailing_zeros Unexecuted instantiation: <usize as num_traits::int::PrimInt>::trailing_zeros Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::trailing_zeros Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::trailing_zeros Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::trailing_zeros Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::trailing_zeros Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::trailing_zeros Unexecuted instantiation: <isize as num_traits::int::PrimInt>::trailing_zeros |
428 | | |
429 | | #[inline] |
430 | 0 | fn rotate_left(self, n: u32) -> Self { |
431 | 0 | <$T>::rotate_left(self, n) |
432 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::rotate_left Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::rotate_left Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::rotate_left Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::rotate_left Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::rotate_left Unexecuted instantiation: <usize as num_traits::int::PrimInt>::rotate_left Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::rotate_left Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::rotate_left Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::rotate_left Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::rotate_left Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::rotate_left Unexecuted instantiation: <isize as num_traits::int::PrimInt>::rotate_left |
433 | | |
434 | | #[inline] |
435 | 0 | fn rotate_right(self, n: u32) -> Self { |
436 | 0 | <$T>::rotate_right(self, n) |
437 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::rotate_right Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::rotate_right Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::rotate_right Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::rotate_right Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::rotate_right Unexecuted instantiation: <usize as num_traits::int::PrimInt>::rotate_right Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::rotate_right Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::rotate_right Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::rotate_right Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::rotate_right Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::rotate_right Unexecuted instantiation: <isize as num_traits::int::PrimInt>::rotate_right |
438 | | |
439 | | #[inline] |
440 | 0 | fn signed_shl(self, n: u32) -> Self { |
441 | 0 | ((self as $S) << n) as $T |
442 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::signed_shl Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::signed_shl Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::signed_shl Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::signed_shl Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::signed_shl Unexecuted instantiation: <usize as num_traits::int::PrimInt>::signed_shl Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::signed_shl Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::signed_shl Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::signed_shl Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::signed_shl Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::signed_shl Unexecuted instantiation: <isize as num_traits::int::PrimInt>::signed_shl |
443 | | |
444 | | #[inline] |
445 | 0 | fn signed_shr(self, n: u32) -> Self { |
446 | 0 | ((self as $S) >> n) as $T |
447 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::signed_shr Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::signed_shr Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::signed_shr Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::signed_shr Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::signed_shr Unexecuted instantiation: <usize as num_traits::int::PrimInt>::signed_shr Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::signed_shr Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::signed_shr Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::signed_shr Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::signed_shr Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::signed_shr Unexecuted instantiation: <isize as num_traits::int::PrimInt>::signed_shr |
448 | | |
449 | | #[inline] |
450 | 0 | fn unsigned_shl(self, n: u32) -> Self { |
451 | 0 | ((self as $U) << n) as $T |
452 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::unsigned_shl Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::unsigned_shl Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::unsigned_shl Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::unsigned_shl Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::unsigned_shl Unexecuted instantiation: <usize as num_traits::int::PrimInt>::unsigned_shl Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::unsigned_shl Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::unsigned_shl Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::unsigned_shl Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::unsigned_shl Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::unsigned_shl Unexecuted instantiation: <isize as num_traits::int::PrimInt>::unsigned_shl |
453 | | |
454 | | #[inline] |
455 | 0 | fn unsigned_shr(self, n: u32) -> Self { |
456 | 0 | ((self as $U) >> n) as $T |
457 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::unsigned_shr Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::unsigned_shr Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::unsigned_shr Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::unsigned_shr Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::unsigned_shr Unexecuted instantiation: <usize as num_traits::int::PrimInt>::unsigned_shr Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::unsigned_shr Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::unsigned_shr Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::unsigned_shr Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::unsigned_shr Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::unsigned_shr Unexecuted instantiation: <isize as num_traits::int::PrimInt>::unsigned_shr |
458 | | |
459 | | #[inline] |
460 | 0 | fn swap_bytes(self) -> Self { |
461 | 0 | <$T>::swap_bytes(self) |
462 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::swap_bytes Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::swap_bytes Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::swap_bytes Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::swap_bytes Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::swap_bytes Unexecuted instantiation: <usize as num_traits::int::PrimInt>::swap_bytes Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::swap_bytes Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::swap_bytes Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::swap_bytes Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::swap_bytes Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::swap_bytes Unexecuted instantiation: <isize as num_traits::int::PrimInt>::swap_bytes |
463 | | |
464 | | #[cfg(has_reverse_bits)] |
465 | | #[inline] |
466 | 0 | fn reverse_bits(self) -> Self { |
467 | 0 | <$T>::reverse_bits(self) |
468 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::reverse_bits Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::reverse_bits Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::reverse_bits Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::reverse_bits Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::reverse_bits Unexecuted instantiation: <usize as num_traits::int::PrimInt>::reverse_bits Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::reverse_bits Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::reverse_bits Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::reverse_bits Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::reverse_bits Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::reverse_bits Unexecuted instantiation: <isize as num_traits::int::PrimInt>::reverse_bits |
469 | | |
470 | | #[inline] |
471 | 0 | fn from_be(x: Self) -> Self { |
472 | 0 | <$T>::from_be(x) |
473 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::from_be Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::from_be Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::from_be Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::from_be Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::from_be Unexecuted instantiation: <usize as num_traits::int::PrimInt>::from_be Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::from_be Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::from_be Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::from_be Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::from_be Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::from_be Unexecuted instantiation: <isize as num_traits::int::PrimInt>::from_be |
474 | | |
475 | | #[inline] |
476 | 0 | fn from_le(x: Self) -> Self { |
477 | 0 | <$T>::from_le(x) |
478 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::from_le Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::from_le Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::from_le Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::from_le Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::from_le Unexecuted instantiation: <usize as num_traits::int::PrimInt>::from_le Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::from_le Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::from_le Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::from_le Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::from_le Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::from_le Unexecuted instantiation: <isize as num_traits::int::PrimInt>::from_le |
479 | | |
480 | | #[inline] |
481 | 0 | fn to_be(self) -> Self { |
482 | 0 | <$T>::to_be(self) |
483 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::to_be Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::to_be Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::to_be Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::to_be Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::to_be Unexecuted instantiation: <usize as num_traits::int::PrimInt>::to_be Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::to_be Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::to_be Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::to_be Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::to_be Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::to_be Unexecuted instantiation: <isize as num_traits::int::PrimInt>::to_be |
484 | | |
485 | | #[inline] |
486 | 0 | fn to_le(self) -> Self { |
487 | 0 | <$T>::to_le(self) |
488 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::to_le Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::to_le Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::to_le Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::to_le Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::to_le Unexecuted instantiation: <usize as num_traits::int::PrimInt>::to_le Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::to_le Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::to_le Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::to_le Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::to_le Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::to_le Unexecuted instantiation: <isize as num_traits::int::PrimInt>::to_le |
489 | | |
490 | | #[inline] |
491 | 0 | fn pow(self, exp: u32) -> Self { |
492 | 0 | <$T>::pow(self, exp) |
493 | 0 | } Unexecuted instantiation: <u8 as num_traits::int::PrimInt>::pow Unexecuted instantiation: <u16 as num_traits::int::PrimInt>::pow Unexecuted instantiation: <u32 as num_traits::int::PrimInt>::pow Unexecuted instantiation: <u64 as num_traits::int::PrimInt>::pow Unexecuted instantiation: <u128 as num_traits::int::PrimInt>::pow Unexecuted instantiation: <usize as num_traits::int::PrimInt>::pow Unexecuted instantiation: <i8 as num_traits::int::PrimInt>::pow Unexecuted instantiation: <i16 as num_traits::int::PrimInt>::pow Unexecuted instantiation: <i32 as num_traits::int::PrimInt>::pow Unexecuted instantiation: <i64 as num_traits::int::PrimInt>::pow Unexecuted instantiation: <i128 as num_traits::int::PrimInt>::pow Unexecuted instantiation: <isize as num_traits::int::PrimInt>::pow |
494 | | } |
495 | | }; |
496 | | } |
497 | | |
498 | | // prim_int_impl!(type, signed, unsigned); |
499 | | prim_int_impl!(u8, i8, u8); |
500 | | prim_int_impl!(u16, i16, u16); |
501 | | prim_int_impl!(u32, i32, u32); |
502 | | prim_int_impl!(u64, i64, u64); |
503 | | #[cfg(has_i128)] |
504 | | prim_int_impl!(u128, i128, u128); |
505 | | prim_int_impl!(usize, isize, usize); |
506 | | prim_int_impl!(i8, i8, u8); |
507 | | prim_int_impl!(i16, i16, u16); |
508 | | prim_int_impl!(i32, i32, u32); |
509 | | prim_int_impl!(i64, i64, u64); |
510 | | #[cfg(has_i128)] |
511 | | prim_int_impl!(i128, i128, u128); |
512 | | prim_int_impl!(isize, isize, usize); |
513 | | |
514 | | #[cfg(test)] |
515 | | mod tests { |
516 | | use int::PrimInt; |
517 | | |
518 | | #[test] |
519 | | pub fn reverse_bits() { |
520 | | use core::{i16, i32, i64, i8}; |
521 | | |
522 | | assert_eq!( |
523 | | PrimInt::reverse_bits(0x0123_4567_89ab_cdefu64), |
524 | | 0xf7b3_d591_e6a2_c480 |
525 | | ); |
526 | | |
527 | | assert_eq!(PrimInt::reverse_bits(0i8), 0); |
528 | | assert_eq!(PrimInt::reverse_bits(-1i8), -1); |
529 | | assert_eq!(PrimInt::reverse_bits(1i8), i8::MIN); |
530 | | assert_eq!(PrimInt::reverse_bits(i8::MIN), 1); |
531 | | assert_eq!(PrimInt::reverse_bits(-2i8), i8::MAX); |
532 | | assert_eq!(PrimInt::reverse_bits(i8::MAX), -2); |
533 | | |
534 | | assert_eq!(PrimInt::reverse_bits(0i16), 0); |
535 | | assert_eq!(PrimInt::reverse_bits(-1i16), -1); |
536 | | assert_eq!(PrimInt::reverse_bits(1i16), i16::MIN); |
537 | | assert_eq!(PrimInt::reverse_bits(i16::MIN), 1); |
538 | | assert_eq!(PrimInt::reverse_bits(-2i16), i16::MAX); |
539 | | assert_eq!(PrimInt::reverse_bits(i16::MAX), -2); |
540 | | |
541 | | assert_eq!(PrimInt::reverse_bits(0i32), 0); |
542 | | assert_eq!(PrimInt::reverse_bits(-1i32), -1); |
543 | | assert_eq!(PrimInt::reverse_bits(1i32), i32::MIN); |
544 | | assert_eq!(PrimInt::reverse_bits(i32::MIN), 1); |
545 | | assert_eq!(PrimInt::reverse_bits(-2i32), i32::MAX); |
546 | | assert_eq!(PrimInt::reverse_bits(i32::MAX), -2); |
547 | | |
548 | | assert_eq!(PrimInt::reverse_bits(0i64), 0); |
549 | | assert_eq!(PrimInt::reverse_bits(-1i64), -1); |
550 | | assert_eq!(PrimInt::reverse_bits(1i64), i64::MIN); |
551 | | assert_eq!(PrimInt::reverse_bits(i64::MIN), 1); |
552 | | assert_eq!(PrimInt::reverse_bits(-2i64), i64::MAX); |
553 | | assert_eq!(PrimInt::reverse_bits(i64::MAX), -2); |
554 | | } |
555 | | |
556 | | #[test] |
557 | | #[cfg(has_i128)] |
558 | | pub fn reverse_bits_i128() { |
559 | | use core::i128; |
560 | | |
561 | | assert_eq!(PrimInt::reverse_bits(0i128), 0); |
562 | | assert_eq!(PrimInt::reverse_bits(-1i128), -1); |
563 | | assert_eq!(PrimInt::reverse_bits(1i128), i128::MIN); |
564 | | assert_eq!(PrimInt::reverse_bits(i128::MIN), 1); |
565 | | assert_eq!(PrimInt::reverse_bits(-2i128), i128::MAX); |
566 | | assert_eq!(PrimInt::reverse_bits(i128::MAX), -2); |
567 | | } |
568 | | } |