1use core::ops::{BitAnd, BitOr, BitXor, Not, Shl, Shr};
2
3use crate::bounds::Bounded;
4use crate::ops::checked::*;
5use crate::ops::saturating::Saturating;
6use crate::{Num, NumCast};
7
8pub 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 fn count_ones(self) -> u32;
67
68 fn count_zeros(self) -> u32;
80
81 fn leading_ones(self) -> u32 {
94 (!self).leading_zeros()
95 }
96
97 fn leading_zeros(self) -> u32;
110
111 fn trailing_ones(self) -> u32 {
124 (!self).trailing_zeros()
125 }
126
127 fn trailing_zeros(self) -> u32;
140
141 fn rotate_left(self, n: u32) -> Self;
155
156 fn rotate_right(self, n: u32) -> Self;
170
171 fn signed_shl(self, n: u32) -> Self;
187
188 fn signed_shr(self, n: u32) -> Self;
204
205 fn unsigned_shl(self, n: u32) -> Self;
221
222 fn unsigned_shr(self, n: u32) -> Self;
238
239 fn swap_bytes(self) -> Self;
252
253 fn reverse_bits(self) -> Self {
270 reverse_bits_fallback(self)
271 }
272
273 fn from_be(x: Self) -> Self;
291
292 fn from_le(x: Self) -> Self;
310
311 fn to_be(self) -> Self;
329
330 fn to_le(self) -> Self;
348
349 fn pow(self, exp: u32) -> Self;
359}
360
361fn one_per_byte<P: PrimInt>() -> P {
362 let mut ret = P::one();
367 let mut shift = 8;
368 let mut b = ret.count_zeros() >> 3;
369 while b != 0 {
370 ret = (ret << shift) | ret;
371 shift <<= 1;
372 b >>= 1;
373 }
374 ret
375}
376
377fn reverse_bits_fallback<P: PrimInt>(i: P) -> P {
378 let rep_01: P = one_per_byte();
379 let rep_03 = (rep_01 << 1) | rep_01;
380 let rep_05 = (rep_01 << 2) | rep_01;
381 let rep_0f = (rep_03 << 2) | rep_03;
382 let rep_33 = (rep_03 << 4) | rep_03;
383 let rep_55 = (rep_05 << 4) | rep_05;
384
385 let mut ret = i.swap_bytes();
388 ret = ((ret & rep_0f) << 4) | ((ret >> 4) & rep_0f);
389 ret = ((ret & rep_33) << 2) | ((ret >> 2) & rep_33);
390 ret = ((ret & rep_55) << 1) | ((ret >> 1) & rep_55);
391 ret
392}
393
394macro_rules! prim_int_impl {
395 ($T:ty, $S:ty, $U:ty) => {
396 impl PrimInt for $T {
397 #[inline]
398 fn count_ones(self) -> u32 {
399 <$T>::count_ones(self)
400 }
401
402 #[inline]
403 fn count_zeros(self) -> u32 {
404 <$T>::count_zeros(self)
405 }
406
407 #[inline]
408 fn leading_ones(self) -> u32 {
409 <$T>::leading_ones(self)
410 }
411
412 #[inline]
413 fn leading_zeros(self) -> u32 {
414 <$T>::leading_zeros(self)
415 }
416
417 #[inline]
418 fn trailing_ones(self) -> u32 {
419 <$T>::trailing_ones(self)
420 }
421
422 #[inline]
423 fn trailing_zeros(self) -> u32 {
424 <$T>::trailing_zeros(self)
425 }
426
427 #[inline]
428 fn rotate_left(self, n: u32) -> Self {
429 <$T>::rotate_left(self, n)
430 }
431
432 #[inline]
433 fn rotate_right(self, n: u32) -> Self {
434 <$T>::rotate_right(self, n)
435 }
436
437 #[inline]
438 fn signed_shl(self, n: u32) -> Self {
439 ((self as $S) << n) as $T
440 }
441
442 #[inline]
443 fn signed_shr(self, n: u32) -> Self {
444 ((self as $S) >> n) as $T
445 }
446
447 #[inline]
448 fn unsigned_shl(self, n: u32) -> Self {
449 ((self as $U) << n) as $T
450 }
451
452 #[inline]
453 fn unsigned_shr(self, n: u32) -> Self {
454 ((self as $U) >> n) as $T
455 }
456
457 #[inline]
458 fn swap_bytes(self) -> Self {
459 <$T>::swap_bytes(self)
460 }
461
462 #[inline]
463 fn reverse_bits(self) -> Self {
464 <$T>::reverse_bits(self)
465 }
466
467 #[inline]
468 fn from_be(x: Self) -> Self {
469 <$T>::from_be(x)
470 }
471
472 #[inline]
473 fn from_le(x: Self) -> Self {
474 <$T>::from_le(x)
475 }
476
477 #[inline]
478 fn to_be(self) -> Self {
479 <$T>::to_be(self)
480 }
481
482 #[inline]
483 fn to_le(self) -> Self {
484 <$T>::to_le(self)
485 }
486
487 #[inline]
488 fn pow(self, exp: u32) -> Self {
489 <$T>::pow(self, exp)
490 }
491 }
492 };
493}
494
495impl PrimInt for u8 {
#[inline]
fn count_ones(self) -> u32 { <u8>::count_ones(self) }
#[inline]
fn count_zeros(self) -> u32 { <u8>::count_zeros(self) }
#[inline]
fn leading_ones(self) -> u32 { <u8>::leading_ones(self) }
#[inline]
fn leading_zeros(self) -> u32 { <u8>::leading_zeros(self) }
#[inline]
fn trailing_ones(self) -> u32 { <u8>::trailing_ones(self) }
#[inline]
fn trailing_zeros(self) -> u32 { <u8>::trailing_zeros(self) }
#[inline]
fn rotate_left(self, n: u32) -> Self { <u8>::rotate_left(self, n) }
#[inline]
fn rotate_right(self, n: u32) -> Self { <u8>::rotate_right(self, n) }
#[inline]
fn signed_shl(self, n: u32) -> Self { ((self as i8) << n) as u8 }
#[inline]
fn signed_shr(self, n: u32) -> Self { ((self as i8) >> n) as u8 }
#[inline]
fn unsigned_shl(self, n: u32) -> Self { ((self as u8) << n) as u8 }
#[inline]
fn unsigned_shr(self, n: u32) -> Self { ((self as u8) >> n) as u8 }
#[inline]
fn swap_bytes(self) -> Self { <u8>::swap_bytes(self) }
#[inline]
fn reverse_bits(self) -> Self { <u8>::reverse_bits(self) }
#[inline]
fn from_be(x: Self) -> Self { <u8>::from_be(x) }
#[inline]
fn from_le(x: Self) -> Self { <u8>::from_le(x) }
#[inline]
fn to_be(self) -> Self { <u8>::to_be(self) }
#[inline]
fn to_le(self) -> Self { <u8>::to_le(self) }
#[inline]
fn pow(self, exp: u32) -> Self { <u8>::pow(self, exp) }
}prim_int_impl!(u8, i8, u8);
497impl PrimInt for u16 {
#[inline]
fn count_ones(self) -> u32 { <u16>::count_ones(self) }
#[inline]
fn count_zeros(self) -> u32 { <u16>::count_zeros(self) }
#[inline]
fn leading_ones(self) -> u32 { <u16>::leading_ones(self) }
#[inline]
fn leading_zeros(self) -> u32 { <u16>::leading_zeros(self) }
#[inline]
fn trailing_ones(self) -> u32 { <u16>::trailing_ones(self) }
#[inline]
fn trailing_zeros(self) -> u32 { <u16>::trailing_zeros(self) }
#[inline]
fn rotate_left(self, n: u32) -> Self { <u16>::rotate_left(self, n) }
#[inline]
fn rotate_right(self, n: u32) -> Self { <u16>::rotate_right(self, n) }
#[inline]
fn signed_shl(self, n: u32) -> Self { ((self as i16) << n) as u16 }
#[inline]
fn signed_shr(self, n: u32) -> Self { ((self as i16) >> n) as u16 }
#[inline]
fn unsigned_shl(self, n: u32) -> Self { ((self as u16) << n) as u16 }
#[inline]
fn unsigned_shr(self, n: u32) -> Self { ((self as u16) >> n) as u16 }
#[inline]
fn swap_bytes(self) -> Self { <u16>::swap_bytes(self) }
#[inline]
fn reverse_bits(self) -> Self { <u16>::reverse_bits(self) }
#[inline]
fn from_be(x: Self) -> Self { <u16>::from_be(x) }
#[inline]
fn from_le(x: Self) -> Self { <u16>::from_le(x) }
#[inline]
fn to_be(self) -> Self { <u16>::to_be(self) }
#[inline]
fn to_le(self) -> Self { <u16>::to_le(self) }
#[inline]
fn pow(self, exp: u32) -> Self { <u16>::pow(self, exp) }
}prim_int_impl!(u16, i16, u16);
498impl PrimInt for u32 {
#[inline]
fn count_ones(self) -> u32 { <u32>::count_ones(self) }
#[inline]
fn count_zeros(self) -> u32 { <u32>::count_zeros(self) }
#[inline]
fn leading_ones(self) -> u32 { <u32>::leading_ones(self) }
#[inline]
fn leading_zeros(self) -> u32 { <u32>::leading_zeros(self) }
#[inline]
fn trailing_ones(self) -> u32 { <u32>::trailing_ones(self) }
#[inline]
fn trailing_zeros(self) -> u32 { <u32>::trailing_zeros(self) }
#[inline]
fn rotate_left(self, n: u32) -> Self { <u32>::rotate_left(self, n) }
#[inline]
fn rotate_right(self, n: u32) -> Self { <u32>::rotate_right(self, n) }
#[inline]
fn signed_shl(self, n: u32) -> Self { ((self as i32) << n) as u32 }
#[inline]
fn signed_shr(self, n: u32) -> Self { ((self as i32) >> n) as u32 }
#[inline]
fn unsigned_shl(self, n: u32) -> Self { ((self as u32) << n) as u32 }
#[inline]
fn unsigned_shr(self, n: u32) -> Self { ((self as u32) >> n) as u32 }
#[inline]
fn swap_bytes(self) -> Self { <u32>::swap_bytes(self) }
#[inline]
fn reverse_bits(self) -> Self { <u32>::reverse_bits(self) }
#[inline]
fn from_be(x: Self) -> Self { <u32>::from_be(x) }
#[inline]
fn from_le(x: Self) -> Self { <u32>::from_le(x) }
#[inline]
fn to_be(self) -> Self { <u32>::to_be(self) }
#[inline]
fn to_le(self) -> Self { <u32>::to_le(self) }
#[inline]
fn pow(self, exp: u32) -> Self { <u32>::pow(self, exp) }
}prim_int_impl!(u32, i32, u32);
499impl PrimInt for u64 {
#[inline]
fn count_ones(self) -> u32 { <u64>::count_ones(self) }
#[inline]
fn count_zeros(self) -> u32 { <u64>::count_zeros(self) }
#[inline]
fn leading_ones(self) -> u32 { <u64>::leading_ones(self) }
#[inline]
fn leading_zeros(self) -> u32 { <u64>::leading_zeros(self) }
#[inline]
fn trailing_ones(self) -> u32 { <u64>::trailing_ones(self) }
#[inline]
fn trailing_zeros(self) -> u32 { <u64>::trailing_zeros(self) }
#[inline]
fn rotate_left(self, n: u32) -> Self { <u64>::rotate_left(self, n) }
#[inline]
fn rotate_right(self, n: u32) -> Self { <u64>::rotate_right(self, n) }
#[inline]
fn signed_shl(self, n: u32) -> Self { ((self as i64) << n) as u64 }
#[inline]
fn signed_shr(self, n: u32) -> Self { ((self as i64) >> n) as u64 }
#[inline]
fn unsigned_shl(self, n: u32) -> Self { ((self as u64) << n) as u64 }
#[inline]
fn unsigned_shr(self, n: u32) -> Self { ((self as u64) >> n) as u64 }
#[inline]
fn swap_bytes(self) -> Self { <u64>::swap_bytes(self) }
#[inline]
fn reverse_bits(self) -> Self { <u64>::reverse_bits(self) }
#[inline]
fn from_be(x: Self) -> Self { <u64>::from_be(x) }
#[inline]
fn from_le(x: Self) -> Self { <u64>::from_le(x) }
#[inline]
fn to_be(self) -> Self { <u64>::to_be(self) }
#[inline]
fn to_le(self) -> Self { <u64>::to_le(self) }
#[inline]
fn pow(self, exp: u32) -> Self { <u64>::pow(self, exp) }
}prim_int_impl!(u64, i64, u64);
500impl PrimInt for u128 {
#[inline]
fn count_ones(self) -> u32 { <u128>::count_ones(self) }
#[inline]
fn count_zeros(self) -> u32 { <u128>::count_zeros(self) }
#[inline]
fn leading_ones(self) -> u32 { <u128>::leading_ones(self) }
#[inline]
fn leading_zeros(self) -> u32 { <u128>::leading_zeros(self) }
#[inline]
fn trailing_ones(self) -> u32 { <u128>::trailing_ones(self) }
#[inline]
fn trailing_zeros(self) -> u32 { <u128>::trailing_zeros(self) }
#[inline]
fn rotate_left(self, n: u32) -> Self { <u128>::rotate_left(self, n) }
#[inline]
fn rotate_right(self, n: u32) -> Self { <u128>::rotate_right(self, n) }
#[inline]
fn signed_shl(self, n: u32) -> Self { ((self as i128) << n) as u128 }
#[inline]
fn signed_shr(self, n: u32) -> Self { ((self as i128) >> n) as u128 }
#[inline]
fn unsigned_shl(self, n: u32) -> Self { ((self as u128) << n) as u128 }
#[inline]
fn unsigned_shr(self, n: u32) -> Self { ((self as u128) >> n) as u128 }
#[inline]
fn swap_bytes(self) -> Self { <u128>::swap_bytes(self) }
#[inline]
fn reverse_bits(self) -> Self { <u128>::reverse_bits(self) }
#[inline]
fn from_be(x: Self) -> Self { <u128>::from_be(x) }
#[inline]
fn from_le(x: Self) -> Self { <u128>::from_le(x) }
#[inline]
fn to_be(self) -> Self { <u128>::to_be(self) }
#[inline]
fn to_le(self) -> Self { <u128>::to_le(self) }
#[inline]
fn pow(self, exp: u32) -> Self { <u128>::pow(self, exp) }
}prim_int_impl!(u128, i128, u128);
501impl PrimInt for usize {
#[inline]
fn count_ones(self) -> u32 { <usize>::count_ones(self) }
#[inline]
fn count_zeros(self) -> u32 { <usize>::count_zeros(self) }
#[inline]
fn leading_ones(self) -> u32 { <usize>::leading_ones(self) }
#[inline]
fn leading_zeros(self) -> u32 { <usize>::leading_zeros(self) }
#[inline]
fn trailing_ones(self) -> u32 { <usize>::trailing_ones(self) }
#[inline]
fn trailing_zeros(self) -> u32 { <usize>::trailing_zeros(self) }
#[inline]
fn rotate_left(self, n: u32) -> Self { <usize>::rotate_left(self, n) }
#[inline]
fn rotate_right(self, n: u32) -> Self { <usize>::rotate_right(self, n) }
#[inline]
fn signed_shl(self, n: u32) -> Self { ((self as isize) << n) as usize }
#[inline]
fn signed_shr(self, n: u32) -> Self { ((self as isize) >> n) as usize }
#[inline]
fn unsigned_shl(self, n: u32) -> Self { ((self as usize) << n) as usize }
#[inline]
fn unsigned_shr(self, n: u32) -> Self { ((self as usize) >> n) as usize }
#[inline]
fn swap_bytes(self) -> Self { <usize>::swap_bytes(self) }
#[inline]
fn reverse_bits(self) -> Self { <usize>::reverse_bits(self) }
#[inline]
fn from_be(x: Self) -> Self { <usize>::from_be(x) }
#[inline]
fn from_le(x: Self) -> Self { <usize>::from_le(x) }
#[inline]
fn to_be(self) -> Self { <usize>::to_be(self) }
#[inline]
fn to_le(self) -> Self { <usize>::to_le(self) }
#[inline]
fn pow(self, exp: u32) -> Self { <usize>::pow(self, exp) }
}prim_int_impl!(usize, isize, usize);
502impl PrimInt for i8 {
#[inline]
fn count_ones(self) -> u32 { <i8>::count_ones(self) }
#[inline]
fn count_zeros(self) -> u32 { <i8>::count_zeros(self) }
#[inline]
fn leading_ones(self) -> u32 { <i8>::leading_ones(self) }
#[inline]
fn leading_zeros(self) -> u32 { <i8>::leading_zeros(self) }
#[inline]
fn trailing_ones(self) -> u32 { <i8>::trailing_ones(self) }
#[inline]
fn trailing_zeros(self) -> u32 { <i8>::trailing_zeros(self) }
#[inline]
fn rotate_left(self, n: u32) -> Self { <i8>::rotate_left(self, n) }
#[inline]
fn rotate_right(self, n: u32) -> Self { <i8>::rotate_right(self, n) }
#[inline]
fn signed_shl(self, n: u32) -> Self { ((self as i8) << n) as i8 }
#[inline]
fn signed_shr(self, n: u32) -> Self { ((self as i8) >> n) as i8 }
#[inline]
fn unsigned_shl(self, n: u32) -> Self { ((self as u8) << n) as i8 }
#[inline]
fn unsigned_shr(self, n: u32) -> Self { ((self as u8) >> n) as i8 }
#[inline]
fn swap_bytes(self) -> Self { <i8>::swap_bytes(self) }
#[inline]
fn reverse_bits(self) -> Self { <i8>::reverse_bits(self) }
#[inline]
fn from_be(x: Self) -> Self { <i8>::from_be(x) }
#[inline]
fn from_le(x: Self) -> Self { <i8>::from_le(x) }
#[inline]
fn to_be(self) -> Self { <i8>::to_be(self) }
#[inline]
fn to_le(self) -> Self { <i8>::to_le(self) }
#[inline]
fn pow(self, exp: u32) -> Self { <i8>::pow(self, exp) }
}prim_int_impl!(i8, i8, u8);
503impl PrimInt for i16 {
#[inline]
fn count_ones(self) -> u32 { <i16>::count_ones(self) }
#[inline]
fn count_zeros(self) -> u32 { <i16>::count_zeros(self) }
#[inline]
fn leading_ones(self) -> u32 { <i16>::leading_ones(self) }
#[inline]
fn leading_zeros(self) -> u32 { <i16>::leading_zeros(self) }
#[inline]
fn trailing_ones(self) -> u32 { <i16>::trailing_ones(self) }
#[inline]
fn trailing_zeros(self) -> u32 { <i16>::trailing_zeros(self) }
#[inline]
fn rotate_left(self, n: u32) -> Self { <i16>::rotate_left(self, n) }
#[inline]
fn rotate_right(self, n: u32) -> Self { <i16>::rotate_right(self, n) }
#[inline]
fn signed_shl(self, n: u32) -> Self { ((self as i16) << n) as i16 }
#[inline]
fn signed_shr(self, n: u32) -> Self { ((self as i16) >> n) as i16 }
#[inline]
fn unsigned_shl(self, n: u32) -> Self { ((self as u16) << n) as i16 }
#[inline]
fn unsigned_shr(self, n: u32) -> Self { ((self as u16) >> n) as i16 }
#[inline]
fn swap_bytes(self) -> Self { <i16>::swap_bytes(self) }
#[inline]
fn reverse_bits(self) -> Self { <i16>::reverse_bits(self) }
#[inline]
fn from_be(x: Self) -> Self { <i16>::from_be(x) }
#[inline]
fn from_le(x: Self) -> Self { <i16>::from_le(x) }
#[inline]
fn to_be(self) -> Self { <i16>::to_be(self) }
#[inline]
fn to_le(self) -> Self { <i16>::to_le(self) }
#[inline]
fn pow(self, exp: u32) -> Self { <i16>::pow(self, exp) }
}prim_int_impl!(i16, i16, u16);
504impl PrimInt for i32 {
#[inline]
fn count_ones(self) -> u32 { <i32>::count_ones(self) }
#[inline]
fn count_zeros(self) -> u32 { <i32>::count_zeros(self) }
#[inline]
fn leading_ones(self) -> u32 { <i32>::leading_ones(self) }
#[inline]
fn leading_zeros(self) -> u32 { <i32>::leading_zeros(self) }
#[inline]
fn trailing_ones(self) -> u32 { <i32>::trailing_ones(self) }
#[inline]
fn trailing_zeros(self) -> u32 { <i32>::trailing_zeros(self) }
#[inline]
fn rotate_left(self, n: u32) -> Self { <i32>::rotate_left(self, n) }
#[inline]
fn rotate_right(self, n: u32) -> Self { <i32>::rotate_right(self, n) }
#[inline]
fn signed_shl(self, n: u32) -> Self { ((self as i32) << n) as i32 }
#[inline]
fn signed_shr(self, n: u32) -> Self { ((self as i32) >> n) as i32 }
#[inline]
fn unsigned_shl(self, n: u32) -> Self { ((self as u32) << n) as i32 }
#[inline]
fn unsigned_shr(self, n: u32) -> Self { ((self as u32) >> n) as i32 }
#[inline]
fn swap_bytes(self) -> Self { <i32>::swap_bytes(self) }
#[inline]
fn reverse_bits(self) -> Self { <i32>::reverse_bits(self) }
#[inline]
fn from_be(x: Self) -> Self { <i32>::from_be(x) }
#[inline]
fn from_le(x: Self) -> Self { <i32>::from_le(x) }
#[inline]
fn to_be(self) -> Self { <i32>::to_be(self) }
#[inline]
fn to_le(self) -> Self { <i32>::to_le(self) }
#[inline]
fn pow(self, exp: u32) -> Self { <i32>::pow(self, exp) }
}prim_int_impl!(i32, i32, u32);
505impl PrimInt for i64 {
#[inline]
fn count_ones(self) -> u32 { <i64>::count_ones(self) }
#[inline]
fn count_zeros(self) -> u32 { <i64>::count_zeros(self) }
#[inline]
fn leading_ones(self) -> u32 { <i64>::leading_ones(self) }
#[inline]
fn leading_zeros(self) -> u32 { <i64>::leading_zeros(self) }
#[inline]
fn trailing_ones(self) -> u32 { <i64>::trailing_ones(self) }
#[inline]
fn trailing_zeros(self) -> u32 { <i64>::trailing_zeros(self) }
#[inline]
fn rotate_left(self, n: u32) -> Self { <i64>::rotate_left(self, n) }
#[inline]
fn rotate_right(self, n: u32) -> Self { <i64>::rotate_right(self, n) }
#[inline]
fn signed_shl(self, n: u32) -> Self { ((self as i64) << n) as i64 }
#[inline]
fn signed_shr(self, n: u32) -> Self { ((self as i64) >> n) as i64 }
#[inline]
fn unsigned_shl(self, n: u32) -> Self { ((self as u64) << n) as i64 }
#[inline]
fn unsigned_shr(self, n: u32) -> Self { ((self as u64) >> n) as i64 }
#[inline]
fn swap_bytes(self) -> Self { <i64>::swap_bytes(self) }
#[inline]
fn reverse_bits(self) -> Self { <i64>::reverse_bits(self) }
#[inline]
fn from_be(x: Self) -> Self { <i64>::from_be(x) }
#[inline]
fn from_le(x: Self) -> Self { <i64>::from_le(x) }
#[inline]
fn to_be(self) -> Self { <i64>::to_be(self) }
#[inline]
fn to_le(self) -> Self { <i64>::to_le(self) }
#[inline]
fn pow(self, exp: u32) -> Self { <i64>::pow(self, exp) }
}prim_int_impl!(i64, i64, u64);
506impl PrimInt for i128 {
#[inline]
fn count_ones(self) -> u32 { <i128>::count_ones(self) }
#[inline]
fn count_zeros(self) -> u32 { <i128>::count_zeros(self) }
#[inline]
fn leading_ones(self) -> u32 { <i128>::leading_ones(self) }
#[inline]
fn leading_zeros(self) -> u32 { <i128>::leading_zeros(self) }
#[inline]
fn trailing_ones(self) -> u32 { <i128>::trailing_ones(self) }
#[inline]
fn trailing_zeros(self) -> u32 { <i128>::trailing_zeros(self) }
#[inline]
fn rotate_left(self, n: u32) -> Self { <i128>::rotate_left(self, n) }
#[inline]
fn rotate_right(self, n: u32) -> Self { <i128>::rotate_right(self, n) }
#[inline]
fn signed_shl(self, n: u32) -> Self { ((self as i128) << n) as i128 }
#[inline]
fn signed_shr(self, n: u32) -> Self { ((self as i128) >> n) as i128 }
#[inline]
fn unsigned_shl(self, n: u32) -> Self { ((self as u128) << n) as i128 }
#[inline]
fn unsigned_shr(self, n: u32) -> Self { ((self as u128) >> n) as i128 }
#[inline]
fn swap_bytes(self) -> Self { <i128>::swap_bytes(self) }
#[inline]
fn reverse_bits(self) -> Self { <i128>::reverse_bits(self) }
#[inline]
fn from_be(x: Self) -> Self { <i128>::from_be(x) }
#[inline]
fn from_le(x: Self) -> Self { <i128>::from_le(x) }
#[inline]
fn to_be(self) -> Self { <i128>::to_be(self) }
#[inline]
fn to_le(self) -> Self { <i128>::to_le(self) }
#[inline]
fn pow(self, exp: u32) -> Self { <i128>::pow(self, exp) }
}prim_int_impl!(i128, i128, u128);
507impl PrimInt for isize {
#[inline]
fn count_ones(self) -> u32 { <isize>::count_ones(self) }
#[inline]
fn count_zeros(self) -> u32 { <isize>::count_zeros(self) }
#[inline]
fn leading_ones(self) -> u32 { <isize>::leading_ones(self) }
#[inline]
fn leading_zeros(self) -> u32 { <isize>::leading_zeros(self) }
#[inline]
fn trailing_ones(self) -> u32 { <isize>::trailing_ones(self) }
#[inline]
fn trailing_zeros(self) -> u32 { <isize>::trailing_zeros(self) }
#[inline]
fn rotate_left(self, n: u32) -> Self { <isize>::rotate_left(self, n) }
#[inline]
fn rotate_right(self, n: u32) -> Self { <isize>::rotate_right(self, n) }
#[inline]
fn signed_shl(self, n: u32) -> Self { ((self as isize) << n) as isize }
#[inline]
fn signed_shr(self, n: u32) -> Self { ((self as isize) >> n) as isize }
#[inline]
fn unsigned_shl(self, n: u32) -> Self { ((self as usize) << n) as isize }
#[inline]
fn unsigned_shr(self, n: u32) -> Self { ((self as usize) >> n) as isize }
#[inline]
fn swap_bytes(self) -> Self { <isize>::swap_bytes(self) }
#[inline]
fn reverse_bits(self) -> Self { <isize>::reverse_bits(self) }
#[inline]
fn from_be(x: Self) -> Self { <isize>::from_be(x) }
#[inline]
fn from_le(x: Self) -> Self { <isize>::from_le(x) }
#[inline]
fn to_be(self) -> Self { <isize>::to_be(self) }
#[inline]
fn to_le(self) -> Self { <isize>::to_le(self) }
#[inline]
fn pow(self, exp: u32) -> Self { <isize>::pow(self, exp) }
}prim_int_impl!(isize, isize, usize);
508
509#[cfg(test)]
510mod tests {
511 use crate::int::PrimInt;
512
513 #[test]
514 pub fn reverse_bits() {
515 use core::{i16, i32, i64, i8};
516
517 assert_eq!(
518 PrimInt::reverse_bits(0x0123_4567_89ab_cdefu64),
519 0xf7b3_d591_e6a2_c480
520 );
521
522 assert_eq!(PrimInt::reverse_bits(0i8), 0);
523 assert_eq!(PrimInt::reverse_bits(-1i8), -1);
524 assert_eq!(PrimInt::reverse_bits(1i8), i8::MIN);
525 assert_eq!(PrimInt::reverse_bits(i8::MIN), 1);
526 assert_eq!(PrimInt::reverse_bits(-2i8), i8::MAX);
527 assert_eq!(PrimInt::reverse_bits(i8::MAX), -2);
528
529 assert_eq!(PrimInt::reverse_bits(0i16), 0);
530 assert_eq!(PrimInt::reverse_bits(-1i16), -1);
531 assert_eq!(PrimInt::reverse_bits(1i16), i16::MIN);
532 assert_eq!(PrimInt::reverse_bits(i16::MIN), 1);
533 assert_eq!(PrimInt::reverse_bits(-2i16), i16::MAX);
534 assert_eq!(PrimInt::reverse_bits(i16::MAX), -2);
535
536 assert_eq!(PrimInt::reverse_bits(0i32), 0);
537 assert_eq!(PrimInt::reverse_bits(-1i32), -1);
538 assert_eq!(PrimInt::reverse_bits(1i32), i32::MIN);
539 assert_eq!(PrimInt::reverse_bits(i32::MIN), 1);
540 assert_eq!(PrimInt::reverse_bits(-2i32), i32::MAX);
541 assert_eq!(PrimInt::reverse_bits(i32::MAX), -2);
542
543 assert_eq!(PrimInt::reverse_bits(0i64), 0);
544 assert_eq!(PrimInt::reverse_bits(-1i64), -1);
545 assert_eq!(PrimInt::reverse_bits(1i64), i64::MIN);
546 assert_eq!(PrimInt::reverse_bits(i64::MIN), 1);
547 assert_eq!(PrimInt::reverse_bits(-2i64), i64::MAX);
548 assert_eq!(PrimInt::reverse_bits(i64::MAX), -2);
549 }
550
551 #[test]
552 pub fn reverse_bits_i128() {
553 use core::i128;
554
555 assert_eq!(PrimInt::reverse_bits(0i128), 0);
556 assert_eq!(PrimInt::reverse_bits(-1i128), -1);
557 assert_eq!(PrimInt::reverse_bits(1i128), i128::MIN);
558 assert_eq!(PrimInt::reverse_bits(i128::MIN), 1);
559 assert_eq!(PrimInt::reverse_bits(-2i128), i128::MAX);
560 assert_eq!(PrimInt::reverse_bits(i128::MAX), -2);
561 }
562}