vecdb 0.12.2

High-performance mutable persistent vectors built on rawdb
Documentation
use std::{collections::BTreeSet, path::PathBuf};

use rawdb::{Database, Region};

use crate::{AnyStoredVec, Bytes, Header, Stamp, WritableVec};

use super::{MutableRawVec, MutableVec};

impl<V> AnyStoredVec for MutableVec<V>
where
    V: MutableRawVec,
{
    #[inline]
    fn db_path(&self) -> PathBuf {
        self.vec.db_path()
    }

    #[inline]
    fn region(&self) -> &Region {
        self.vec.region()
    }

    #[inline]
    fn header(&self) -> &Header {
        self.vec.header()
    }

    #[inline]
    fn mut_header(&mut self) -> &mut Header {
        self.vec.mut_header()
    }

    #[inline]
    fn saved_stamped_changes(&self) -> u16 {
        self.vec.saved_stamped_changes()
    }

    fn write(&mut self) -> crate::Result<bool> {
        self.write_inner(true)
    }

    #[inline]
    fn db(&self) -> Database {
        self.vec.db()
    }

    #[inline]
    fn real_stored_len(&self) -> usize {
        self.vec.real_stored_len()
    }

    #[inline]
    fn stored_len(&self) -> usize {
        self.vec.stored_len()
    }

    fn any_stamped_write_with_changes(&mut self, stamp: Stamp) -> crate::Result<()> {
        <Self as WritableVec<V::I, V::T>>::stamped_write_with_changes(self, stamp)
    }

    fn any_save_rollback_state(&mut self) {
        <Self as WritableVec<V::I, V::T>>::save_rollback_state(self)
    }

    fn serialize_changes(&self) -> crate::Result<Vec<u8>> {
        let mut bytes = self.vec.serialize_changes()?;
        let rollback_len = self.vec.rollback_len();
        let indices = self
            .current_updated()
            .keys()
            .chain(self.previous_updated().keys())
            .filter(|&&index| index < rollback_len)
            .copied()
            .collect::<BTreeSet<_>>();

        bytes.extend(indices.len().to_bytes());
        for index in &indices {
            bytes.extend(index.to_bytes());
        }
        self.vec
            .append_previous_values(&indices, self.previous_updated(), &mut bytes);

        let previous_holes = self.holes.previous();
        bytes.extend(previous_holes.len().to_bytes());
        for hole in previous_holes.iter() {
            bytes.extend(hole.to_bytes());
        }

        Ok(bytes)
    }

    fn remove(self) -> crate::Result<()> {
        let db = self.vec.db();
        let holes_region_name = self.holes_region_name();
        let has_stored_holes = self.has_stored_holes;
        self.vec.remove()?;
        if has_stored_holes {
            db.remove_region(&holes_region_name)?;
        }
        Ok(())
    }

    fn any_truncate_if_needed_at(&mut self, index: usize) -> crate::Result<()> {
        <Self as WritableVec<V::I, V::T>>::truncate_if_needed_at(self, index)
    }

    fn any_reset(&mut self) -> crate::Result<()> {
        <Self as WritableVec<V::I, V::T>>::reset(self)
    }
}