#[allow(deprecated)]
use std::hash::{Hash, Hasher};
use std::collections::hash_map::RandomState;
use std::collections::HashMap;
static SPACE: u8 = 0xff;
#[derive(PartialEq,Clone,Default,Debug)]
pub struct VecU8 {
inner: Vec<u8>
}
impl VecU8 {
pub fn init_with_vec_u8(data: Vec<u8>) -> VecU8 {
VecU8 {
inner: data
}
}
pub fn len(&self) -> usize{
self.inner.len()
}
pub fn to_vec_u8(self) -> Vec<u8> {
self.inner
}
pub fn to_slice<'a>(&'a self) -> &'a Vec<u8> {
&self.inner
}
}
pub struct VecBool {
inner: Vec<bool>
}
impl VecBool {
pub fn init_with_vec_bool(data: Vec<bool>) -> VecBool {
VecBool {
inner: data
}
}
pub fn to_vec_bool(self) -> Vec<bool> {
self.inner
}
}
pub struct HyperHelper {
slot_size: usize
}
impl HyperHelper {
pub fn new(size: usize) -> HyperHelper {
HyperHelper {
slot_size: size
}
}
pub fn set_slot_size(&mut self, num: usize) {
self.slot_size = num;
}
pub fn slot_size(&self) -> usize {
self.slot_size
}
#[inline]
fn update_vtable(&self, table: &mut Vec<u8>, pivot_index: usize, position: usize) {
let max = table[pivot_index] as usize;
let offset = table.len() - pivot_index + 1;
for i in 0..self.slot_size {
table[pivot_index - self.slot_size*(max - position + 1) + i] = ((offset >> i*8) & 0xff) as u8;
}
}
}
impl HyperHelper {
pub fn child_pivot(bytes: &Vec<u8>, pivot: usize, child: usize, helper: &HyperHelper) -> Option<usize> {
let slot_size = helper.slot_size();
let mut offset = 0usize;
let mut scale = 1usize;
let slot_num = bytes[pivot] as usize;
for i in 0..slot_size {
offset += (bytes[pivot + i - (slot_num - child + 1) * slot_size] as usize) * scale;
scale *= 256;
}
match offset {
0 => return None,
_ => return Some(pivot+offset),
};
}
pub fn push_pivot(filds: u8, table:&mut Vec<u8>, helper: &HyperHelper) {
let slot_size = helper.slot_size() as u8;
table.push((1+filds)*slot_size + 1);
}
pub fn any_field(fields: &mut Vec<usize>, table: & Vec<u8>, root: usize, helper: &HyperHelper) -> Option<(usize, usize, usize)> {
let slot_size = helper.slot_size();
let mut help_pivot = root;
let mut pivot = root;
let len = fields.len();
for i in 0..len {
if table[pivot - 1] == 255 {
return Some((pivot, help_pivot, fields[i] as usize));
}
let mut offset = 0usize;
let mut scale = 1usize;
for j in 0..slot_size {
offset += scale*(table[(pivot - slot_size*((table[pivot] as usize)-fields[i] +1))+j] as usize);
scale *= 256;
}
if offset == 0 {
return None; }
help_pivot = pivot;
pivot += offset;
}
Some((pivot, help_pivot, fields[len - 1] as usize))
}
}
pub trait Table {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> Self;
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper);
}
impl Table for String {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> String {
let slot_size = helper.slot_size();
let father_slot_num = bytes[help_pivot] as usize;
let mut next_child_pivot = None;
for child_index in position+1..father_slot_num {
match HyperHelper::child_pivot(bytes, help_pivot, child_index, helper) {
Some(pivot) => { next_child_pivot = Some(pivot); break;},
None => (),
};
}
match next_child_pivot {
None => {
let mut offset = 0;
let mut scale = 1;
for i in 0..slot_size {
offset += (bytes[help_pivot - slot_size + i] as usize)*scale;
scale *= 256;
}
return String::from_utf8(bytes[pivot..help_pivot+offset+1].to_vec()).unwrap();
},
Some(n) => {
if bytes[n - 1] == SPACE {
return String::from_utf8(bytes[pivot..n-1].to_vec()).unwrap();
} else {
let end = n - (bytes[n] as usize + 1)*slot_size - 1;
return String::from_utf8(bytes[pivot..end].to_vec()).unwrap();
}
}
}
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
if self.len() != 0 {
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
table.append(unsafe{self.as_mut_vec()}); }
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl Table for bool {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> bool {
if bytes[pivot] == 1u8 {
return true;
} else if bytes[pivot] == 0u8 {
return false;
} else {
panic!("{} is not a bool type", bytes[pivot]);
}
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
if *self == true {
table.push(1u8);
} else {
table.push(0u8);
}
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl Table for u8 {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> u8 {
bytes[pivot]
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
table.push(*self);
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl Table for u16 {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> u16 {
bytes[pivot] as u16 + (bytes[pivot+1] as u16) *256
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
let b0:u8 = (*self & 0xff) as u8;
table.push(b0);
let b1:u8 = ((*self >> 8) & 0xff) as u8;
table.push(b1);
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl Table for u32 {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> u32 {
let mut add = 0u32;
let mut scale = 1u32;
for i in 0..4 {
add += (bytes[pivot + i] as u32)*scale;
scale *= 256;
}
add
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
let b0:u8 = (*self & 0xff) as u8;
table.push(b0);
for i in 1..4 {
let b:u8 = ((*self >> i*8) & 0xff) as u8;
table.push(b);
}
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl Table for u64 {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> u64 {
let mut add = 0u64;
let mut scale = 1u64;
for i in 0..8 {
add += (bytes[pivot + i] as u64)*scale;
scale *= 256;
}
add
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
let b0:u8 = (*self & 0xff) as u8;
table.push(b0);
for i in 1..8 {
let b:u8 = ((*self >> i*8) & 0xff) as u8;
table.push(b);
}
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl Table for usize {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> usize {
u64::deserialize(bytes, pivot, help_pivot, position, helper) as usize
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let self_as_u64 = *self as u64;
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
let b0:u8 = (self_as_u64 & 0xff) as u8;
table.push(b0);
for i in 1..8 {
let b:u8 = ((self_as_u64 >> i*8) & 0xff) as u8;
table.push(b);
}
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl Table for i8 {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> i8 {
bytes[pivot] as i8
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let self_as_u8 = *self as u8;
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
table.push(self_as_u8);
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl Table for i16 {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> i16 {
(bytes[pivot] as u16 + (bytes[pivot+1] as u16) *256) as i16
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let self_as_u16 = *self as u16;
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
let b0:u8 = (self_as_u16 & 0xff) as u8;
table.push(b0);
let b1:u8 = ((self_as_u16 >> 8) & 0xff) as u8;
table.push(b1);
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl Table for i32 {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> i32 {
let mut add = 0u32;
let mut scale = 1u32;
for i in 0..4 {
add += (bytes[pivot + i] as u32)*scale;
scale *= 256;
}
add as i32
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
let b0:u8 = (*self & 0xff) as u8;
table.push(b0);
for i in 1..4 {
let b:u8 = ((*self >> i*8) & 0xff) as u8;
table.push(b);
}
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl Table for i64 {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> i64 {
let mut add = 0u64;
let mut scale = 1u64;
for i in 0..8 {
add += (bytes[pivot + i] as u64)*scale;
scale *= 256;
}
add as i64
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
let b0:u8 = (*self & 0xff) as u8;
table.push(b0);
for i in 1..8 {
let b:u8 = ((*self >> i*8) & 0xff) as u8;
table.push(b);
}
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl Table for isize {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> isize {
i64::deserialize(bytes, pivot, help_pivot, position, helper) as isize
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let self_as_u64 = *self as u64;
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
for i in 0..8 {
let b:u8 = ((self_as_u64 >> i*8) & 0xff) as u8;
table.push(b);
}
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl Table for VecU8 {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> VecU8 {
let slot_size = helper.slot_size();
let father_slot_num = bytes[help_pivot] as usize;
let mut next_child_pivot = None;
for child_index in position+1..father_slot_num {
match HyperHelper::child_pivot(bytes, help_pivot, child_index, helper) {
Some(pivot) => { next_child_pivot = Some(pivot); break;},
None => (),
};
}
match next_child_pivot {
None => {
let mut offset = 0;
let mut scale = 1;
for i in 0..slot_size {
offset += (bytes[help_pivot - slot_size + i] as usize)*scale;
scale *= 256;
}
return VecU8::init_with_vec_u8(bytes[pivot..help_pivot+offset+1].to_vec());
},
Some(n) => {
if bytes[n - 1] == SPACE {
return VecU8::init_with_vec_u8(bytes[pivot..n-1].to_vec());
} else {
let end = n - (bytes[n] as usize + 1)*slot_size - 1;
return VecU8::init_with_vec_u8(bytes[pivot..end].to_vec());
}
}
}
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let slot_size = helper.slot_size();
let max = table[pivot_index] as usize;
if self.len() != 0 {
helper.update_vtable(table, pivot_index, position); table.push(SPACE);
table.append(&mut self.inner);
}
if max-1 == position {
let len = table.len() - pivot_index - 1;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
impl<T> Table for Option<T> where T: Table {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> Option<T> {
Some(T::deserialize(bytes, pivot, help_pivot, position, helper))
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
match *self {
None => {
let slot_size = helper.slot_size();
if pivot_index != 0 {
let max = table[pivot_index] as usize;
if position == max - 1 {
let len = table.len() - 1 - pivot_index;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
Some(ref mut t) => t.serialize(table, pivot_index, position, helper),
}
}
}
impl<T> Table for Vec<T> where T: Table {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> Vec<T> {
let slot_size = helper.slot_size();
let mut vec = Vec::new();
let e_num = bytes[pivot] as usize;
for i in 0..e_num {
let mut offset = 0;
let mut scale = 1;
for j in 0..slot_size {
offset += (bytes[j + pivot - slot_size*(e_num - i+ 1)] as usize)*scale;
scale *= 256;
}
vec.push(T::deserialize(bytes, pivot+offset, pivot, i, helper));
}
vec
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let slot_size = helper.slot_size();
table.push(SPACE);
let len = self.len();
let mut vtable = vec![0u8;(len + 1) * slot_size + 1];
table.append(&mut vtable);
let child_pivot_index = table.len() - 1;
table[child_pivot_index] = len as u8;
println!("Vec序列化");
for i in 0..len {
self[i].serialize(table, child_pivot_index, i, helper);
}
if pivot_index != 0 {
let max = table[pivot_index] as usize;
let offset = child_pivot_index - pivot_index;
for i in 0..slot_size {
table[pivot_index - slot_size*(1+max - position)+i] = ((offset >> i*8) & 0xff) as u8;
}
if position == max - 1 {
let len = table.len() - 1 - pivot_index;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
}
impl<K, V> Table for HashMap<K, V, RandomState> where K: Eq + Hash + Table + Clone, V: Table + Default {
fn deserialize(bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> HashMap<K, V, RandomState> {
let slot_size = helper.slot_size();
let mut map = HashMap::new();
let len = bytes[pivot] as usize; for i in 0..len {
let mut offset = 0;
let mut scale = 1;
for j in 0..slot_size {
offset += bytes[pivot - slot_size*(len - i + 1)+ j] as usize *scale;
scale *= 256;
}
let inner_pivot = pivot + offset;
let mut inner_offset_0 = 0;
let mut inner_offset_1 = 0;
let mut scale = 1;
for j in 0..slot_size {
inner_offset_0 += bytes[inner_pivot - slot_size*(2 - 0 + 1)+ j] as usize*scale;
inner_offset_1 += bytes[inner_pivot - slot_size*(2 - 1 + 1)+ j] as usize*scale;
scale *= 256;
}
let child_pivot_0 = inner_pivot + inner_offset_0;
let key = K::deserialize(bytes, child_pivot_0, inner_pivot, 0, helper);
if inner_offset_1 != 0 {
let child_pivot_1 = inner_pivot + inner_offset_1;
let value = V::deserialize(bytes, child_pivot_1, inner_pivot, 1, helper);
map.insert(key, value);
} else {
map.insert(key, Default::default());
}
}
map
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let slot_size = helper.slot_size();
table.push(SPACE);
let len = self.len(); let mut vtable = vec![0u8;(len + 1) * slot_size + 1];
table.append(&mut vtable);
let child_pivot_index = table.len() - 1;
table[child_pivot_index] = len as u8;
let mut i = 0;
for (key,mut value) in self.iter_mut() {
table.push(SPACE);
let inner_len = 2; let mut vtable = vec![0u8;(inner_len + 1) * slot_size + 1];
table.append(&mut vtable);
let inner_child_pivot_index = table.len() - 1;
table[inner_child_pivot_index] = inner_len as u8;
let offset = inner_child_pivot_index - child_pivot_index;
for j in 0..slot_size {
table[child_pivot_index - slot_size*(len-i+1)+j] = ((offset >> j*8) & 0xff) as u8;
}
i += 1;
let mut key = (*key).clone(); key.serialize(table, inner_child_pivot_index, 0, helper);
value.serialize(table, inner_child_pivot_index, 1, helper);
}
let len = table.len() - 1 - child_pivot_index;
for i in 0..slot_size {
table[child_pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
if pivot_index != 0 {
let max = table[pivot_index] as usize;
let offset = child_pivot_index - pivot_index;
for i in 0..slot_size {
table[pivot_index - slot_size*(1+max - position)+i] = ((offset >> i*8) & 0xff) as u8;
}
if position == max - 1 {
let len = table.len() - 1 - pivot_index;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
}
#[macro_export]
macro_rules! realize_table {
( $num:expr, $name:ident { $( $fname:ident : $ftype:ident),* } ) => {
impl Table for $name {
fn deserialize (bytes: &Vec<u8>, pivot: usize, help_pivot: usize, position: usize, helper: &HyperHelper) -> $name {
let mut instance:$name = Default::default();
let mut index = 0;
$(
match HyperHelper::child_pivot(bytes, pivot, index, helper) {
None => (), Some(child_pivot) => {
instance.$fname = $ftype::deserialize(bytes, child_pivot, pivot, index, helper); }
}
index += 1;
)*
instance
}
fn serialize(&mut self, table: &mut Vec<u8>, pivot_index:usize, position: usize, helper: &HyperHelper) {
let field_num = $num; let slot_size = helper.slot_size(); table.push(255u8);
table.append(&mut vec![0u8;(field_num+1)*slot_size+1]);
let child_pivot_index = table.len() - 1;
table[child_pivot_index] = field_num as u8; let mut index = 0;
$(
self.$fname.serialize(table, child_pivot_index, index, helper);
index += 1;
)*
if pivot_index != 0 {
let max = table[pivot_index] as usize;
let offset = child_pivot_index - pivot_index;
for i in 0..slot_size {
table[pivot_index - slot_size*(1+max - position)+i] = ((offset >> i*8) & 0xff) as u8;
}
if position == max - 1 {
let len = table.len() - 1 - pivot_index;
for i in 0..slot_size {
table[pivot_index - slot_size + i] = ((len >> i*8) & 0xff) as u8;
}
}
}
}
}
}
}