xxai_msgpacker/pack/
int.rsuse super::{Format, Packable};
use core::iter;
impl Packable for u8 {
fn pack<T>(&self, buf: &mut T) -> usize
where
T: Extend<u8>,
{
match *self {
0..=127 => {
buf.extend(iter::once(self & Format::POSITIVE_FIXINT));
1
}
_ => {
buf.extend(iter::once(Format::UINT8).chain(iter::once(*self)));
2
}
}
}
}
impl Packable for u16 {
fn pack<T>(&self, buf: &mut T) -> usize
where
T: Extend<u8>,
{
if *self <= 127 {
buf.extend(iter::once(*self as u8 & Format::POSITIVE_FIXINT));
1
} else if *self <= u8::MAX as u16 {
buf.extend(iter::once(Format::UINT8).chain(iter::once(*self as u8)));
2
} else {
buf.extend(iter::once(Format::UINT16).chain(self.to_be_bytes()));
3
}
}
}
impl Packable for u32 {
fn pack<T>(&self, buf: &mut T) -> usize
where
T: Extend<u8>,
{
if *self <= 127 {
buf.extend(iter::once(*self as u8 & Format::POSITIVE_FIXINT));
1
} else if *self <= u8::MAX as u32 {
buf.extend(iter::once(Format::UINT8).chain(iter::once(*self as u8)));
2
} else if *self <= u16::MAX as u32 {
buf.extend(iter::once(Format::UINT16).chain((*self as u16).to_be_bytes()));
3
} else {
buf.extend(iter::once(Format::UINT32).chain(self.to_be_bytes()));
5
}
}
}
impl Packable for u64 {
fn pack<T>(&self, buf: &mut T) -> usize
where
T: Extend<u8>,
{
if *self <= 127 {
buf.extend(iter::once(*self as u8 & Format::POSITIVE_FIXINT));
1
} else if *self <= u8::MAX as u64 {
buf.extend(iter::once(Format::UINT8).chain(iter::once(*self as u8)));
2
} else if *self <= u16::MAX as u64 {
buf.extend(iter::once(Format::UINT16).chain((*self as u16).to_be_bytes()));
3
} else if *self <= u32::MAX as u64 {
buf.extend(iter::once(Format::UINT32).chain((*self as u32).to_be_bytes()));
5
} else {
buf.extend(iter::once(Format::UINT64).chain(self.to_be_bytes()));
9
}
}
}
impl Packable for u128 {
fn pack<T>(&self, buf: &mut T) -> usize
where
T: Extend<u8>,
{
if *self <= 127 {
buf.extend(iter::once(*self as u8 & Format::POSITIVE_FIXINT));
1
} else if *self <= u8::MAX as u128 {
buf.extend(iter::once(Format::UINT8).chain(iter::once(*self as u8)));
2
} else if *self <= u16::MAX as u128 {
buf.extend(iter::once(Format::UINT16).chain((*self as u16).to_be_bytes()));
3
} else if *self <= u32::MAX as u128 {
buf.extend(iter::once(Format::UINT32).chain((*self as u32).to_be_bytes()));
5
} else if *self <= u64::MAX as u128 {
buf.extend(iter::once(Format::UINT64).chain((*self as u64).to_be_bytes()));
9
} else {
buf.extend(
iter::once(Format::BIN8)
.chain(iter::once(16))
.chain(self.to_be_bytes()),
);
18
}
}
}
impl Packable for usize {
fn pack<T>(&self, buf: &mut T) -> usize
where
T: Extend<u8>,
{
if *self <= 127 {
buf.extend(iter::once(*self as u8 & Format::POSITIVE_FIXINT));
1
} else if *self <= u8::MAX as usize {
buf.extend(iter::once(Format::UINT8).chain(iter::once(*self as u8)));
2
} else if *self <= u16::MAX as usize {
buf.extend(iter::once(Format::UINT16).chain((*self as u16).to_be_bytes()));
3
} else if *self <= u32::MAX as usize {
buf.extend(iter::once(Format::UINT32).chain((*self as u32).to_be_bytes()));
5
} else {
buf.extend(iter::once(Format::UINT64).chain(self.to_be_bytes()));
9
}
}
}
impl Packable for i8 {
fn pack<T>(&self, buf: &mut T) -> usize
where
T: Extend<u8>,
{
if *self >= 0 {
return (*self as u8).pack(buf);
}
if *self <= -33 {
buf.extend(iter::once(Format::INT8).chain(iter::once(*self as u8)));
2
} else {
buf.extend(iter::once((*self | -32i8) as u8));
1
}
}
}
impl Packable for i16 {
fn pack<T>(&self, buf: &mut T) -> usize
where
T: Extend<u8>,
{
if *self >= 0 {
return (*self as u16).pack(buf);
}
if *self < i8::MIN as i16 {
buf.extend(iter::once(Format::INT16).chain(self.to_be_bytes()));
3
} else if *self <= -33 {
buf.extend(iter::once(Format::INT8).chain(iter::once((*self as i8) as u8)));
2
} else {
buf.extend(iter::once((*self as i8 | -32i8) as u8));
1
}
}
}
impl Packable for i32 {
fn pack<T>(&self, buf: &mut T) -> usize
where
T: Extend<u8>,
{
if *self >= 0 {
return (*self as u32).pack(buf);
}
if *self < i16::MIN as i32 {
buf.extend(iter::once(Format::INT32).chain(self.to_be_bytes()));
5
} else if *self < i8::MIN as i32 {
buf.extend(iter::once(Format::INT16).chain((*self as i16).to_be_bytes()));
3
} else if *self <= -33 {
buf.extend(iter::once(Format::INT8).chain(iter::once((*self as i8) as u8)));
2
} else {
buf.extend(iter::once((*self | -32i32) as u8));
1
}
}
}
impl Packable for i64 {
fn pack<T>(&self, buf: &mut T) -> usize
where
T: Extend<u8>,
{
if *self >= 0 {
return (*self as u64).pack(buf);
}
if *self < i32::MIN as i64 {
buf.extend(iter::once(Format::INT64).chain(self.to_be_bytes()));
9
} else if *self < i16::MIN as i64 {
buf.extend(iter::once(Format::INT32).chain((*self as i32).to_be_bytes()));
5
} else if *self < i8::MIN as i64 {
buf.extend(iter::once(Format::INT16).chain((*self as i16).to_be_bytes()));
3
} else if *self <= -33 {
buf.extend(iter::once(Format::INT8).chain(iter::once((*self as i8) as u8)));
2
} else {
buf.extend(iter::once((*self | -32i64) as u8));
1
}
}
}
impl Packable for i128 {
fn pack<T>(&self, buf: &mut T) -> usize
where
T: Extend<u8>,
{
if *self >= 0 {
return (*self as u128).pack(buf);
}
if *self < i64::MIN as i128 {
buf.extend(
iter::once(Format::BIN8)
.chain(iter::once(16))
.chain(self.to_be_bytes()),
);
18
} else if *self < i32::MIN as i128 {
buf.extend(iter::once(Format::INT64).chain((*self as i64).to_be_bytes()));
9
} else if *self < i16::MIN as i128 {
buf.extend(iter::once(Format::INT32).chain((*self as i32).to_be_bytes()));
5
} else if *self < i8::MIN as i128 {
buf.extend(iter::once(Format::INT16).chain((*self as i16).to_be_bytes()));
3
} else if *self <= -33 {
buf.extend(iter::once(Format::INT8).chain(iter::once((*self as i8) as u8)));
2
} else {
buf.extend(iter::once((*self | -32i128) as u8));
1
}
}
}
impl Packable for isize {
fn pack<T>(&self, buf: &mut T) -> usize
where
T: Extend<u8>,
{
if *self >= 0 {
return (*self as usize).pack(buf);
}
if *self < i32::MIN as isize {
buf.extend(iter::once(Format::INT64).chain(self.to_be_bytes()));
9
} else if *self < i16::MIN as isize {
buf.extend(iter::once(Format::INT32).chain((*self as i32).to_be_bytes()));
5
} else if *self < i8::MIN as isize {
buf.extend(iter::once(Format::INT16).chain((*self as i16).to_be_bytes()));
3
} else if *self <= -33 {
buf.extend(iter::once(Format::INT8).chain(iter::once((*self as i8) as u8)));
2
} else {
buf.extend(iter::once((*self | -32isize) as u8));
1
}
}
}