vecdb 0.12.1

High-performance mutable persistent vectors built on rawdb
Documentation
use std::{ops::Deref, sync::Arc};

use crate::{AnyVec, ReadOnlyClone, ReadableVec, StoredVec, TypedVec, VecIndex, VecValue};

use super::CachedVec;

pub trait CachedReadableVec<I, T>: AnyVec + Send + Sync
where
    I: VecIndex,
    T: VecValue,
{
    fn snapshot(&self) -> Arc<Vec<T>>;
    fn invalidate(&self);
    fn cached_boxed_clone(&self) -> CachedBoxedVec<I, T>;
}

pub struct CachedBoxedVec<I, T>(Box<dyn CachedReadableVec<I, T>>)
where
    I: VecIndex,
    T: VecValue;

impl<I, T> CachedBoxedVec<I, T>
where
    I: VecIndex,
    T: VecValue,
{
    pub fn new(inner: impl CachedReadableVec<I, T> + 'static) -> Self {
        Self(Box::new(inner))
    }
}

impl<I, T> Clone for CachedBoxedVec<I, T>
where
    I: VecIndex,
    T: VecValue,
{
    fn clone(&self) -> Self {
        self.0.cached_boxed_clone()
    }
}

impl<I, T> Deref for CachedBoxedVec<I, T>
where
    I: VecIndex,
    T: VecValue,
{
    type Target = dyn CachedReadableVec<I, T>;

    fn deref(&self) -> &Self::Target {
        self.0.as_ref()
    }
}

impl<I, T, V> CachedReadableVec<I, T> for CachedVec<V>
where
    I: VecIndex,
    T: VecValue,
    V: TypedVec<I = I, T = T> + ReadableVec<I, T> + Clone + Send + Sync + 'static,
{
    fn snapshot(&self) -> Arc<Vec<T>> {
        CachedVec::snapshot(self)
    }

    fn invalidate(&self) {
        CachedVec::invalidate(self);
    }

    fn cached_boxed_clone(&self) -> CachedBoxedVec<I, T> {
        CachedBoxedVec::new(self.clone())
    }
}

impl<V> CachedVec<V>
where
    V: StoredVec,
    V::ReadOnly:
        TypedVec<I = V::I, T = V::T> + ReadableVec<V::I, V::T> + Clone + Send + Sync + 'static,
{
    pub fn read_only_cached_boxed_clone(&self) -> CachedBoxedVec<V::I, V::T> {
        CachedBoxedVec::new(self.read_only_clone())
    }
}