use std::collections::{BTreeMap, HashMap};
use serde::{Deserialize, Serialize};
use super::{SData, SNode};
pub trait Store<T> {
fn get(&self, id: &str) -> Option<&T>;
fn get_mut(&mut self, id: &str) -> Option<&mut T>;
fn set(&mut self, id: &str, item: T);
fn drop_item(&mut self, id: &str) -> bool;
fn remove(&mut self, id: &str) -> bool;
fn contains(&self, id: &str) -> bool;
fn flush_deadpool(&mut self) -> Vec<T>;
fn flush(&mut self, limit: i32) -> Vec<&mut T>;
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct SNodeStore {
pub store: BTreeMap<String, SNode>,
#[serde(skip)]
pub deadpool: HashMap<String, SNode>,
}
impl Store<SNode> for SNodeStore {
fn get(&self, id: &str) -> Option<&SNode> {
self.store.get(id)
}
fn get_mut(&mut self, id: &str) -> Option<&mut SNode> {
self.store.get_mut(id)
}
fn set(&mut self, id: &str, item: SNode) {
self.store.insert(id.to_owned(), item);
}
fn drop_item(&mut self, id: &str) -> bool {
self.store.remove(id).is_some()
}
fn remove(&mut self, id: &str) -> bool {
if let Some(node) = self.store.remove(id) {
self.deadpool.insert(node.id.clone(), node);
return true;
}
false
}
fn contains(&self, id: &str) -> bool {
self.store.contains_key(id)
}
fn flush_deadpool(&mut self) -> Vec<SNode> {
let mut res = Vec::new();
for (_, node) in self.deadpool.drain() { res.push(node); }
res
}
fn flush(&mut self, limit: i32) -> Vec<&mut SNode> {
let mut res = Vec::new();
let mut n = 0;
for (_, node) in &mut self.store {
if node.has_dirty() {
n += 1;
res.push(node);
if limit > -1 && n >= limit { break; }
}
}
res
}
}
#[derive(Debug, Clone, Deserialize, Serialize, Default)]
pub struct SDataStore {
pub store: BTreeMap<String, SData>,
#[serde(skip)]
pub deadpool: HashMap<String, SData>,
}
impl Store<SData> for SDataStore {
fn get(&self, id: &str) -> Option<&SData> {
self.store.get(id)
}
fn get_mut(&mut self, id: &str) -> Option<&mut SData> {
self.store.get_mut(id)
}
fn set(&mut self, id: &str, item: SData) {
self.store.insert(id.to_owned(), item);
}
fn drop_item(&mut self, id: &str) -> bool {
self.store.remove(id).is_some()
}
fn remove(&mut self, id: &str) -> bool {
if let Some(data) = self.store.remove(id) {
self.deadpool.insert(data.id.clone(), data);
return true;
}
false
}
fn contains(&self, id: &str) -> bool {
self.store.contains_key(id)
}
fn flush_deadpool(&mut self) -> Vec<SData> {
let mut res = Vec::new();
for (_, data) in self.deadpool.drain() { res.push(data); }
res
}
fn flush(&mut self, limit: i32) -> Vec<&mut SData> {
let mut res = Vec::new();
let mut n = 0;
for (_, data) in &mut self.store {
if data.has_dirty() {
n += 1;
res.push(data);
if limit > -1 && n >= limit { break; }
}
}
res
}
}