use crate::decl::types::*;
use crate::types::bv::{BvObject};
use crate::storage::KvInterface;
pub struct Memory<KV: KvInterface<Key=Vec<u8>, Value=BvObject, RefKey=[u8]>> {
kv_records: KV,
decl_map: DeclarationMap,
decl_records: DeclarationRecords,
}
impl<KV: KvInterface<Key=Vec<u8>, Value=BvObject, RefKey=[u8]>> Memory<KV> {
pub fn new() -> Self {
Memory {
kv_records: KV::default(),
decl_map: DeclarationMap::new(),
decl_records: DeclarationRecords::new(),
}
}
pub fn get(&self, key: &[u8]) -> &BvObject {
self.kv_records.get(key)
}
pub fn get_mut(&mut self, key: &[u8]) -> &mut BvObject {
self.kv_records.get_mut(key)
}
pub fn len(&self) -> usize {
self.kv_records.len()
}
pub fn has_key(&self, key: &[u8]) -> bool {
self.kv_records.has_key(key)
}
pub fn decl_get_mut(&mut self) -> &mut DeclarationMap {
&mut self.decl_map
}
pub fn kv_records_get_mut(&mut self) -> &mut KV {
&mut self.kv_records
}
pub fn decl_records_get_mut(&mut self) -> &mut DeclarationRecords {
&mut self.decl_records
}
pub fn declaration_map(&self) -> &DeclarationMap {
&self.decl_map
}
pub fn kv_records(&self) -> &KV {
&self.kv_records
}
pub fn decl_records(&self) -> &DeclarationRecords {
&self.decl_records
}
pub fn push_record(&mut self, r: (Vec<u8>, BvObject)) {
self.kv_records.insert(r.0, r.1);
}
pub fn delete_record(&mut self, key: &[u8]) -> BvObject {
self.kv_records.remove(key)
}
}
impl<KV: KvInterface<Key=Vec<u8>, Value=BvObject, RefKey=[u8]>> std::ops::Index<&[u8]> for Memory<KV> {
type Output = BvObject;
fn index(&self, index: &[u8]) -> &Self::Output {
self.kv_records.get(index)
}
}
impl<KV: KvInterface<Key=Vec<u8>, Value=BvObject, RefKey=[u8]>> std::ops::IndexMut<&[u8]> for Memory<KV> {
fn index_mut(&mut self, index: &[u8]) -> &mut Self::Output {
self.kv_records.get_mut(index)
}
}