mirror of
https://github.com/bitcoinresearchkit/brk.git
synced 2026-05-09 13:49:09 -07:00
global: replace Value enum with Cow
This commit is contained in:
@@ -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<_>>())
|
||||
}
|
||||
|
||||
|
||||
@@ -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))
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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>;
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user