variable_len_reader/util/
zigzag.rs1pub 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}