global: replace Value enum with Cow

This commit is contained in:
nym21
2025-06-27 20:39:19 +02:00
parent 8ea13544de
commit 663092b501
25 changed files with 239 additions and 220 deletions

View File

@@ -20,7 +20,7 @@ where
Ok(self
.iter_at_(from)
.take(to - from)
.map(|(_, v)| v.into_inner())
.map(|(_, v)| v.into_owned())
.collect::<Vec<_>>())
}

View File

@@ -1,4 +1,5 @@
use std::{
borrow::Cow,
fs::{File, OpenOptions},
io::{self, Seek, SeekFrom, Write},
path::{Path, PathBuf},
@@ -6,7 +7,7 @@ use std::{
};
use arc_swap::ArcSwap;
use brk_core::{Result, Value};
use brk_core::Result;
use memmap2::Mmap;
use crate::{AnyVec, HEADER_OFFSET, Header};
@@ -28,11 +29,11 @@ where
fn read_(&self, index: usize, mmap: &Mmap) -> Result<Option<T>>;
#[inline]
fn get_or_read(&self, index: I, mmap: &Mmap) -> Result<Option<Value<T>>> {
fn get_or_read(&self, index: I, mmap: &Mmap) -> Result<Option<Cow<T>>> {
self.get_or_read_(index.to_usize()?, mmap)
}
#[inline]
fn get_or_read_(&self, index: usize, mmap: &Mmap) -> Result<Option<Value<T>>> {
fn get_or_read_(&self, index: usize, mmap: &Mmap) -> Result<Option<Cow<T>>> {
let stored_len = self.stored_len_(mmap);
if index >= stored_len {
@@ -41,9 +42,9 @@ where
if j >= pushed.len() {
return Ok(None);
}
Ok(pushed.get(j).map(Value::Ref))
Ok(pushed.get(j).map(Cow::Borrowed))
} else {
Ok(self.read_(index, mmap)?.map(Value::Owned))
Ok(self.read_(index, mmap)?.map(Cow::Owned))
}
}

View File

@@ -1,6 +1,6 @@
use std::iter::Skip;
use std::{borrow::Cow, iter::Skip};
use brk_core::{Printable, Value};
use brk_core::Printable;
use super::{StoredIndex, StoredType};
@@ -34,7 +34,7 @@ pub trait BaseVecIterator: Iterator {
}
}
pub trait VecIterator<'a>: BaseVecIterator<Item = (Self::I, Value<'a, Self::T>)> {
pub trait VecIterator<'a>: BaseVecIterator<Item = (Self::I, Cow<'a, Self::T>)> {
type I: StoredIndex;
type T: StoredType + 'a;
@@ -44,12 +44,12 @@ pub trait VecIterator<'a>: BaseVecIterator<Item = (Self::I, Value<'a, Self::T>)>
}
#[inline]
fn get_(&mut self, i: usize) -> Option<Value<'a, Self::T>> {
fn get_(&mut self, i: usize) -> Option<Cow<'a, Self::T>> {
self.next_at(i).map(|(_, v)| v)
}
#[inline]
fn get(&mut self, i: Self::I) -> Option<Value<'a, Self::T>> {
fn get(&mut self, i: Self::I) -> Option<Cow<'a, Self::T>> {
self.get_(i.unwrap_to_usize())
}
@@ -65,12 +65,12 @@ pub trait VecIterator<'a>: BaseVecIterator<Item = (Self::I, Value<'a, Self::T>)>
dbg!(self.name(), i, self.len());
panic!("unwrap_get_inner_")
})
.into_inner()
.into_owned()
}
#[inline]
fn get_inner(&mut self, i: Self::I) -> Option<Self::T> {
self.get_(i.unwrap_to_usize()).map(|v| v.into_inner())
self.get_(i.unwrap_to_usize()).map(|v| v.into_owned())
}
fn last(mut self) -> Option<Self::Item>
@@ -83,7 +83,7 @@ pub trait VecIterator<'a>: BaseVecIterator<Item = (Self::I, Value<'a, Self::T>)>
}
let i = len - 1;
self.set_(i);
self.next().map(|(i, v)| (i, Value::Owned(v.into_inner())))
self.next()
}
fn index_type_to_string(&self) -> &'static str {
@@ -93,7 +93,7 @@ pub trait VecIterator<'a>: BaseVecIterator<Item = (Self::I, Value<'a, Self::T>)>
impl<'a, I, T, Iter> VecIterator<'a> for Iter
where
Iter: BaseVecIterator<Item = (I, Value<'a, T>)>,
Iter: BaseVecIterator<Item = (I, Cow<'a, T>)>,
I: StoredIndex,
T: StoredType + 'a,
{
@@ -102,4 +102,4 @@ where
}
pub type BoxedVecIterator<'a, I, T> =
Box<dyn VecIterator<'a, I = I, T = T, Item = (I, Value<'a, T>)> + 'a>;
Box<dyn VecIterator<'a, I = I, T = T, Item = (I, Cow<'a, T>)> + 'a>;

