use serde::{Deserialize, Serialize};
use std::collections::HashMap;
use std::sync::Arc;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DataTable(HashMap<Vec<u8>, Arc<Vec<u8>>>);
impl DataTable {
pub fn with_capacity(capacity: usize) -> Self {
Self(HashMap::with_capacity(capacity))
}
pub fn new() -> Self {
Self(HashMap::new())
}
pub fn get_value(&self, key: &[u8]) -> Option<Arc<Vec<u8>>> {
self.0.get(key).cloned()
}
pub fn set_value(&mut self, key: Vec<u8>, value: Vec<u8>) -> Option<Arc<Vec<u8>>> {
self.0.insert(key, Arc::new(value))
}
pub fn delete_value(&mut self, key: &[u8]) -> Option<Arc<Vec<u8>>> {
self.0.remove(key)
}
pub fn has_key(&self, key: &[u8]) -> bool {
self.0.contains_key(key)
}
pub fn len(&self) -> usize {
self.0.len()
}
pub fn is_empty(&self) -> bool {
self.0.is_empty()
}
pub fn all_keys(&self) -> Vec<Vec<u8>> {
self.0.keys().cloned().collect()
}
pub fn get_multiple(&self, keys: &[Vec<u8>]) -> Vec<(Vec<u8>, Arc<Vec<u8>>)> {
keys.iter()
.filter_map(|key| self.0.get(key).map(|value| (key.clone(), value.clone())))
.collect()
}
pub fn set_multiple(
&mut self,
items: Vec<(Vec<u8>, Vec<u8>)>,
) -> Vec<(Vec<u8>, Option<Arc<Vec<u8>>>)> {
items
.into_iter()
.map(|(key, value)| {
let old_value = self.0.insert(key.clone(), Arc::new(value));
(key, old_value)
})
.collect()
}
pub fn delete_multiple(&mut self, keys: Vec<Vec<u8>>) -> Vec<(Vec<u8>, Option<Arc<Vec<u8>>>)> {
keys.into_iter()
.map(|key| {
let old_value = self.0.remove(&key);
(key, old_value)
})
.collect()
}
pub fn snapshot(&self) -> Self {
Self(self.0.clone())
}
pub fn restore_snapshot(&mut self, snapshot: DataTable) {
self.0 = snapshot.0;
}
pub fn clear(&mut self) {
self.0.clear();
}
pub fn total_value_size(&self) -> usize {
self.0.values().map(|v| v.len()).sum()
}
pub fn total_key_size(&self) -> usize {
self.0.keys().map(|k| k.len()).sum()
}
pub fn total_size(&self) -> usize {
self.0.iter().map(|(k, v)| k.len() + v.len()).sum()
}
pub fn iter(&self) -> impl Iterator<Item = (&Vec<u8>, &Arc<Vec<u8>>)> {
self.0.iter()
}
}
impl Default for DataTable {
fn default() -> Self {
Self::new()
}
}
impl std::ops::Deref for DataTable {
type Target = HashMap<Vec<u8>, Arc<Vec<u8>>>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl std::ops::DerefMut for DataTable {
fn deref_mut(&mut self) -> &mut Self::Target {
&mut self.0
}
}