use serde::{de::DeserializeOwned, Deserialize, Serialize};
pub trait Prefix: Clone + Eq + std::hash::Hash + Serialize + DeserializeOwned {
const MAX_DEPTH: usize;
const MAX_INPUT_LEN: usize = Self::MAX_DEPTH / 8;
fn new() -> Self;
fn push_bit(&mut self, bit: bool);
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(from = "SerdePrefix16", into = "SerdePrefix16")]
pub struct Prefix16 {
bits: u16,
len: u8,
}
impl Prefix for Prefix16 {
const MAX_DEPTH: usize = 16;
fn new() -> Self {
Self { bits: 0, len: 0 }
}
fn push_bit(&mut self, bit: bool) {
self.bits <<= 1;
if bit {
self.bits |= 1;
}
self.len += 1;
}
}
#[derive(Serialize, Deserialize)]
struct SerdePrefix16(u16, u8);
impl From<Prefix16> for SerdePrefix16 {
fn from(prefix: Prefix16) -> Self {
SerdePrefix16(prefix.bits, prefix.len)
}
}
impl From<SerdePrefix16> for Prefix16 {
fn from(prefix: SerdePrefix16) -> Self {
Prefix16 {
bits: prefix.0,
len: prefix.1,
}
}
}