pub trait ParallelReverse {
fn swap_bits(self) -> Self;
}
macro_rules! doit_parallel { ($($ty:ty),*) => ($(
impl ParallelReverse for $ty {
#[inline]
fn swap_bits(self) -> $ty {
let mut v = self;
v = ((v >> 1) & (0x5555555555555555 as $ty)) | ((v & (0x5555555555555555 as $ty)) << 1);
v = ((v >> 2) & (0x3333333333333333 as $ty)) | ((v & (0x3333333333333333 as $ty)) << 2);
v = ((v >> 4) & (0x0F0F0F0F0F0F0F0F as $ty)) | ((v & (0x0F0F0F0F0F0F0F0F as $ty)) << 4);
v.swap_bytes()
}
})*)
}
doit_parallel!(u8, u16, u32, u64, usize);
doit_signed!(ParallelReverse);
test_suite!();