pub mod memory_map;
use console::network::prelude::*;
use core::{borrow::Borrow, hash::Hash};
use std::borrow::Cow;
pub enum BatchOperation<K: Copy + Clone + PartialEq + Eq + Hash + Send + Sync, V: Clone + PartialEq + Eq + Send + Sync>
{
Insert(K, V),
Remove(K),
}
pub trait Map<
'a,
K: 'a + Copy + Clone + PartialEq + Eq + Hash + Serialize + Deserialize<'a> + Send + Sync,
V: 'a + Clone + PartialEq + Eq + Serialize + Deserialize<'a> + Send + Sync,
>: Clone + MapRead<'a, K, V> + Sync
{
fn insert(&self, key: K, value: V) -> Result<()>;
fn remove(&self, key: &K) -> Result<()>;
fn start_atomic(&self);
fn is_atomic_in_progress(&self) -> bool;
fn abort_atomic(&self);
fn finish_atomic(&self) -> Result<()>;
}
pub trait MapRead<
'a,
K: 'a + Copy + Clone + PartialEq + Eq + Hash + Serialize + Deserialize<'a> + Sync,
V: 'a + Clone + PartialEq + Eq + Serialize + Deserialize<'a> + Sync,
>
{
type Iterator: Iterator<Item = (Cow<'a, K>, Cow<'a, V>)>;
type Keys: Iterator<Item = Cow<'a, K>>;
type Values: Iterator<Item = Cow<'a, V>>;
fn contains_key<Q>(&self, key: &Q) -> Result<bool>
where
K: Borrow<Q>,
Q: PartialEq + Eq + Hash + Serialize + ?Sized;
fn get<Q>(&'a self, key: &Q) -> Result<Option<Cow<'a, V>>>
where
K: Borrow<Q>,
Q: PartialEq + Eq + Hash + Serialize + ?Sized;
fn iter(&'a self) -> Self::Iterator;
fn keys(&'a self) -> Self::Keys;
fn values(&'a self) -> Self::Values;
}
#[macro_export]
macro_rules! atomic_write_batch {
($self:expr, $ops:block) => {
let is_part_of_atomic_batch = $self.is_atomic_in_progress();
if !is_part_of_atomic_batch {
$self.start_atomic();
}
let run_atomic_ops = || -> Result<()> { $ops };
run_atomic_ops().map_err(|err| {
$self.abort_atomic();
err
})?;
if !is_part_of_atomic_batch {
$self.finish_atomic()?;
}
};
}