View File

@@ -1,11 +1,12 @@
use std::{
borrow::Cow,
fs, mem,
path::{Path, PathBuf},
sync::Arc,
};
use arc_swap::{ArcSwap, Guard};
use brk_core::{Error, Result, Value, Version};
use brk_core::{Error, Result, Version};
use memmap2::Mmap;
use rayon::prelude::*;
use zstd::DEFAULT_COMPRESSION_LEVEL;
@@ -441,7 +442,7 @@ where
I: StoredIndex,
T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
fn next(&mut self) -> Option<Self::Item> {
let mmap = &self.guard;
@@ -456,7 +457,7 @@ where
self.vec
.pushed()
.get(j)
.map(|v| (I::from(i), Value::Ref(v)))
.map(|v| (I::from(i), Cow::Borrowed(v)))
} else {
let page_index = i / Self::PER_PAGE;
@@ -476,7 +477,7 @@ where
.unwrap()
.1
.get(i % Self::PER_PAGE)
.map(|v| (I::from(i), Value::Owned(v.clone())))
.map(|v| (I::from(i), Cow::Owned(v.clone())))
};
self.index += 1;
@@ -490,7 +491,7 @@ where
I: StoredIndex,
T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
type IntoIter = CompressedVecIterator<'a, I, T>;
fn into_iter(self) -> Self::IntoIter {

View File

@@ -1,10 +1,10 @@
use std::{fs, path::Path};
use std::{borrow::Cow, fs, path::Path};
use brk_exit::Exit;
use clap_derive::ValueEnum;
use serde::{Deserialize, Serialize};
use brk_core::{Result, StoredPhantom, Value, Version};
use brk_core::{Result, StoredPhantom, Version};
use crate::{
AnyCollectableVec, AnyIterableVec, AnyVec, BaseVecIterator, BoxedAnyIterableVec,
@@ -36,7 +36,12 @@ impl Computation {
}
#[derive(Clone)]
pub enum Dependencies<I, T, S1I, S1T, S2I, S2T, S3I, S3T> {
pub enum Dependencies<I, T, S1I, S1T, S2I, S2T, S3I, S3T>
where
S1T: Clone,
S2T: Clone,
S3T: Clone,
{
From1(BoxedAnyIterableVec<S1I, S1T>, ComputeFrom1<I, T, S1I, S1T>),
From2(
(BoxedAnyIterableVec<S1I, S1T>, BoxedAnyIterableVec<S2I, S2T>),
@@ -60,7 +65,12 @@ pub type ComputedVecFrom3<I, T, S1I, S1T, S2I, S2T, S3I, S3T> =
ComputedVec<I, T, S1I, S1T, S2I, S2T, S3I, S3T>;
#[derive(Clone)]
pub enum ComputedVec<I, T, S1I, S1T, S2I, S2T, S3I, S3T> {
pub enum ComputedVec<I, T, S1I, S1T, S2I, S2T, S3I, S3T>
where
S1T: Clone,
S2T: Clone,
S3T: Clone,
{
Eager {
vec: EagerVec<I, T>,
deps: Dependencies<I, T, S1I, S1T, S2I, S2T, S3I, S3T>,
@@ -251,7 +261,12 @@ where
}
}
pub enum ComputedVecIterator<'a, I, T, S1I, S1T, S2I, S2T, S3I, S3T> {
pub enum ComputedVecIterator<'a, I, T, S1I, S1T, S2I, S2T, S3I, S3T>
where
S1T: Clone,
S2T: Clone,
S3T: Clone,
{
Eager(StoredVecIterator<'a, I, T>),
LazyFrom1(LazyVecFrom1Iterator<'a, I, T, S1I, S1T>),
LazyFrom2(LazyVecFrom2Iterator<'a, I, T, S1I, S1T, S2I, S2T>),
@@ -270,7 +285,7 @@ where
S3I: StoredIndex,
S3T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
fn next(&mut self) -> Option<Self::Item> {
match self {
Self::Eager(i) => i.next(),
@@ -335,7 +350,7 @@ where
S3I: StoredIndex,
S3T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
type IntoIter = ComputedVecIterator<'a, I, T, S1I, S1T, S2I, S2T, S3I, S3T>;
fn into_iter(self) -> Self::IntoIter {

View File

@@ -1,5 +1,6 @@
use core::error;
use std::{
borrow::Cow,
cmp::Ordering,
f32,
fmt::Debug,
@@ -10,7 +11,7 @@ use std::{
use arc_swap::ArcSwap;
use brk_core::{
Bitcoin, CheckedSub, Close, Date, DateIndex, Dollars, Error, Result, Sats, StoredF32,
StoredUsize, Value, Version,
StoredUsize, Version,
};
use brk_exit::Exit;
use log::info;
@@ -103,7 +104,7 @@ where
self.0.path()
}
pub fn get_or_read(&self, index: I, mmap: &Mmap) -> Result<Option<Value<T>>> {
pub fn get_or_read(&self, index: I, mmap: &Mmap) -> Result<Option<Cow<T>>> {
self.0.get_or_read(index, mmap)
}
@@ -213,7 +214,7 @@ where
let index = max_from.min(A::from(self.len()));
other.iter_at(index).try_for_each(|(a, b)| {
let (i, v) = t((a, b.into_inner(), self));
let (i, v) = t((a, b.into_owned(), self));
self.forced_push_at(i, v, exit)
})?;
@@ -238,7 +239,7 @@ where
let mut adder_iter = adder.iter();
added.iter_at(index).try_for_each(|(i, v)| {
let v = v.into_inner() + adder_iter.unwrap_get_inner(i);
let v = v.into_owned() + adder_iter.unwrap_get_inner(i);
self.forced_push_at(i, v, exit)
})?;
@@ -265,7 +266,7 @@ where
subtracted.iter_at(index).try_for_each(|(i, v)| {
let v = v
.into_inner()
.into_owned()
.checked_sub(subtracter_iter.unwrap_get_inner(i))
.unwrap();
@@ -302,7 +303,7 @@ where
T::from(source.iter().unwrap_get_inner_(0))
});
}
let max = prev.clone().unwrap().max(T::from(v.into_inner()));
let max = prev.clone().unwrap().max(T::from(v.into_owned()));
prev.replace(max.clone());
self.forced_push_at(i, max, exit)
@@ -332,7 +333,7 @@ where
let mut multiplier_iter = multiplier.iter();
multiplied.iter_at(index).try_for_each(|(i, v)| {
let v = v.into_inner() * multiplier_iter.unwrap_get_inner(i);
let v = v.into_owned() * multiplier_iter.unwrap_get_inner(i);
self.forced_push_at(i, v.into(), exit)
})?;
@@ -416,7 +417,7 @@ where
let mut divider_iter = divider.iter();
divided.iter_at(index).try_for_each(|(i, divided)| {
let divided = divided.into_inner();
let divided = divided.into_owned();
let divider = divider_iter.unwrap_get_inner(i);
let v = if as_percentage {
@@ -451,7 +452,7 @@ where
let index = max_from.min(I::from(self.len()));
let mut close_iter = close.iter();
ath.iter_at(index).try_for_each(|(i, ath)| {
let ath = ath.into_inner();
let ath = ath.into_owned();
if ath == Dollars::ZERO {
self.forced_push_at(i, T::from(StoredF32::default()), exit)
} else {
@@ -479,11 +480,11 @@ where
)?;
let index = max_from.min(
VecIterator::last(self.0.into_iter()).map_or_else(T::default, |(_, v)| v.into_inner()),
VecIterator::last(self.0.into_iter()).map_or_else(T::default, |(_, v)| v.into_owned()),
);
let mut prev_i = None;
other.iter_at(index).try_for_each(|(v, i)| -> Result<()> {
let i = i.into_inner();
let i = i.into_owned();
if prev_i.is_some_and(|prev_i| prev_i == i) {
return Ok(());
}
@@ -647,7 +648,7 @@ where
self_to_other.iter_at(index).try_for_each(|(i, other)| {
self.forced_push_at(
i,
T::from(other_to_self_iter.unwrap_get_inner(other.into_inner()) == i),
T::from(other_to_self_iter.unwrap_get_inner(other.into_owned()) == i),
exit,
)
})?;
@@ -715,7 +716,7 @@ where
.unwrap()
.iter_at(index)
.try_for_each(|(i, v)| {
let mut sum = v.into_inner();
let mut sum = v.into_owned();
others_iter.iter_mut().for_each(|iter| {
sum = sum.clone() + iter.unwrap_get_inner(i);
});
@@ -750,7 +751,7 @@ where
.unwrap()
.iter_at(index)
.try_for_each(|(i, v)| {
let min = v.into_inner();
let min = v.into_owned();
let min = others_iter
.iter_mut()
.map(|iter| iter.unwrap_get_inner(i))
@@ -787,7 +788,7 @@ where
.unwrap()
.iter_at(index)
.try_for_each(|(i, v)| {
let max = v.into_inner();
let max = v.into_owned();
let max = others_iter
.iter_mut()
.map(|iter| iter.unwrap_get_inner(i))
@@ -836,7 +837,7 @@ where
let min_prev_i = min_i.unwrap_or_default().unwrap_to_usize();
let mut other_iter = source.iter();
source.iter_at(index).try_for_each(|(i, value)| {
let value = value.into_inner();
let value = value.into_owned();
if min_i.is_none() || min_i.is_some_and(|min_i| min_i <= i) {
if prev.is_none() {
@@ -924,7 +925,7 @@ where
let index = max_from.min(I::from(self.len()));
let mut source_iter = source.iter();
source.iter_at(index).try_for_each(|(i, current)| {
let current = current.into_inner();
let current = current.into_owned();
let prev = i
.checked_sub(I::from(len))
@@ -963,7 +964,7 @@ where
.unwrap_or_default(),
);
let last_value = f32::from(b.into_inner());
let last_value = f32::from(b.into_owned());
let percentage_change = ((last_value / previous_value) - 1.0) * 100.0;
@@ -999,7 +1000,7 @@ where
percentage_returns
.iter_at(index)
.try_for_each(|(i, percentage)| {
let percentage = percentage.into_inner();
let percentage = percentage.into_owned();
let cagr = (((f32::from(percentage) / 100.0 + 1.0).powf(1.0 / years as f32)) - 1.0)
* 100.0;
@@ -1054,7 +1055,7 @@ impl EagerVec<DateIndex, Sats> {
let index = max_from.min(DateIndex::from(self.len()));
closes.iter_at(index).try_for_each(|(i, closes)| {
let price = *closes.into_inner();
let price = *closes.into_owned();
let i_usize = i.unwrap_to_usize();
if prev.is_none() {
if i_usize == 0 {
@@ -1102,7 +1103,7 @@ impl EagerVec<DateIndex, Sats> {
let index = max_from.min(DateIndex::from(self.len()));
closes.iter_at(index).try_for_each(|(i, closes)| {
let price = *closes.into_inner();
let price = *closes.into_owned();
let i_usize = i.unwrap_to_usize();
if prev.is_none() {
if i_usize == 0 {
@@ -1144,7 +1145,7 @@ impl EagerVec<DateIndex, Dollars> {
let first_price_date = DateIndex::try_from(Date::new(2010, 7, 12)).unwrap();
stacks.iter_at(index).try_for_each(|(i, stack)| {
let stack = stack.into_inner();
let stack = stack.into_owned();
let mut avg_price = Dollars::from(f64::NAN);
if i > first_price_date {
avg_price = DCA_AMOUNT
@@ -1175,7 +1176,7 @@ impl EagerVec<DateIndex, Dollars> {
let from_usize = from.unwrap_to_usize();
stacks.iter_at(index).try_for_each(|(i, stack)| {
let stack = stack.into_inner();
let stack = stack.into_owned();
let mut avg_price = Dollars::from(f64::NAN);
if i >= from {
avg_price =
@@ -1204,7 +1205,7 @@ where
let index = max_from.min(I::from(self.len()));
sats.iter_at(index).try_for_each(|(i, sats)| {
let (i, v) = (i, Bitcoin::from(sats.into_inner()));
let (i, v) = (i, Bitcoin::from(sats.into_owned()));
self.forced_push_at(i, v, exit)
})?;
@@ -1231,7 +1232,7 @@ where
let index = max_from.min(I::from(self.len()));
bitcoin.iter_at(index).try_for_each(|(i, bitcoin)| {
let dollars = price_iter.unwrap_get_inner(i);
let (i, v) = (i, *dollars * bitcoin.into_inner());
let (i, v) = (i, *dollars * bitcoin.into_owned());
self.forced_push_at(i, v, exit)
})?;
@@ -1262,7 +1263,7 @@ where
// bitcoin.iter_at(index).try_for_each(|(i, bitcoin, ..)| {
// let height = i_to_height_iter.unwrap_get_inner(i);
// let dollars = price_iter.unwrap_get_inner(height);
// let (i, v) = (i, *dollars * bitcoin.into_inner());
// let (i, v) = (i, *dollars * bitcoin.into_owned());
// self.forced_push_at(i, v, exit)
// })?;
@@ -1275,7 +1276,7 @@ where
I: StoredIndex,
T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
type IntoIter = StoredVecIterator<'a, I, T>;
fn into_iter(self) -> Self::IntoIter {

View File

@@ -1,7 +1,7 @@
use std::{cmp::Ordering, fmt::Debug, path::Path};
use std::{borrow::Cow, cmp::Ordering, fmt::Debug, path::Path};
use arc_swap::ArcSwap;
use brk_core::{Error, Height, Result, Value, Version};
use brk_core::{Error, Height, Result, Version};
use crate::{
AnyCollectableVec, AnyIterableVec, AnyVec, BoxedVecIterator, CollectableVec, Format,
@@ -30,7 +30,7 @@ where
}
#[inline]
pub fn get_or_read(&self, index: I, mmap: &Mmap) -> Result<Option<Value<T>>> {
pub fn get_or_read(&self, index: I, mmap: &Mmap) -> Result<Option<Cow<T>>> {
self.0.get_or_read(index, mmap)
}
@@ -138,7 +138,7 @@ where
I: StoredIndex,
T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
type IntoIter = StoredVecIterator<'a, I, T>;
fn into_iter(self) -> Self::IntoIter {

View File

@@ -1,6 +1,6 @@
use std::marker::PhantomData;
use std::{borrow::Cow, marker::PhantomData};
use brk_core::{Result, Value, Version};
use brk_core::{Result, Version};
use crate::{
AnyCollectableVec, AnyIterableVec, AnyVec, BaseVecIterator, BoxedAnyIterableVec,
@@ -8,10 +8,13 @@ use crate::{
};
pub type ComputeFrom1<I, T, S1I, S1T> =
for<'a> fn(I, &mut dyn BaseVecIterator<Item = (S1I, Value<'a, S1T>)>) -> Option<T>;
for<'a> fn(I, &mut dyn BaseVecIterator<Item = (S1I, Cow<'a, S1T>)>) -> Option<T>;
#[derive(Clone)]
pub struct LazyVecFrom1<I, T, S1I, S1T> {
pub struct LazyVecFrom1<I, T, S1I, S1T>
where
S1T: Clone,
{
name: String,
version: Version,
source: BoxedAnyIterableVec<S1I, S1T>,
@@ -50,7 +53,10 @@ where
}
}
pub struct LazyVecFrom1Iterator<'a, I, T, S1I, S1T> {
pub struct LazyVecFrom1Iterator<'a, I, T, S1I, S1T>
where
S1T: Clone,
{
lazy: &'a LazyVecFrom1<I, T, S1I, S1T>,
source: BoxedVecIterator<'a, S1I, S1T>,
index: usize,
@@ -63,14 +69,14 @@ where
S1I: StoredIndex,
S1T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
fn next(&mut self) -> Option<Self::Item> {
if self.index >= self.len() {
return None;
}
let index = I::from(self.index);
let opt = (self.lazy.compute)(index, &mut *self.source).map(|v| (index, Value::Owned(v)));
let opt = (self.lazy.compute)(index, &mut *self.source).map(|v| (index, Cow::Owned(v)));
if opt.is_some() {
self.index += 1;
}
@@ -108,7 +114,7 @@ where
S1I: StoredIndex,
S1T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
type IntoIter = LazyVecFrom1Iterator<'a, I, T, S1I, S1T>;
fn into_iter(self) -> Self::IntoIter {

View File

@@ -1,6 +1,6 @@
use std::marker::PhantomData;
use std::{borrow::Cow, marker::PhantomData};
use brk_core::{Result, Value, Version};
use brk_core::{Result, Version};
use crate::{
AnyCollectableVec, AnyIterableVec, AnyVec, BaseVecIterator, BoxedAnyIterableVec,
@@ -9,12 +9,16 @@ use crate::{
pub type ComputeFrom2<I, T, S1I, S1T, S2I, S2T> = for<'a> fn(
I,
&mut dyn BaseVecIterator<Item = (S1I, Value<'a, S1T>)>,
&mut dyn BaseVecIterator<Item = (S2I, Value<'a, S2T>)>,
&mut dyn BaseVecIterator<Item = (S1I, Cow<'a, S1T>)>,
&mut dyn BaseVecIterator<Item = (S2I, Cow<'a, S2T>)>,
) -> Option<T>;
#[derive(Clone)]
pub struct LazyVecFrom2<I, T, S1I, S1T, S2I, S2T> {
pub struct LazyVecFrom2<I, T, S1I, S1T, S2I, S2T>
where
S1T: Clone,
S2T: Clone,
{
name: String,
version: Version,
source1: BoxedAnyIterableVec<S1I, S1T>,
@@ -66,7 +70,11 @@ where
}
}
pub struct LazyVecFrom2Iterator<'a, I, T, S1I, S1T, S2I, S2T> {
pub struct LazyVecFrom2Iterator<'a, I, T, S1I, S1T, S2I, S2T>
where
S1T: Clone,
S2T: Clone,
{
lazy: &'a LazyVecFrom2<I, T, S1I, S1T, S2I, S2T>,
source1: BoxedVecIterator<'a, S1I, S1T>,
source2: BoxedVecIterator<'a, S2I, S2T>,
@@ -82,12 +90,12 @@ where
S2I: StoredIndex,
S2T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
fn next(&mut self) -> Option<Self::Item> {
let index = I::from(self.index);
let opt = (self.lazy.compute)(index, &mut *self.source1, &mut *self.source2)
.map(|v| (index, Value::Owned(v)));
.map(|v| (index, Cow::Owned(v)));
if opt.is_some() {
self.index += 1;
}
@@ -140,7 +148,7 @@ where
S2I: StoredIndex,
S2T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
type IntoIter = LazyVecFrom2Iterator<'a, I, T, S1I, S1T, S2I, S2T>;
fn into_iter(self) -> Self::IntoIter {

View File

@@ -1,6 +1,6 @@
use std::marker::PhantomData;
use std::{borrow::Cow, marker::PhantomData};
use brk_core::{Result, Value, Version};
use brk_core::{Result, Version};
use crate::{
AnyCollectableVec, AnyIterableVec, AnyVec, BaseVecIterator, BoxedAnyIterableVec,
@@ -9,13 +9,18 @@ use crate::{
pub type ComputeFrom3<I, T, S1I, S1T, S2I, S2T, S3I, S3T> = for<'a> fn(
I,
&mut dyn BaseVecIterator<Item = (S1I, Value<'a, S1T>)>,
&mut dyn BaseVecIterator<Item = (S2I, Value<'a, S2T>)>,
&mut dyn BaseVecIterator<Item = (S3I, Value<'a, S3T>)>,
&mut dyn BaseVecIterator<Item = (S1I, Cow<'a, S1T>)>,
&mut dyn BaseVecIterator<Item = (S2I, Cow<'a, S2T>)>,
&mut dyn BaseVecIterator<Item = (S3I, Cow<'a, S3T>)>,
) -> Option<T>;
#[derive(Clone)]
pub struct LazyVecFrom3<I, T, S1I, S1T, S2I, S2T, S3I, S3T> {
pub struct LazyVecFrom3<I, T, S1I, S1T, S2I, S2T, S3I, S3T>
where
S1T: Clone,
S2T: Clone,
S3T: Clone,
{
name: String,
version: Version,
source1: BoxedAnyIterableVec<S1I, S1T>,
@@ -73,7 +78,12 @@ where
}
}
pub struct LazyVecFrom3Iterator<'a, I, T, S1I, S1T, S2I, S2T, S3I, S3T> {
pub struct LazyVecFrom3Iterator<'a, I, T, S1I, S1T, S2I, S2T, S3I, S3T>
where
S1T: Clone,
S2T: Clone,
S3T: Clone,
{
lazy: &'a LazyVecFrom3<I, T, S1I, S1T, S2I, S2T, S3I, S3T>,
source1: BoxedVecIterator<'a, S1I, S1T>,
source2: BoxedVecIterator<'a, S2I, S2T>,
@@ -93,7 +103,7 @@ where
S3I: StoredIndex,
S3T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
fn next(&mut self) -> Option<Self::Item> {
let index = I::from(self.index);
@@ -103,7 +113,7 @@ where
&mut *self.source2,
&mut *self.source3,
)
.map(|v| (index, Value::Owned(v)));
.map(|v| (index, Cow::Owned(v)));
if opt.is_some() {
self.index += 1;
}
@@ -166,7 +176,7 @@ where
S3I: StoredIndex,
S3T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
type IntoIter = LazyVecFrom3Iterator<'a, I, T, S1I, S1T, S2I, S2T, S3I, S3T>;
fn into_iter(self) -> Self::IntoIter {

View File

@@ -1,4 +1,5 @@
use std::{
borrow::Cow,
fs::{self, File},
io,
marker::PhantomData,
@@ -8,7 +9,7 @@ use std::{
};
use arc_swap::{ArcSwap, Guard};
use brk_core::{Error, Result, Value, Version};
use brk_core::{Error, Result, Version};
use memmap2::Mmap;
use rayon::prelude::*;
@@ -23,7 +24,7 @@ const VERSION: Version = Version::ONE;
pub struct RawVec<I, T> {
header: Header,
parent: PathBuf,
name: String,
name: &'static str,
// Consider Arc<ArcSwap<Option<Mmap>>> for dataraces when reorg ?
mmap: Arc<ArcSwap<Mmap>>,
pushed: Vec<T>,
@@ -83,7 +84,7 @@ where
Ok(Self {
mmap,
header,
name: name.to_string(),
name: Box::leak(Box::new(name.to_string())),
parent: parent.to_owned(),
pushed: vec![],
phantom: PhantomData,
@@ -236,7 +237,7 @@ where
#[inline]
fn name(&self) -> &str {
&self.name
self.name
}
#[inline]
@@ -260,7 +261,7 @@ impl<I, T> Clone for RawVec<I, T> {
Self {
header: self.header.clone(),
parent: self.parent.clone(),
name: self.name.clone(),
name: self.name,
mmap: self.mmap.clone(),
pushed: vec![],
phantom: PhantomData,
@@ -301,7 +302,7 @@ where
I: StoredIndex,
T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
fn next(&mut self) -> Option<Self::Item> {
let mmap = &self.guard;
@@ -326,7 +327,7 @@ where
I: StoredIndex,
T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
type IntoIter = RawVecIterator<'a, I, T>;
fn into_iter(self) -> Self::IntoIter {

View File

@@ -1,7 +1,10 @@
use std::path::{Path, PathBuf};
use std::{
borrow::Cow,
path::{Path, PathBuf},
};
use arc_swap::ArcSwap;
use brk_core::{Result, Value, Version};
use brk_core::{Result, Version};
use memmap2::Mmap;
use crate::{
@@ -195,7 +198,7 @@ where
I: StoredIndex,
T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
fn next(&mut self) -> Option<Self::Item> {
match self {
Self::Compressed(i) => i.next(),
@@ -238,7 +241,7 @@ where
I: StoredIndex,
T: StoredType,
{
type Item = (I, Value<'a, T>);
type Item = (I, Cow<'a, T>);
type IntoIter = StoredVecIterator<'a, I, T>;
fn into_iter(self) -> Self::IntoIter {