use std::ops::Index;
use crate::hpack::HPackItem;
use std::slice::Iter;
pub struct DynamicTable {
values: Vec<HPackItem>,
max_size: usize,
size: usize,
}
impl Default for DynamicTable {
fn default() -> Self {
DynamicTable {
values: Vec::with_capacity(4096),
max_size: 4096,
size: 0,
}
}
}
impl DynamicTable {
pub fn new_size(max_size: usize) -> Self {
DynamicTable {
values: Vec::with_capacity(max_size),
max_size,
size: 0,
}
}
#[cfg(test)]
pub fn size(&self) -> usize { self.size }
pub fn insert(&mut self, item: HPackItem) {
self.size += item.item_size();
self.values.insert(0, item);
self.resize();
}
pub fn get(&self, index: usize) -> Option<&HPackItem> {
let index = index - 61;
self.values.get(index)
}
fn resize(&mut self) {
while self.size > self.max_size {
match self.values.pop() {
None => self.size = 0,
Some(item) => self.size -= item.item_size(),
}
}
}
pub fn update_table_size(&mut self, max_size: usize) {
self.max_size = max_size;
self.resize();
}
pub fn iter(&self) -> Iter<'_, HPackItem> {
self.values.iter()
}
}
impl Index<usize> for DynamicTable {
type Output = HPackItem;
fn index(&self, index: usize) -> &Self::Output {
&self.values[index]
}
}