use std::{ borrow::Cow, collections::{BTreeMap, BTreeSet}, path::{Path, PathBuf}, }; use brk_core::{Result, Version}; use memmap2::Mmap; use crate::{ AnyCollectableVec, AnyIterableVec, AnyVec, BaseVecIterator, BoxedVecIterator, CollectableVec, Format, GenericStoredVec, Header, StoredIndex, StoredType, }; use super::{CompressedVec, CompressedVecIterator, RawVec, RawVecIterator}; #[derive(Debug, Clone)] pub enum StoredVec { Raw(RawVec), Compressed(CompressedVec), } impl StoredVec where I: StoredIndex, T: StoredType, { pub fn forced_import( path: &Path, name: &str, version: Version, format: Format, ) -> Result { if version == Version::ZERO { dbg!(path, name); panic!("Version must be at least 1, can't verify endianess otherwise"); } if format.is_compressed() { Ok(Self::Compressed(CompressedVec::forced_import( path, name, version, )?)) } else { Ok(Self::Raw(RawVec::forced_import(path, name, version)?)) } } } impl GenericStoredVec for StoredVec where I: StoredIndex, T: StoredType, { #[inline] fn read_(&self, index: usize, guard: &Mmap) -> Result> { match self { StoredVec::Raw(v) => v.read_(index, guard), StoredVec::Compressed(v) => v.read_(index, guard), } } #[inline] fn header(&self) -> &Header { match self { StoredVec::Raw(v) => v.header(), StoredVec::Compressed(v) => v.header(), } } #[inline] fn mut_header(&mut self) -> &mut Header { match self { StoredVec::Raw(v) => v.mut_header(), StoredVec::Compressed(v) => v.mut_header(), } } #[inline] fn parent(&self) -> &Path { match self { StoredVec::Raw(v) => v.parent(), StoredVec::Compressed(v) => v.parent(), } } #[inline] fn stored_len(&self) -> usize { match self { StoredVec::Raw(v) => v.stored_len(), StoredVec::Compressed(v) => v.stored_len(), } } #[inline] fn pushed(&self) -> &[T] { match self { StoredVec::Raw(v) => v.pushed(), StoredVec::Compressed(v) => v.pushed(), } } #[inline] fn mut_pushed(&mut self) -> &mut Vec { match self { StoredVec::Raw(v) => v.mut_pushed(), StoredVec::Compressed(v) => v.mut_pushed(), } } #[inline] fn holes(&self) -> &BTreeSet { match self { StoredVec::Raw(v) => v.holes(), StoredVec::Compressed(v) => v.holes(), } } #[inline] fn mut_holes(&mut self) -> &mut BTreeSet { match self { StoredVec::Raw(v) => v.mut_holes(), StoredVec::Compressed(v) => v.mut_holes(), } } #[inline] fn updated(&self) -> &BTreeMap { match self { StoredVec::Raw(v) => v.updated(), StoredVec::Compressed(v) => v.updated(), } } #[inline] fn mut_updated(&mut self) -> &mut BTreeMap { match self { StoredVec::Raw(v) => v.mut_updated(), StoredVec::Compressed(v) => v.mut_updated(), } } #[inline] fn path(&self) -> PathBuf { match self { StoredVec::Raw(v) => v.path(), StoredVec::Compressed(v) => v.path(), } } fn flush(&mut self) -> Result<()> { match self { StoredVec::Raw(v) => v.flush(), StoredVec::Compressed(v) => v.flush(), } } fn truncate_if_needed(&mut self, index: I) -> Result<()> { match self { StoredVec::Raw(v) => v.truncate_if_needed(index), StoredVec::Compressed(v) => v.truncate_if_needed(index), } } fn reset(&mut self) -> Result<()> { match self { StoredVec::Raw(v) => v.reset(), StoredVec::Compressed(v) => v.reset(), } } } impl AnyVec for StoredVec where I: StoredIndex, T: StoredType, { #[inline] fn version(&self) -> Version { match self { StoredVec::Raw(v) => v.version(), StoredVec::Compressed(v) => v.version(), } } #[inline] fn index_type_to_string(&self) -> &'static str { I::to_string() } #[inline] fn len(&self) -> usize { self.pushed_len() + self.stored_len() } fn name(&self) -> &str { match self { StoredVec::Raw(v) => v.name(), StoredVec::Compressed(v) => v.name(), } } #[inline] fn value_type_to_size_of(&self) -> usize { size_of::() } } #[derive(Debug)] pub enum StoredVecIterator<'a, I, T> { Raw(RawVecIterator<'a, I, T>), Compressed(CompressedVecIterator<'a, I, T>), } impl<'a, I, T> Iterator for StoredVecIterator<'a, I, T> where I: StoredIndex, T: StoredType, { type Item = (I, Cow<'a, T>); fn next(&mut self) -> Option { match self { Self::Compressed(i) => i.next(), Self::Raw(i) => i.next(), } } } impl BaseVecIterator for StoredVecIterator<'_, I, T> where I: StoredIndex, T: StoredType, { #[inline] fn mut_index(&mut self) -> &mut usize { match self { Self::Compressed(iter) => iter.mut_index(), Self::Raw(iter) => iter.mut_index(), } } fn len(&self) -> usize { match self { Self::Compressed(i) => i.len(), Self::Raw(i) => i.len(), } } #[inline] fn name(&self) -> &str { match self { Self::Compressed(i) => i.name(), Self::Raw(i) => i.name(), } } } impl<'a, I, T> IntoIterator for &'a StoredVec where I: StoredIndex, T: StoredType, { type Item = (I, Cow<'a, T>); type IntoIter = StoredVecIterator<'a, I, T>; fn into_iter(self) -> Self::IntoIter { match self { StoredVec::Compressed(v) => StoredVecIterator::Compressed(v.into_iter()), StoredVec::Raw(v) => StoredVecIterator::Raw(v.into_iter()), } } } impl AnyIterableVec for StoredVec where I: StoredIndex, T: StoredType, { fn boxed_iter<'a>(&'a self) -> BoxedVecIterator<'a, I, T> where T: 'a, { Box::new(self.into_iter()) } } impl AnyCollectableVec for StoredVec where I: StoredIndex, T: StoredType, { fn collect_range_serde_json( &self, from: Option, to: Option, ) -> Result> { CollectableVec::collect_range_serde_json(self, from, to) } }