| // ZigZag endoging used for efficient transfer of signed integers |
| // https://developers.google.com/protocol-buffers/docs/encoding#types |
| |
| pub fn decode_zig_zag_32(n: u32) -> i32 { |
| ((n >> 1) as i32) ^ (-((n & 1) as i32)) |
| } |
| |
| pub fn decode_zig_zag_64(n: u64) -> i64 { |
| ((n >> 1) as i64) ^ (-((n & 1) as i64)) |
| } |
| |
| pub fn encode_zig_zag_32(n: i32) -> u32 { |
| ((n << 1) ^ (n >> 31)) as u32 |
| } |
| |
| pub fn encode_zig_zag_64(n: i64) -> u64 { |
| ((n << 1) ^ (n >> 63)) as u64 |
| } |
| |
| #[cfg(test)] |
| mod test { |
| |
| use super::decode_zig_zag_32; |
| use super::decode_zig_zag_64; |
| use super::encode_zig_zag_32; |
| use super::encode_zig_zag_64; |
| |
| #[test] |
| fn test_zig_zag() { |
| fn test_zig_zag_pair_64(decoded: i64, encoded: u64) { |
| assert_eq!(decoded, decode_zig_zag_64(encoded)); |
| assert_eq!(encoded, encode_zig_zag_64(decoded)); |
| } |
| |
| fn test_zig_zag_pair(decoded: i32, encoded: u32) { |
| assert_eq!(decoded, decode_zig_zag_32(encoded)); |
| assert_eq!(encoded, encode_zig_zag_32(decoded)); |
| test_zig_zag_pair_64(decoded as i64, encoded as u64); |
| } |
| |
| test_zig_zag_pair(0, 0); |
| test_zig_zag_pair(-1, 1); |
| test_zig_zag_pair(1, 2); |
| test_zig_zag_pair(-2, 3); |
| test_zig_zag_pair(2147483647, 4294967294); |
| test_zig_zag_pair(-2147483648, 4294967295); |
| test_zig_zag_pair_64(9223372036854775807, 18446744073709551614); |
| test_zig_zag_pair_64(-9223372036854775808, 18446744073709551615); |
| } |
| } |