#[derive(Default, Debug, Clone, Eq, PartialEq, Hash, Ord, PartialOrd)]
pub struct WireEncoder {
pub buf: Vec<u8>,
}
impl WireEncoder {
pub fn new() -> WireEncoder {
WireEncoder { buf: Vec::new() }
}
pub fn with_buf(buf: Vec<u8>) -> WireEncoder {
WireEncoder { buf }
}
pub fn add_var_uint32(&mut self, value: u32) {
if value < (1 << 7) {
self.buf.push(value as u8);
} else if value < (1 << (7 * 2)) {
self.buf
.extend_from_slice(&[0b1000_0000 | (value as u8), (value >> 7) as u8]);
} else if value < (1 << (7 * 3)) {
self.buf.extend_from_slice(&[
0b1000_0000 | (value as u8),
0b1000_0000 | ((value >> 7) as u8),
((value >> (7 * 2)) as u8),
]);
} else if value < (1 << (7 * 4)) {
self.buf.extend_from_slice(&[
0b1000_0000 | (value as u8),
0b1000_0000 | ((value >> 7) as u8),
0b1000_0000 | ((value >> (7 * 2)) as u8),
((value >> (7 * 3)) as u8),
]);
} else {
self.buf.extend_from_slice(&[
0b1000_0000 | (value as u8),
0b1000_0000 | ((value >> 7) as u8),
0b1000_0000 | ((value >> (7 * 2)) as u8),
0b1000_0000 | ((value >> (7 * 3)) as u8),
((value >> (7 * 4)) as u8),
]);
}
}
#[inline]
pub fn add_var_int32(&mut self, value: i32) {
self.add_var_uint32(u32::from_ne_bytes(value.to_ne_bytes()))
}
#[inline]
pub fn add_var_sint32(&mut self, value: i32) {
let zigzag = (value << 1) ^ (value >> 31);
self.add_var_uint32(u32::from_ne_bytes(zigzag.to_ne_bytes()))
}
pub fn add_var_uint64(&mut self, value: u64) {
if value < (1 << 7) {
self.buf.push(value as u8);
} else if value < (1 << (7 * 2)) {
self.buf
.extend_from_slice(&[0b1000_0000 | (value as u8), (value >> 7) as u8]);
} else if value < (1 << (7 * 3)) {
self.buf.extend_from_slice(&[
0b1000_0000 | (value as u8),
0b1000_0000 | ((value >> 7) as u8),
((value >> (7 * 2)) as u8),
]);
} else if value < (1 << (7 * 4)) {
self.buf.extend_from_slice(&[
0b1000_0000 | (value as u8),
0b1000_0000 | ((value >> 7) as u8),
0b1000_0000 | ((value >> (7 * 2)) as u8),
((value >> (7 * 3)) as u8),
]);
} else if value < (1 << (7 * 5)) {
self.buf.extend_from_slice(&[
0b1000_0000 | (value as u8),
0b1000_0000 | ((value >> 7) as u8),
0b1000_0000 | ((value >> (7 * 2)) as u8),
0b1000_0000 | ((value >> (7 * 3)) as u8),
((value >> (7 * 4)) as u8),
]);
} else if value < (1 << (7 * 6)) {
self.buf.extend_from_slice(&[
0b1000_0000 | (value as u8),
0b1000_0000 | ((value >> 7) as u8),
0b1000_0000 | ((value >> (7 * 2)) as u8),
0b1000_0000 | ((value >> (7 * 3)) as u8),
0b1000_0000 | ((value >> (7 * 4)) as u8),
((value >> (7 * 5)) as u8),
]);
} else if value < (1 << (7 * 7)) {
self.buf.extend_from_slice(&[
0b1000_0000 | (value as u8 & 0b0111_1111),
0b1000_0000 | ((value >> 7) as u8),
0b1000_0000 | ((value >> (7 * 2)) as u8),
0b1000_0000 | ((value >> (7 * 3)) as u8),
0b1000_0000 | ((value >> (7 * 4)) as u8),
0b1000_0000 | ((value >> (7 * 5)) as u8),
((value >> (7 * 6)) as u8),
]);
} else if value < (1 << (7 * 8)) {
self.buf.extend_from_slice(&[
0b1000_0000 | (value as u8),
0b1000_0000 | ((value >> 7) as u8),
0b1000_0000 | ((value >> (7 * 2)) as u8),
0b1000_0000 | ((value >> (7 * 3)) as u8),
0b1000_0000 | ((value >> (7 * 4)) as u8),
0b1000_0000 | ((value >> (7 * 5)) as u8),
0b1000_0000 | ((value >> (7 * 6)) as u8),
((value >> (7 * 7)) as u8),
]);
} else if value < (1 << (7 * 9)) {
self.buf.extend_from_slice(&[
0b1000_0000 | (value as u8),
0b1000_0000 | ((value >> 7) as u8),
0b1000_0000 | ((value >> (7 * 2)) as u8),
0b1000_0000 | ((value >> (7 * 3)) as u8),
0b1000_0000 | ((value >> (7 * 4)) as u8),
0b1000_0000 | ((value >> (7 * 5)) as u8),
0b1000_0000 | ((value >> (7 * 6)) as u8),
0b1000_0000 | ((value >> (7 * 7)) as u8),
((value >> (7 * 8)) as u8),
]);
} else {
self.buf.extend_from_slice(&[
0b1000_0000 | (value as u8),
0b1000_0000 | ((value >> 7) as u8),
0b1000_0000 | ((value >> (7 * 2)) as u8),
0b1000_0000 | ((value >> (7 * 3)) as u8),
0b1000_0000 | ((value >> (7 * 4)) as u8),
0b1000_0000 | ((value >> (7 * 5)) as u8),
0b1000_0000 | ((value >> (7 * 6)) as u8),
0b1000_0000 | ((value >> (7 * 7)) as u8),
0b1000_0000 | ((value >> (7 * 8)) as u8),
((value >> (7 * 9)) as u8),
]);
}
}
#[inline]
pub fn add_var_int64(&mut self, value: i64) {
self.add_var_uint64(u64::from_ne_bytes(value.to_ne_bytes()))
}
#[inline]
pub fn add_var_sint64(&mut self, value: i64) {
let zigzag = (value << 1) ^ (value >> 63);
self.add_var_uint64(u64::from_ne_bytes(zigzag.to_ne_bytes()))
}
#[inline]
pub fn add_bool(&mut self, value: bool) {
self.buf.push(if value { 1 } else { 0 });
}
#[inline]
pub fn add_fixed32(&mut self, value: u32) {
self.buf.extend_from_slice(&value.to_le_bytes());
}
#[inline]
pub fn add_sfixed32(&mut self, value: i32) {
self.buf.extend_from_slice(&value.to_le_bytes());
}
#[inline]
pub fn add_fixed64(&mut self, value: u64) {
self.buf.extend_from_slice(&value.to_le_bytes());
}
#[inline]
pub fn add_sfixed64(&mut self, value: i64) {
self.buf.extend_from_slice(&value.to_le_bytes());
}
#[inline]
pub fn add_float(&mut self, value: f32) {
self.buf.extend_from_slice(&value.to_le_bytes());
}
#[inline]
pub fn add_double(&mut self, value: f64) {
self.buf.extend_from_slice(&value.to_le_bytes());
}
#[inline]
pub fn take_buf(self) -> Vec<u8> {
self.buf
}
}