#[cfg(test)]
mod test;
use crate::{
DagMapId, DagMapRaw, Orphan, ValueEnDe, common::error::Result, dagmap::raw,
};
use serde::{Deserialize, Serialize};
use std::{
marker::PhantomData,
ops::{Deref, DerefMut},
};
type DagHead<V> = DagMapRawKey<V>;
#[derive(Clone, Debug, Default)]
pub struct DagMapRawKey<V> {
inner: DagMapRaw,
_p: PhantomData<V>,
}
impl<V> Serialize for DagMapRawKey<V> {
fn serialize<S>(&self, serializer: S) -> std::result::Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
self.inner.serialize(serializer)
}
}
impl<'de, V> Deserialize<'de> for DagMapRawKey<V> {
fn deserialize<D>(deserializer: D) -> std::result::Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
DagMapRaw::deserialize(deserializer).map(|inner| Self {
inner,
_p: PhantomData,
})
}
}
impl<V> DagMapRawKey<V>
where
V: ValueEnDe,
{
#[inline(always)]
pub fn new(raw_parent: &mut Orphan<Option<DagMapRaw>>) -> Result<Self> {
DagMapRaw::new(raw_parent).map(|inner| Self {
inner,
_p: PhantomData,
})
}
#[inline(always)]
pub fn into_inner(self) -> DagMapRaw {
self.inner
}
#[inline(always)]
pub unsafe fn shadow_inner(&self) -> DagMapRaw {
unsafe { self.inner.shadow() }
}
#[inline(always)]
pub unsafe fn shadow(&self) -> DagMapRawKey<V> {
unsafe {
Self {
inner: self.shadow_inner(),
_p: PhantomData,
}
}
}
#[inline(always)]
pub fn instance_id(&self) -> u64 {
self.inner.instance_id()
}
pub fn save_meta(&self) -> Result<u64> {
let id = self.instance_id();
crate::common::save_instance_meta(id, self)?;
Ok(id)
}
pub fn from_meta(instance_id: u64) -> Result<Self> {
crate::common::load_instance_meta(instance_id)
}
#[inline(always)]
pub fn is_dead(&self) -> bool {
self.inner.is_dead()
}
#[inline(always)]
pub fn no_children(&self) -> bool {
self.inner.no_children()
}
#[inline(always)]
pub fn get(&self, key: impl AsRef<[u8]>) -> Option<V> {
self.inner.get(key).map(|v| V::decode(&v).unwrap())
}
#[inline(always)]
pub fn get_mut(&mut self, key: impl AsRef<[u8]>) -> Option<ValueMut<'_, V>> {
self.inner.get_mut(key.as_ref()).and_then(|inner| {
if inner.is_empty() {
return None;
}
Some(ValueMut {
value: <V as ValueEnDe>::decode(&inner).unwrap(),
inner,
dirty: false,
})
})
}
#[inline(always)]
pub fn insert(&mut self, key: impl AsRef<[u8]>, value: &V) {
self.inner.insert(key, value.encode())
}
#[inline(always)]
pub fn remove(&mut self, key: impl AsRef<[u8]>) {
self.inner.remove(key)
}
#[inline(always)]
pub fn prune(self) -> Result<DagHead<V>> {
self.inner.prune().map(|inner| Self {
inner,
_p: PhantomData,
})
}
#[inline(always)]
pub fn prune_children_include(&mut self, include_targets: &[impl AsRef<DagMapId>]) {
self.inner.prune_children_include(include_targets);
}
#[inline(always)]
pub fn prune_children_exclude(&mut self, exclude_targets: &[impl AsRef<DagMapId>]) {
self.inner.prune_children_exclude(exclude_targets);
}
#[inline(always)]
pub fn destroy(&mut self) {
self.inner.destroy();
}
#[inline(always)]
pub fn is_the_same_instance(&self, other_hdr: &Self) -> bool {
self.inner.is_the_same_instance(&other_hdr.inner)
}
}
#[derive(Debug)]
pub struct ValueMut<'a, V>
where
V: ValueEnDe,
{
value: V,
inner: raw::ValueMut<'a>,
dirty: bool,
}
impl<V> Drop for ValueMut<'_, V>
where
V: ValueEnDe,
{
fn drop(&mut self) {
if self.dirty {
*self.inner = self.value.encode();
}
}
}
impl<V> Deref for ValueMut<'_, V>
where
V: ValueEnDe,
{
type Target = V;
fn deref(&self) -> &Self::Target {
&self.value
}
}
impl<V> DerefMut for ValueMut<'_, V>
where
V: ValueEnDe,
{
fn deref_mut(&mut self) -> &mut Self::Target {
self.dirty = true;
&mut self.value
}
}