diff --git a/Cargo.lock b/Cargo.lock
index 4fabac1e7..3ca72ee8a 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -492,7 +492,7 @@ dependencies = [
"brk_parser",
"brk_server",
"brk_store",
- "brk_vec",
+ "brk_vecs",
]
[[package]]
@@ -542,11 +542,9 @@ dependencies = [
"brk_indexer",
"brk_logger",
"brk_parser",
- "brk_store",
"brk_vecs",
"color-eyre",
"derive_deref",
- "fjall",
"libc",
"log",
"rayon",
@@ -612,7 +610,6 @@ dependencies = [
"brk_vecs",
"color-eyre",
"fjall",
- "libc",
"log",
"rayon",
]
@@ -3384,9 +3381,9 @@ dependencies = [
[[package]]
name = "quick_cache"
-version = "0.6.14"
+version = "0.6.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6b450dad8382b1b95061d5ca1eb792081fb082adf48c678791fe917509596d5f"
+checksum = "8565e62e02af316570d4b492f17af1481d6c07cea60f4e7edd71700da5052ba9"
dependencies = [
"equivalent",
"hashbrown 0.15.4",
diff --git a/Cargo.toml b/Cargo.toml
index d794495e6..4541a34ee 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -40,7 +40,6 @@ brk_mcp = { version = "0.0.81", path = "crates/brk_mcp" }
brk_parser = { version = "0.0.81", path = "crates/brk_parser" }
brk_server = { version = "0.0.81", path = "crates/brk_server" }
brk_store = { version = "0.0.81", path = "crates/brk_store" }
-brk_vec = { version = "0.0.81", path = "crates/brk_vec" }
brk_vecs = { version = "0.0.81", path = "crates/brk_vecs" }
byteview = "=0.6.1"
clap = { version = "4.5.41", features = ["string"] }
diff --git a/crates/brk/Cargo.toml b/crates/brk/Cargo.toml
index 4d872f4b9..3c1f56510 100644
--- a/crates/brk/Cargo.toml
+++ b/crates/brk/Cargo.toml
@@ -22,7 +22,7 @@ full = [
"interface",
"server",
"store",
- "vec",
+ "vecs",
]
bundler = ["brk_bundler"]
core = ["brk_core"]
@@ -36,7 +36,7 @@ parser = ["brk_parser"]
interface = ["brk_interface"]
server = ["brk_server"]
store = ["brk_store"]
-vec = ["brk_vec"]
+vecs = ["brk_vecs"]
[dependencies]
brk_bundler = { workspace = true, optional = true }
@@ -52,7 +52,7 @@ brk_parser = { workspace = true, optional = true }
brk_interface = { workspace = true, optional = true }
brk_server = { workspace = true, optional = true }
brk_store = { workspace = true, optional = true }
-brk_vec = { workspace = true, optional = true }
+brk_vecs = { workspace = true, optional = true }
[package.metadata.docs.rs]
all-features = true
diff --git a/crates/brk/src/lib.rs b/crates/brk/src/lib.rs
index f568a5ba6..1b7f87a0a 100644
--- a/crates/brk/src/lib.rs
+++ b/crates/brk/src/lib.rs
@@ -51,6 +51,6 @@ pub use brk_server as server;
#[doc(inline)]
pub use brk_store as store;
-#[cfg(feature = "vec")]
+#[cfg(feature = "vecs")]
#[doc(inline)]
-pub use brk_vec as vec;
+pub use brk_vecs as vecs;
diff --git a/crates/brk_computer/Cargo.toml b/crates/brk_computer/Cargo.toml
index 1b91586c0..c5f74b692 100644
--- a/crates/brk_computer/Cargo.toml
+++ b/crates/brk_computer/Cargo.toml
@@ -17,11 +17,9 @@ brk_fetcher = { workspace = true }
brk_indexer = { workspace = true }
brk_logger = { workspace = true }
brk_parser = { workspace = true }
-brk_store = { workspace = true }
brk_vecs = { workspace = true }
color-eyre = { workspace = true }
derive_deref = { workspace = true }
-fjall = { workspace = true }
libc = { workspace = true }
log = { workspace = true }
rayon = { workspace = true }
diff --git a/crates/brk_indexer/Cargo.toml b/crates/brk_indexer/Cargo.toml
index c77e9ee7c..d3e1aadf3 100644
--- a/crates/brk_indexer/Cargo.toml
+++ b/crates/brk_indexer/Cargo.toml
@@ -18,6 +18,5 @@ brk_store = { workspace = true }
brk_vecs = { workspace = true }
color-eyre = { workspace = true }
fjall = { workspace = true }
-libc = { workspace = true }
log = { workspace = true }
rayon = { workspace = true }
diff --git a/crates/brk_vec/.gitignore b/crates/brk_vec/.gitignore
deleted file mode 100644
index d1d84f03b..000000000
--- a/crates/brk_vec/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-/vec
-_lib.rs
diff --git a/crates/brk_vec/Cargo.lock b/crates/brk_vec/Cargo.lock
deleted file mode 100644
index 86ab81ef7..000000000
--- a/crates/brk_vec/Cargo.lock
+++ /dev/null
@@ -1,25 +0,0 @@
-# This file is automatically @generated by Cargo.
-# It is not intended for manual editing.
-version = 4
-
-[[package]]
-name = "libc"
-version = "0.2.169"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b5aba8db14291edd000dfcc4d620c7ebfb122c613afb886ca8803fa4e128a20a"
-
-[[package]]
-name = "memmap2"
-version = "0.9.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"
-dependencies = [
- "libc",
-]
-
-[[package]]
-name = "storable_vec"
-version = "0.1.2"
-dependencies = [
- "memmap2",
-]
diff --git a/crates/brk_vec/Cargo.toml b/crates/brk_vec/Cargo.toml
deleted file mode 100644
index d8bbfb936..000000000
--- a/crates/brk_vec/Cargo.toml
+++ /dev/null
@@ -1,28 +0,0 @@
-[package]
-name = "brk_vec"
-description = "A storeable vec"
-keywords = ["vec", "disk", "data"]
-categories = ["database"]
-version.workspace = true
-edition.workspace = true
-license.workspace = true
-homepage.workspace = true
-repository.workspace = true
-
-[dependencies]
-arc-swap = { workspace = true }
-brk_core = { workspace = true }
-brk_exit = { workspace = true }
-clap = { workspace = true }
-clap_derive = { workspace = true }
-log = { workspace = true }
-memmap2 = "0.9.7"
-rayon = { workspace = true }
-serde = { workspace = true }
-serde_json = { workspace = true }
-zerocopy = { workspace = true }
-zerocopy-derive = { workspace = true }
-zstd = "0.13.3"
-
-[package.metadata.cargo-machete]
-ignored = ["clap"]
diff --git a/crates/brk_vec/README.md b/crates/brk_vec/README.md
deleted file mode 100644
index 5b48b5283..000000000
--- a/crates/brk_vec/README.md
+++ /dev/null
@@ -1,38 +0,0 @@
-# BRK Vec
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-A `Vec` (an array) that is stored on disk and thus which can be much larger than the available RAM.
-
-Compared to a key/value store, the data stored is raw byte interpretation of the Vec's values without any overhead which is very efficient. Additionally it uses close to no RAM when caching isn't active and up to 100 MB when it is.
-
-Compression is also available and built on top [`zstd`](https://crates.io/crates/zstd) to save even more space (from 0 to 75%). The tradeoff being slower reading speeds, especially random reading speeds. This is due to the data being stored in compressed pages of 16 KB, which means that if you to read even one value in that page you have to uncompress the whole page.
diff --git a/crates/brk_vec/examples/main.rs b/crates/brk_vec/examples/main.rs
deleted file mode 100644
index 7a79de218..000000000
--- a/crates/brk_vec/examples/main.rs
+++ /dev/null
@@ -1,139 +0,0 @@
-use std::{fs, path::Path};
-
-use brk_core::{DateIndex, Height, Version};
-use brk_vec::{AnyVec, CollectableVec, Format, GenericStoredVec, StoredVec, VecIterator};
-
-type I = DateIndex;
-#[allow(clippy::upper_case_acronyms)]
-type VEC = StoredVec;
-
-fn main() -> Result<(), Box> {
- let _ = fs::remove_dir_all("./vec");
-
- let version = Version::TWO;
- let format = Format::Raw;
-
- {
- let mut vec: VEC = StoredVec::forced_import(Path::new("."), "vec", version, format)?;
-
- (0..21_u32).for_each(|v| {
- vec.push(v);
- });
-
- let mut iter = vec.into_iter();
- dbg!(iter.get(0.into()));
- dbg!(iter.get(1.into()));
- dbg!(iter.get(2.into()));
- dbg!(iter.get(20.into()));
- dbg!(iter.get(21.into()));
-
- vec.flush()?;
-
- // dbg!(vec.header());
- }
-
- {
- let mut vec: VEC = StoredVec::forced_import(Path::new("."), "vec", version, format)?;
-
- vec.mut_header().update_height(Height::new(100));
-
- let mut iter = vec.into_iter();
- dbg!(iter.get(0.into()));
- dbg!(iter.get(1.into()));
- dbg!(iter.get(2.into()));
- dbg!(iter.get(3.into()));
- dbg!(iter.get(4.into()));
- dbg!(iter.get(5.into()));
- dbg!(iter.get(20.into()));
- dbg!(iter.get(20.into()));
- dbg!(iter.get(0.into()));
-
- vec.push(21);
- vec.push(22);
-
- let mut iter = vec.into_iter();
-
- dbg!(iter.get(20.into()));
- dbg!(iter.get(21.into()));
- dbg!(iter.get(22.into()));
- dbg!(iter.get(23.into()));
-
- vec.flush()?;
- }
-
- {
- let mut vec: VEC = StoredVec::forced_import(Path::new("."), "vec", version, format)?;
- let mut iter = vec.into_iter();
-
- dbg!(iter.get(0.into()));
- dbg!(iter.get(20.into()));
- dbg!(iter.get(21.into()));
- dbg!(iter.get(22.into()));
-
- vec.truncate_if_needed(14.into())?;
-
- let mut iter = vec.into_iter();
-
- iter.get(0.into());
- iter.get(5.into());
- dbg!(iter.get(20.into()));
-
- dbg!(vec.collect_signed_range(Some(-5), None)?);
-
- vec.push(vec.len() as u32);
- dbg!(VecIterator::last(vec.into_iter()));
-
- dbg!(vec.into_iter().collect::>());
- }
-
- {
- let mut vec: VEC = StoredVec::forced_import(Path::new("."), "vec", version, format)?;
-
- vec.reset()?;
-
- dbg!(vec.header(), vec.pushed_len(), vec.stored_len(), vec.len());
-
- (0..21_u32).for_each(|v| {
- vec.push(v);
- });
-
- let mut iter = vec.into_iter();
- dbg!(iter.get(0.into()));
- dbg!(iter.get(20.into()));
- dbg!(iter.get(21.into()));
-
- let mmap = vec.create_mmap()?;
- dbg!(vec.take(10.into(), &mmap)?);
- dbg!(vec.get_or_read(10.into(), &mmap)?);
- dbg!(vec.holes());
- vec.flush()?;
- dbg!(vec.holes());
- }
-
- {
- let mut vec: VEC = StoredVec::forced_import(Path::new("."), "vec", version, format)?;
-
- let mmap = vec.create_mmap()?;
-
- dbg!(vec.holes());
- dbg!(vec.get_or_read(10.into(), &mmap)?);
-
- vec.update(10.into(), 10)?;
- vec.update(0.into(), 10)?;
- dbg!(
- vec.holes(),
- vec.get_or_read(0.into(), &mmap)?,
- vec.get_or_read(10.into(), &mmap)?
- );
-
- vec.flush()?;
- }
-
- {
- let vec: VEC = StoredVec::forced_import(Path::new("."), "vec", version, format)?;
-
- dbg!(vec.collect()?);
- }
-
- Ok(())
-}
diff --git a/crates/brk_vec/src/lib.rs b/crates/brk_vec/src/lib.rs
deleted file mode 100644
index a3f1fe79b..000000000
--- a/crates/brk_vec/src/lib.rs
+++ /dev/null
@@ -1,13 +0,0 @@
-#![doc = include_str!("../README.md")]
-#![doc = "\n## Example\n\n```rust"]
-#![doc = include_str!("../examples/main.rs")]
-#![doc = "```"]
-
-mod structs;
-mod traits;
-mod variants;
-
-pub use memmap2::Mmap;
-pub use structs::*;
-pub use traits::*;
-pub use variants::*;
diff --git a/crates/brk_vec/src/structs/compressed_page_meta.rs b/crates/brk_vec/src/structs/compressed_page_meta.rs
deleted file mode 100644
index a0b18cf7e..000000000
--- a/crates/brk_vec/src/structs/compressed_page_meta.rs
+++ /dev/null
@@ -1,18 +0,0 @@
-use zerocopy_derive::{FromBytes, Immutable, IntoBytes, KnownLayout};
-
-#[derive(Debug, Clone, IntoBytes, Immutable, FromBytes, KnownLayout)]
-pub struct CompressedPageMetadata {
- pub start: u64,
- pub bytes_len: u32,
- pub values_len: u32,
-}
-
-impl CompressedPageMetadata {
- pub fn new(start: u64, bytes_len: u32, values_len: u32) -> Self {
- Self {
- start,
- bytes_len,
- values_len,
- }
- }
-}
diff --git a/crates/brk_vec/src/structs/compressed_pages_meta.rs b/crates/brk_vec/src/structs/compressed_pages_meta.rs
deleted file mode 100644
index 6d170e064..000000000
--- a/crates/brk_vec/src/structs/compressed_pages_meta.rs
+++ /dev/null
@@ -1,117 +0,0 @@
-use std::{
- fs::{self, OpenOptions},
- io::{self, Seek, SeekFrom, Write},
- path::{Path, PathBuf},
-};
-
-use brk_core::Result;
-use rayon::prelude::*;
-use zerocopy::{IntoBytes, TryFromBytes};
-
-use super::{CompressedPageMetadata, UnsafeSlice};
-
-#[derive(Debug, Clone)]
-pub struct CompressedPagesMetadata {
- vec: Vec,
- change_at: Option,
- path: PathBuf,
-}
-
-impl CompressedPagesMetadata {
- const PAGE_SIZE: usize = size_of::();
-
- pub fn read(path: &Path) -> Result {
- let this = Self {
- vec: fs::read(path)
- .unwrap_or_default()
- .chunks(Self::PAGE_SIZE)
- .map(|bytes| {
- if bytes.len() != Self::PAGE_SIZE {
- panic!()
- }
- CompressedPageMetadata::try_read_from_bytes(bytes).unwrap()
- })
- .collect::>(),
- path: path.to_owned(),
- change_at: None,
- };
-
- Ok(this)
- }
-
- pub fn write(&mut self) -> io::Result<()> {
- if self.change_at.is_none() {
- return Ok(());
- }
-
- let change_at = self.change_at.take().unwrap();
-
- let len = (self.vec.len() - change_at) * Self::PAGE_SIZE;
-
- let mut bytes: Vec = vec![0; len];
-
- let unsafe_bytes = UnsafeSlice::new(&mut bytes);
-
- self.vec[change_at..]
- .par_iter()
- .enumerate()
- .for_each(|(i, v)| unsafe_bytes.copy_slice(i * Self::PAGE_SIZE, v.as_bytes()));
-
- let mut file = OpenOptions::new()
- .read(true)
- .create(true)
- .truncate(false)
- .append(true)
- .open(&self.path)?;
-
- file.set_len((change_at * Self::PAGE_SIZE) as u64)?;
- file.seek(SeekFrom::End(0))?;
-
- file.write_all(&bytes)?;
-
- Ok(())
- }
-
- pub fn len(&self) -> usize {
- self.vec.len()
- }
-
- pub fn is_empty(&self) -> bool {
- self.len() == 0
- }
-
- pub fn get(&self, page_index: usize) -> Option<&CompressedPageMetadata> {
- self.vec.get(page_index)
- }
-
- pub fn last(&self) -> Option<&CompressedPageMetadata> {
- self.vec.last()
- }
-
- pub fn pop(&mut self) -> Option {
- self.vec.pop()
- }
-
- pub fn push(&mut self, page_index: usize, page: CompressedPageMetadata) {
- if page_index != self.vec.len() {
- panic!();
- }
-
- self.set_changed_at(page_index);
-
- self.vec.push(page);
- }
-
- fn set_changed_at(&mut self, page_index: usize) {
- if self.change_at.is_none_or(|pi| pi > page_index) {
- self.change_at.replace(page_index);
- }
- }
-
- pub fn truncate(&mut self, page_index: usize) -> Option {
- let page = self.get(page_index).cloned();
- self.vec.truncate(page_index);
- self.set_changed_at(page_index);
- page
- }
-}
diff --git a/crates/brk_vec/src/structs/format.rs b/crates/brk_vec/src/structs/format.rs
deleted file mode 100644
index ab5e5452c..000000000
--- a/crates/brk_vec/src/structs/format.rs
+++ /dev/null
@@ -1,66 +0,0 @@
-use std::{fs, io, path::Path};
-
-use brk_core::{Error, Result};
-use clap_derive::ValueEnum;
-use serde::{Deserialize, Serialize};
-
-#[derive(
- Default, Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize, ValueEnum,
-)]
-pub enum Format {
- Compressed,
- #[default]
- Raw,
-}
-
-impl Format {
- pub fn write(&self, path: &Path) -> Result<(), io::Error> {
- fs::write(path, self.as_bytes())
- }
-
- pub fn is_raw(&self) -> bool {
- *self == Self::Raw
- }
-
- pub fn is_compressed(&self) -> bool {
- *self == Self::Compressed
- }
-
- fn as_bytes(&self) -> Vec {
- if self.is_compressed() {
- vec![1]
- } else {
- vec![0]
- }
- }
-
- fn from_bytes(bytes: &[u8]) -> Self {
- if bytes.len() != 1 {
- panic!();
- }
- if bytes[0] == 1 {
- Self::Compressed
- } else if bytes[0] == 0 {
- Self::Raw
- } else {
- panic!()
- }
- }
-
- pub fn validate(&self, path: &Path) -> Result<()> {
- if let Ok(prev_compressed) = Format::try_from(path) {
- if prev_compressed != *self {
- return Err(Error::DifferentCompressionMode);
- }
- }
-
- Ok(())
- }
-}
-
-impl TryFrom<&Path> for Format {
- type Error = Error;
- fn try_from(value: &Path) -> Result {
- Ok(Self::from_bytes(&fs::read(value)?))
- }
-}
diff --git a/crates/brk_vec/src/structs/header.rs b/crates/brk_vec/src/structs/header.rs
deleted file mode 100644
index 30bd0c936..000000000
--- a/crates/brk_vec/src/structs/header.rs
+++ /dev/null
@@ -1,197 +0,0 @@
-use std::{
- fs::File,
- io::{self, Seek, SeekFrom},
- os::unix::fs::FileExt,
- sync::Arc,
-};
-
-use arc_swap::ArcSwap;
-use brk_core::{Error, Height, Result, Version};
-use zerocopy::{FromBytes, IntoBytes};
-use zerocopy_derive::{FromBytes, Immutable, IntoBytes, KnownLayout};
-
-use crate::Format;
-
-const HEADER_VERSION: Version = Version::ONE;
-pub const HEADER_OFFSET: usize = size_of::();
-
-#[derive(Debug, Clone)]
-pub struct Header {
- inner: Arc>,
- modified: bool,
-}
-
-impl Header {
- pub fn create_and_write(file: &mut File, vec_version: Version, format: Format) -> Result {
- let inner = HeaderInner::create_and_write(file, vec_version, format)?;
- Ok(Self {
- inner: Arc::new(ArcSwap::from_pointee(inner)),
- modified: false,
- })
- }
-
- pub fn import_and_verify(
- file: &mut File,
- vec_version: Version,
- format: Format,
- ) -> Result {
- let inner = HeaderInner::import_and_verify(file, vec_version, format)?;
- Ok(Self {
- inner: Arc::new(ArcSwap::from_pointee(inner)),
- modified: false,
- })
- }
-
- pub fn update_height(&mut self, height: Height) {
- self.modified = true;
- self.inner.rcu(|header| {
- let mut header = (**header).clone();
- header.height = height;
- header
- });
- }
-
- pub fn update_computed_version(&mut self, computed_version: Version) {
- self.modified = true;
- self.inner.rcu(|header| {
- let mut header = (**header).clone();
- header.computed_version = computed_version;
- header
- });
- }
-
- pub fn modified(&self) -> bool {
- self.modified
- }
-
- pub fn vec_version(&self) -> Version {
- self.inner.load().vec_version
- }
-
- pub fn computed_version(&self) -> Version {
- self.inner.load().computed_version
- }
-
- pub fn height(&self) -> Height {
- self.inner.load().height
- }
-
- pub fn write(&mut self, file: &mut File) -> io::Result<()> {
- self.inner.load().write(file)?;
- self.modified = false;
- Ok(())
- }
-}
-
-#[repr(C)]
-#[derive(Debug, Clone, FromBytes, IntoBytes, Immutable, KnownLayout)]
-struct HeaderInner {
- pub header_version: Version,
- pub vec_version: Version,
- pub computed_version: Version,
- pub height: Height,
- pub compressed: ZeroCopyBool,
-}
-
-impl HeaderInner {
- pub fn create_and_write(file: &mut File, vec_version: Version, format: Format) -> Result {
- let header = Self {
- header_version: HEADER_VERSION,
- vec_version,
- computed_version: Version::default(),
- height: Height::default(),
- compressed: ZeroCopyBool::from(format),
- };
- header.write(file)?;
- file.seek(SeekFrom::End(0))?;
- Ok(header)
- }
-
- pub fn write(&self, file: &mut File) -> io::Result<()> {
- file.write_all_at(self.as_bytes(), 0)
- }
-
- pub fn import_and_verify(
- file: &mut File,
- vec_version: Version,
- format: Format,
- ) -> Result {
- let len = file.metadata()?.len();
-
- if len < HEADER_OFFSET as u64 {
- return Err(Error::WrongLength);
- }
-
- let mut buf = [0; HEADER_OFFSET];
- file.read_exact_at(&mut buf, 0)?;
-
- let header = HeaderInner::read_from_bytes(&buf)?;
-
- if header.header_version != HEADER_VERSION {
- return Err(Error::DifferentVersion {
- found: header.header_version,
- expected: HEADER_VERSION,
- });
- }
- if header.vec_version != vec_version {
- return Err(Error::DifferentVersion {
- found: header.vec_version,
- expected: vec_version,
- });
- }
- if header.compressed.is_broken() {
- return Err(Error::WrongEndian);
- }
- if (header.compressed.is_true() && format.is_raw())
- || (header.compressed.is_false() && format.is_compressed())
- {
- return Err(Error::DifferentCompressionMode);
- }
-
- Ok(header)
- }
-}
-
-#[derive(
- Debug,
- Clone,
- Copy,
- Default,
- PartialEq,
- Eq,
- PartialOrd,
- Ord,
- FromBytes,
- IntoBytes,
- Immutable,
- KnownLayout,
-)]
-#[repr(C)]
-pub struct ZeroCopyBool(u32);
-
-impl ZeroCopyBool {
- pub const TRUE: Self = Self(1);
- pub const FALSE: Self = Self(0);
-
- pub fn is_true(&self) -> bool {
- *self == Self::TRUE
- }
-
- pub fn is_false(&self) -> bool {
- *self == Self::FALSE
- }
-
- pub fn is_broken(&self) -> bool {
- *self > Self::TRUE
- }
-}
-
-impl From for ZeroCopyBool {
- fn from(value: Format) -> Self {
- if value.is_raw() {
- Self::FALSE
- } else {
- Self::TRUE
- }
- }
-}
diff --git a/crates/brk_vec/src/structs/mod.rs b/crates/brk_vec/src/structs/mod.rs
deleted file mode 100644
index 237b1d4ba..000000000
--- a/crates/brk_vec/src/structs/mod.rs
+++ /dev/null
@@ -1,11 +0,0 @@
-mod compressed_page_meta;
-mod compressed_pages_meta;
-mod format;
-mod header;
-mod unsafe_slice;
-
-pub use compressed_page_meta::*;
-pub use compressed_pages_meta::*;
-pub use format::*;
-pub use header::*;
-pub use unsafe_slice::*;
diff --git a/crates/brk_vec/src/structs/unsafe_slice.rs b/crates/brk_vec/src/structs/unsafe_slice.rs
deleted file mode 100644
index 37bdeb6f4..000000000
--- a/crates/brk_vec/src/structs/unsafe_slice.rs
+++ /dev/null
@@ -1,35 +0,0 @@
-use std::cell::UnsafeCell;
-
-#[derive(Copy, Clone)]
-pub struct UnsafeSlice<'a, T>(&'a [UnsafeCell]);
-unsafe impl Send for UnsafeSlice<'_, T> {}
-unsafe impl Sync for UnsafeSlice<'_, T> {}
-
-impl<'a, T> UnsafeSlice<'a, T> {
- pub fn new(slice: &'a mut [T]) -> Self {
- let ptr = slice as *mut [T] as *const [UnsafeCell];
- Self(unsafe { &*ptr })
- }
-
- /// SAFETY: It is UB if two threads write to the same index without
- /// synchronization.
- pub fn write(&self, i: usize, value: T) {
- unsafe {
- *self.0[i].get() = value;
- }
- }
-
- /// SAFETY: It is UB
- pub fn get(&self, i: usize) -> *mut T {
- self.0[i].get()
- }
-
- pub fn copy_slice(&self, start: usize, slice: &[T])
- where
- T: Copy,
- {
- slice.iter().enumerate().for_each(|(i, v)| {
- self.write(start + i, *v);
- });
- }
-}
diff --git a/crates/brk_vec/src/traits/any.rs b/crates/brk_vec/src/traits/any.rs
deleted file mode 100644
index 84c516788..000000000
--- a/crates/brk_vec/src/traits/any.rs
+++ /dev/null
@@ -1,102 +0,0 @@
-use brk_core::{Height, Version};
-
-use super::{BoxedVecIterator, StoredIndex, StoredType};
-
-pub fn i64_to_usize(i: i64, len: usize) -> usize {
- if i >= 0 {
- (i as usize).min(len)
- } else {
- let v = len as i64 + i;
- if v < 0 { 0 } else { v as usize }
- }
-}
-
-pub trait AnyVec: Send + Sync {
- fn version(&self) -> Version;
- fn name(&self) -> &str;
- fn len(&self) -> usize;
- fn is_empty(&self) -> bool {
- self.len() == 0
- }
- fn index_type_to_string(&self) -> &'static str;
- fn value_type_to_size_of(&self) -> usize;
- fn etag(&self, height: Height, to: Option) -> String {
- let len = self.len();
- format!(
- "{}-{}-{}",
- to.map_or(len, |to| {
- if to.is_negative() {
- len.checked_sub(to.unsigned_abs() as usize)
- .unwrap_or_default()
- } else {
- to as usize
- }
- }),
- u64::from(self.version()),
- u32::from(height),
- )
- }
-
- #[inline]
- fn i64_to_usize(&self, i: i64) -> usize {
- let len = self.len();
- i64_to_usize(i, len)
- }
-}
-
-pub trait AnyIterableVec: AnyVec {
- #[allow(clippy::wrong_self_convention)]
- fn boxed_iter<'a>(&'a self) -> BoxedVecIterator<'a, I, T>
- where
- I: StoredIndex,
- T: StoredType + 'a;
-
- fn iter<'a>(&'a self) -> BoxedVecIterator<'a, I, T>
- where
- I: StoredIndex,
- T: StoredType + 'a,
- {
- self.boxed_iter()
- }
-
- fn iter_at<'a>(&'a self, i: I) -> BoxedVecIterator<'a, I, T>
- where
- I: StoredIndex,
- T: StoredType + 'a,
- {
- let mut iter = self.boxed_iter();
- iter.set(i);
- iter
- }
-
- fn iter_at_<'a>(&'a self, i: usize) -> BoxedVecIterator<'a, I, T>
- where
- I: StoredIndex,
- T: StoredType + 'a,
- {
- let mut iter = self.boxed_iter();
- iter.set_(i);
- iter
- }
-}
-
-pub trait CloneableAnyIterableVec: AnyIterableVec {
- fn boxed_clone(&self) -> Box>;
-}
-
-impl CloneableAnyIterableVec for U
-where
- U: 'static + AnyIterableVec + Clone,
-{
- fn boxed_clone(&self) -> Box> {
- Box::new(self.clone())
- }
-}
-
-impl Clone for Box> {
- fn clone(&self) -> Self {
- self.boxed_clone()
- }
-}
-
-pub type BoxedAnyIterableVec = Box>;
diff --git a/crates/brk_vec/src/traits/collectable.rs b/crates/brk_vec/src/traits/collectable.rs
deleted file mode 100644
index 87d7b840b..000000000
--- a/crates/brk_vec/src/traits/collectable.rs
+++ /dev/null
@@ -1,87 +0,0 @@
-use brk_core::{Error, Result};
-
-use crate::i64_to_usize;
-
-use super::{AnyIterableVec, AnyVec, StoredIndex, StoredType};
-
-pub trait CollectableVec: AnyVec + AnyIterableVec
-where
- Self: Clone,
- I: StoredIndex,
- T: StoredType,
-{
- fn collect(&self) -> Result> {
- self.collect_range(None, None)
- }
-
- fn collect_range(&self, from: Option, to: Option) -> Result> {
- let len = self.len();
- let from = from.unwrap_or_default();
- let to = to.map_or(len, |to| to.min(len));
-
- if from >= len || from >= to {
- return Ok(vec![]);
- }
-
- Ok(self
- .iter_at_(from)
- .take(to - from)
- .map(|(_, v)| v.into_owned())
- .collect::>())
- }
-
- #[inline]
- fn i64_to_usize_(i: i64, len: usize) -> usize {
- if i >= 0 {
- (i as usize).min(len)
- } else {
- let v = len as i64 + i;
- if v < 0 { 0 } else { v as usize }
- }
- }
-
- fn collect_signed_range(&self, from: Option, to: Option) -> Result> {
- let from = from.map(|i| self.i64_to_usize(i));
- let to = to.map(|i| self.i64_to_usize(i));
- self.collect_range(from, to)
- }
-
- #[inline]
- fn collect_range_serde_json(
- &self,
- from: Option,
- to: Option,
- ) -> Result> {
- self.collect_range(from, to)?
- .into_iter()
- .map(|v| serde_json::to_value(v).map_err(Error::from))
- .collect::>>()
- }
-}
-
-impl CollectableVec for V
-where
- V: AnyVec + AnyIterableVec + Clone,
- I: StoredIndex,
- T: StoredType,
-{
-}
-
-pub trait AnyCollectableVec: AnyVec {
- fn collect_range_serde_json(
- &self,
- from: Option,
- to: Option,
- ) -> Result>;
-
- fn range_count(&self, from: Option, to: Option) -> usize {
- let len = self.len();
- let from = from.map(|i| i64_to_usize(i, len));
- let to = to.map(|i| i64_to_usize(i, len));
- (from.unwrap_or_default()..to.unwrap_or(len)).count()
- }
-
- fn range_weight(&self, from: Option, to: Option) -> usize {
- self.range_count(from, to) * self.value_type_to_size_of()
- }
-}
diff --git a/crates/brk_vec/src/traits/generic.rs b/crates/brk_vec/src/traits/generic.rs
deleted file mode 100644
index 75e157db8..000000000
--- a/crates/brk_vec/src/traits/generic.rs
+++ /dev/null
@@ -1,281 +0,0 @@
-use std::{
- borrow::Cow,
- cmp::Ordering,
- collections::{BTreeMap, BTreeSet},
- fs::{self, File, OpenOptions},
- io::{self, Seek, SeekFrom, Write},
- path::{Path, PathBuf},
-};
-
-use brk_core::{Error, Result};
-use memmap2::Mmap;
-
-use crate::{AnyVec, HEADER_OFFSET, Header};
-
-use super::{StoredIndex, StoredType};
-
-pub trait GenericStoredVec: Send + Sync
-where
- Self: AnyVec,
- I: StoredIndex,
- T: StoredType,
-{
- const SIZE_OF_T: usize = size_of::();
-
- #[inline]
- fn unwrap_read(&self, index: I, mmap: &Mmap) -> T {
- self.read(index, mmap).unwrap().unwrap()
- }
- #[inline]
- fn read(&self, index: I, mmap: &Mmap) -> Result