use core::marker::PhantomData;
use std::convert::{TryInto};
pub struct BinCodeVecIterator<'a, T : Sized + Copy> {
remaining_buf : &'a [u8],
phantom: PhantomData<&'a T>,
}
pub fn bincode_vec_fixint_len(buf : &[u8]) -> usize {
let (len_chars, _remainder) = buf.split_at(8);
usize::from_le_bytes(len_chars.try_into().unwrap())
}
pub fn bincode_vec_iter<T : Sized + Copy>(buf : &[u8]) -> BinCodeVecIterator<'_, T> {
let (_len_chars, remainder) = buf.split_at(8);
BinCodeVecIterator{remaining_buf: remainder, phantom : PhantomData}
}
impl <'a, T : Sized + Copy>Iterator for BinCodeVecIterator<'a, T> {
type Item = &'a [u8];
fn next(&mut self) -> Option<&'a [u8]> {
let t_size_bytes = ::std::mem::size_of::<T>();
if self.remaining_buf.len() >= t_size_bytes {
let (t_chars, remainder) = self.remaining_buf.split_at(t_size_bytes);
self.remaining_buf = remainder;
Some(t_chars)
} else {
None
}
}
}
pub fn bincode_u64_le_varint(buf : &[u8], num_bytes : &mut usize) -> u64 {
match buf[0] {
251 => {
let (_junk_char, remainder) = buf.split_at(1);
let (len_chars, _remainder) = remainder.split_at(2);
let value = u16::from_le_bytes(len_chars.try_into().unwrap());
*num_bytes = 3;
value as u64
},
252 => {
let (_junk_char, remainder) = buf.split_at(1);
let (len_chars, _remainder) = remainder.split_at(4);
let value = u32::from_le_bytes(len_chars.try_into().unwrap());
*num_bytes = 5;
value as u64
},
253 => {
let (_junk_char, remainder) = buf.split_at(1);
let (len_chars, _remainder) = remainder.split_at(8);
let value = u64::from_le_bytes(len_chars.try_into().unwrap());
*num_bytes = 9;
value
},
254 => {
let (_junk_char, remainder) = buf.split_at(1);
let (len_chars, _remainder) = remainder.split_at(16);
let value = u128::from_le_bytes(len_chars.try_into().unwrap());
*num_bytes = 17;
value as u64
},
_ => {
*num_bytes = 1;
buf[0] as u64
}
}
}