variable_len_reader/util/
zigzag.rs

1pub trait Zigzag<T> {
2    fn zigzag(self) -> T;
3}
4
5impl Zigzag<u8> for i8 {
6    #[inline]
7    fn zigzag(self) -> u8 {
8        ((self << 1) ^ (self >> 7)) as u8
9    }
10}
11
12impl Zigzag<i8> for u8 {
13    #[inline]
14    fn zigzag(self) -> i8 {
15        ((self >> 1) as i8) ^ (-((self & 1) as i8))
16    }
17}
18
19impl Zigzag<u16> for i16 {
20    #[inline]
21    fn zigzag(self) -> u16 {
22        ((self << 1) ^ (self >> 15)) as u16
23    }
24}
25
26impl Zigzag<i16> for u16 {
27    #[inline]
28    fn zigzag(self) -> i16 {
29        ((self >> 1) as i16) ^ (-((self & 1) as i16))
30    }
31}
32
33impl Zigzag<u32> for i32 {
34    #[inline]
35    fn zigzag(self) -> u32 {
36        ((self << 1) ^ (self >> 31)) as u32
37    }
38}
39
40impl Zigzag<i32> for u32 {
41    #[inline]
42    fn zigzag(self) -> i32 {
43        ((self >> 1) as i32) ^ (-((self & 1) as i32))
44    }
45}
46
47impl Zigzag<u64> for i64 {
48    #[inline]
49    fn zigzag(self) -> u64 {
50        ((self << 1) ^ (self >> 63)) as u64
51    }
52}
53
54impl Zigzag<i64> for u64 {
55    #[inline]
56    fn zigzag(self) -> i64 {
57        ((self >> 1) as i64) ^ (-((self & 1) as i64))
58    }
59}
60
61impl Zigzag<u128> for i128 {
62    #[inline]
63    fn zigzag(self) -> u128 {
64        ((self << 1) ^ (self >> 127)) as u128
65    }
66}
67
68impl Zigzag<i128> for u128 {
69    #[inline]
70    fn zigzag(self) -> i128 {
71        ((self >> 1) as i128) ^ (-((self & 1) as i128))
72    }
73}
74
75impl Zigzag<usize> for isize {
76    #[inline]
77    fn zigzag(self) -> usize {
78        ((self << 1) ^ (self >> (usize::BITS - 1))) as usize
79    }
80}
81
82impl Zigzag<isize> for usize {
83    #[inline]
84    fn zigzag(self) -> isize {
85        ((self >> 1) as isize) ^ (-((self & 1) as isize))
86    }
87}