Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
1f68ef2
initiate ExtendPar
orxfun May 1, 2026
72bcc5e
wip
orxfun May 1, 2026
a0b59f5
implement inf_col_into_new working on mutable collection reference
orxfun May 1, 2026
8c853dc
implement inf_arb_col_into_new working with mutable collection reference
orxfun May 1, 2026
ac6e8a5
add missing inf_arb_col_into_new implementations for split vectors
orxfun May 1, 2026
9bffd6b
define and implement new_empty on collectables
orxfun May 1, 2026
a2f878c
revise infallible collect and collect_into implementations
orxfun May 1, 2026
c28f0c5
fix test
orxfun May 1, 2026
1ffa41c
fix tests
orxfun May 1, 2026
d3fb8a0
infallible-use collect-into is refactored to work with mutable reference
orxfun May 1, 2026
fcbd1a2
fix tests
orxfun May 1, 2026
0548bc8
wip
orxfun May 1, 2026
43a6ebd
extend ColIntoOpt with new collect methods
orxfun May 1, 2026
f51d024
extend collectables methods
orxfun May 1, 2026
eecd3e0
clean up
orxfun May 1, 2026
121ab97
refactor collect_into implementations to work with mutable reference
orxfun May 1, 2026
6d9ff1d
clean up
orxfun May 1, 2026
84deaa8
rename collect methods
orxfun May 1, 2026
e4407a1
clean up unused imports
orxfun May 1, 2026
fc2ede4
clean up
orxfun May 1, 2026
091e87b
rename methods
orxfun May 1, 2026
8bd6675
fmt
orxfun May 1, 2026
7f0cfb7
implement extend_par
orxfun May 1, 2026
e2a2d11
implement InfalliblePar for Par and ParUse
orxfun May 1, 2026
213a77a
implement extend_par for both Par and ParUse via common InfalliblePar…
orxfun May 1, 2026
11b97e3
implement extend tests
orxfun May 1, 2026
d428c46
rename ParInfCommon
orxfun May 1, 2026
09ff3c1
define common traits for opt and res
orxfun May 1, 2026
018d610
revise exports
orxfun May 1, 2026
5f9468a
implement parallel extend for fallible iterators
orxfun May 1, 2026
0d5fd73
implement fallible extend tests
orxfun May 1, 2026
0697d1a
upgrade fixed-vec dependency
orxfun May 1, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ categories = ["concurrency", "algorithms"]

[dependencies]
orx-pinned-vec = { version = "3.23.0", default-features = false }
orx-fixed-vec = { version = "3.23.0", default-features = false }
orx-fixed-vec = { version = "3.24.0", default-features = false }
orx-split-vec = { version = "3.23.0", default-features = false }
orx-concurrent-iter = { version = "3.3.0", default-features = false }
orx-concurrent-bag = { version = "3.4.0", default-features = false }
Expand Down
25 changes: 2 additions & 23 deletions src/collectables/alg/merge_collected/merge_arbitrary_into.rs
Original file line number Diff line number Diff line change
@@ -1,37 +1,16 @@
use alloc::vec::Vec;
use orx_split_vec::{Growth, SplitVec};

pub fn merge_arb_into_first_vec<T>(results: Vec<Vec<T>>) -> Vec<T> {
let total_len: usize = results.iter().map(|x| x.len()).sum();
let mut results = results.into_iter();
match results.next() {
None => Default::default(),
Some(mut result) => {
let additional = total_len - result.len();
result.reserve(additional);
for vec in results {
result.extend(vec);
}
result
}
}
}

pub fn merge_arb_into_vec<T>(results: Vec<Vec<T>>, mut dst: Vec<T>) -> Vec<T> {
pub fn merge_arb_into_vec<T>(results: Vec<Vec<T>>, dst: &mut Vec<T>) {
let total_len: usize = results.iter().map(|x| x.len()).sum();
dst.reserve(total_len);
for vec in results {
dst.extend(vec);
}
dst
}

pub fn merge_arb_into_split_vec<T, G: Growth>(
results: Vec<Vec<T>>,
mut dst: SplitVec<T, G>,
) -> SplitVec<T, G> {
pub fn merge_arb_into_split_vec<T, G: Growth>(results: Vec<Vec<T>>, dst: &mut SplitVec<T, G>) {
for vec in results {
dst.extend(vec);
}
dst
}
13 changes: 3 additions & 10 deletions src/collectables/alg/merge_collected/merge_ordered_into.rs
Original file line number Diff line number Diff line change
Expand Up @@ -22,9 +22,8 @@ impl VecPos {
// vec

// TODO: performance: this method can be parallelized by pairwise merging
pub fn merge_ord_into_vec<T>(mut results: Vec<ValsAndIdx<T>>, dst: Option<Vec<T>>) -> Vec<T> {
pub fn merge_ord_into_vec<T>(mut results: Vec<ValsAndIdx<T>>, dst: &mut Vec<T>) {
let collected_len: usize = results.iter().map(|x| x.values.len()).sum();
let mut dst = dst.unwrap_or_else(|| Vec::with_capacity(collected_len));
dst.reserve(collected_len);
let initial_len = dst.len();
let total_len = initial_len + collected_len;
Expand Down Expand Up @@ -63,19 +62,15 @@ pub fn merge_ord_into_vec<T>(mut results: Vec<ValsAndIdx<T>>, dst: Option<Vec<T>
}

unsafe { dst.set_len(total_len) };

dst
}

// splitvec

// TODO: performance: this method can be parallelized by pairwise merging
pub fn merge_ord_into_split_vec<T, G: Growth + PseudoDefault>(
mut results: Vec<ValsAndIdx<T>>,
dst: Option<SplitVec<T, G>>,
) -> SplitVec<T, G> {
let mut dst = dst.unwrap_or_else(|| PseudoDefault::pseudo_default());

dst: &mut SplitVec<T, G>,
) {
let mut queue = BinaryHeap::with_capacity(results.len());
let mut pos_indices = vec![0; results.len()];

Expand Down Expand Up @@ -105,6 +100,4 @@ pub fn merge_ord_into_split_vec<T, G: Growth + PseudoDefault>(
// allocation within vec.capacity() will still be reclaimed; however, as uninitialized memory
unsafe { vec.values.set_len(0) };
}

dst
}
4 changes: 1 addition & 3 deletions src/collectables/alg/merge_collected/mod.rs
Original file line number Diff line number Diff line change
@@ -1,7 +1,5 @@
mod merge_arbitrary_into;
mod merge_ordered_into;

pub use merge_arbitrary_into::{
merge_arb_into_first_vec, merge_arb_into_split_vec, merge_arb_into_vec,
};
pub use merge_arbitrary_into::{merge_arb_into_split_vec, merge_arb_into_vec};
pub use merge_ordered_into::{merge_ord_into_split_vec, merge_ord_into_vec};
22 changes: 0 additions & 22 deletions src/collectables/col_into_inf.rs
Original file line number Diff line number Diff line change
@@ -1,25 +1,3 @@
use crate::infallible::{Par, Xap};
use crate::runner::ParRunner;
use orx_concurrent_iter::ConcurrentIter;

pub trait ColIntoInf<T>: Sized {
// fn empty(exact_len: Option<usize>) -> Self;

fn inf_col_into<I, X, R>(dst: Option<Self>, par: Par<I, X, R>) -> Self
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
R: ParRunner,
T: Send;

fn inf_arb_col_into<I, X, R>(
dst: Option<Self>,
par: Par<I, X, R>,
exact_len: Option<usize>,
) -> Self
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
R: ParRunner,
T: Send;
}
6 changes: 4 additions & 2 deletions src/collectables/inf/col_into_inf.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,16 @@ use crate::runner::ParRunner;
use orx_concurrent_iter::ConcurrentIter;

pub trait ColIntoInf<T>: Sized {
fn inf_col_into<I, X, R>(dst: Option<Self>, par: ParIter<I, X, R>) -> Self
fn new_empty() -> Self;

fn inf_col_into<I, X, R>(dst: &mut Self, par: ParIter<I, X, R>)
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
R: ParRunner,
T: Send;

fn inf_arb_col_into<I, X, R>(dst: Option<Self>, par: ParIter<I, X, R>) -> Self
fn inf_arb_col_into<I, X, R>(dst: &mut Self, par: ParIter<I, X, R>)
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
Expand Down
16 changes: 10 additions & 6 deletions src/collectables/inf/fixed_vec.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,29 @@ use orx_concurrent_iter::ConcurrentIter;
use orx_fixed_vec::FixedVec;

impl<T> ColIntoInf<T> for FixedVec<T> {
fn inf_col_into<I, X, R>(dst: Option<Self>, par: ParIter<I, X, R>) -> Self
fn new_empty() -> Self {
Self::new(0)
}

fn inf_col_into<I, X, R>(dst: &mut Self, par: ParIter<I, X, R>)
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
R: ParRunner,
T: Send,
{
let dst = dst.map(|x| x.into_inner());
<Vec<T> as ColIntoInf<T>>::inf_col_into(dst, par).into()
let dst = dst.as_mut_vec();
<Vec<T> as ColIntoInf<T>>::inf_col_into(dst, par);
}

fn inf_arb_col_into<I, X, R>(dst: Option<Self>, par: ParIter<I, X, R>) -> Self
fn inf_arb_col_into<I, X, R>(dst: &mut Self, par: ParIter<I, X, R>)
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
R: ParRunner,
T: Send,
{
let dst = dst.map(|x| x.into_inner());
<Vec<T> as ColIntoInf<T>>::inf_arb_col_into(dst, par).into()
let dst = dst.as_mut_vec();
<Vec<T> as ColIntoInf<T>>::inf_arb_col_into(dst, par);
}
}
12 changes: 8 additions & 4 deletions src/collectables/inf/split_vec_doubling.rs
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,11 @@ use orx_concurrent_iter::ConcurrentIter;
use orx_split_vec::{Doubling, SplitVec};

impl<T> ColIntoInf<T> for SplitVec<T, Doubling> {
fn inf_col_into<I, X, R>(dst: Option<Self>, par: ParIter<I, X, R>) -> Self
fn new_empty() -> Self {
Self::with_doubling_growth()
}

fn inf_col_into<I, X, R>(dst: &mut Self, par: ParIter<I, X, R>)
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
Expand All @@ -18,10 +22,10 @@ impl<T> ColIntoInf<T> for SplitVec<T, Doubling> {
{
let (iter, x, mut exe, params) = par.destruct();
let results = exe.collect(params, iter, x);
merge_ord_into_split_vec(results, dst)
merge_ord_into_split_vec(results, dst);
}

fn inf_arb_col_into<I, X, R>(dst: Option<Self>, par: ParIter<I, X, R>) -> Self
fn inf_arb_col_into<I, X, R>(dst: &mut Self, par: ParIter<I, X, R>)
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
Expand All @@ -30,6 +34,6 @@ impl<T> ColIntoInf<T> for SplitVec<T, Doubling> {
{
let (iter, x, mut exe, params) = par.destruct();
let results = exe.collect_arb(params, iter, x);
merge_arb_into_split_vec(results, dst.unwrap_or_else(|| Self::with_doubling_growth()))
merge_arb_into_split_vec(results, dst);
}
}
14 changes: 9 additions & 5 deletions src/collectables/inf/split_vec_linear.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3,13 +3,17 @@ use crate::collectables::alg::merge_collected::{
};
use crate::collectables::inf::ColIntoInf;
use crate::infallible::ParRunnerInfallible;
use crate::infallible::{ParIter, ParCore, Xap};
use crate::infallible::{ParCore, ParIter, Xap};
use crate::runner::ParRunner;
use orx_concurrent_iter::ConcurrentIter;
use orx_split_vec::{Linear, SplitVec};

impl<T> ColIntoInf<T> for SplitVec<T, Linear> {
fn inf_col_into<I, X, R>(dst: Option<Self>, par: ParIter<I, X, R>) -> Self
fn new_empty() -> Self {
Self::with_linear_growth(10)
}

fn inf_col_into<I, X, R>(dst: &mut Self, par: ParIter<I, X, R>)
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
Expand All @@ -18,10 +22,10 @@ impl<T> ColIntoInf<T> for SplitVec<T, Linear> {
{
let (iter, x, mut exe, params) = par.destruct();
let results = exe.collect(params, iter, x);
merge_ord_into_split_vec(results, dst)
merge_ord_into_split_vec(results, dst);
}

fn inf_arb_col_into<I, X, R>(dst: Option<Self>, par: ParIter<I, X, R>) -> Self
fn inf_arb_col_into<I, X, R>(dst: &mut Self, par: ParIter<I, X, R>)
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
Expand All @@ -30,6 +34,6 @@ impl<T> ColIntoInf<T> for SplitVec<T, Linear> {
{
let (iter, x, mut exe, params) = par.destruct();
let results = exe.collect_arb(params, iter, x);
merge_arb_into_split_vec(results, dst.unwrap_or_else(|| Self::with_linear_growth(10)))
merge_arb_into_split_vec(results, dst);
}
}
22 changes: 12 additions & 10 deletions src/collectables/inf/split_vec_recursive.rs
Original file line number Diff line number Diff line change
@@ -1,13 +1,19 @@
use crate::collectables::alg::merge_collected::merge_ord_into_split_vec;
use crate::collectables::alg::merge_collected::{
merge_arb_into_split_vec, merge_ord_into_split_vec,
};
use crate::collectables::inf::ColIntoInf;
use crate::infallible::ParRunnerInfallible;
use crate::infallible::{ParIter, ParCore, Xap};
use crate::infallible::{ParCore, ParIter, Xap};
use crate::runner::ParRunner;
use orx_concurrent_iter::ConcurrentIter;
use orx_split_vec::{Recursive, SplitVec};

impl<T> ColIntoInf<T> for SplitVec<T, Recursive> {
fn inf_col_into<I, X, R>(dst: Option<Self>, par: ParIter<I, X, R>) -> Self
fn new_empty() -> Self {
Self::with_recursive_growth()
}

fn inf_col_into<I, X, R>(dst: &mut Self, par: ParIter<I, X, R>)
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
Expand All @@ -16,10 +22,10 @@ impl<T> ColIntoInf<T> for SplitVec<T, Recursive> {
{
let (iter, x, mut exe, params) = par.destruct();
let results = exe.collect(params, iter, x);
merge_ord_into_split_vec(results, dst)
merge_ord_into_split_vec(results, dst);
}

fn inf_arb_col_into<I, X, R>(dst: Option<Self>, par: ParIter<I, X, R>) -> Self
fn inf_arb_col_into<I, X, R>(dst: &mut Self, par: ParIter<I, X, R>)
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
Expand All @@ -28,10 +34,6 @@ impl<T> ColIntoInf<T> for SplitVec<T, Recursive> {
{
let (iter, x, mut exe, params) = par.destruct();
let results = exe.collect_arb(params, iter, x);
let mut dst = dst.unwrap_or_else(|| Self::with_recursive_growth());
for vec in results {
dst.append(vec);
}
dst
merge_arb_into_split_vec(results, dst);
}
}
20 changes: 9 additions & 11 deletions src/collectables/inf/vec.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
use crate::collectables::alg::merge_collected::{
merge_arb_into_first_vec, merge_arb_into_vec, merge_ord_into_vec,
};
use crate::collectables::alg::merge_collected::{merge_arb_into_vec, merge_ord_into_vec};
use crate::collectables::inf::ColIntoInf;
use crate::infallible::ParRunnerInfallible;
use crate::infallible::{ParCore, ParIter, Xap};
Expand All @@ -9,7 +7,11 @@ use alloc::vec::Vec;
use orx_concurrent_iter::ConcurrentIter;

impl<T> ColIntoInf<T> for Vec<T> {
fn inf_col_into<I, X, R>(dst: Option<Self>, par: ParIter<I, X, R>) -> Self
fn new_empty() -> Self {
Self::new()
}

fn inf_col_into<I, X, R>(dst: &mut Self, par: ParIter<I, X, R>)
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
Expand All @@ -18,10 +20,10 @@ impl<T> ColIntoInf<T> for Vec<T> {
{
let (iter, x, mut exe, params) = par.destruct();
let results = exe.collect(params, iter, x);
merge_ord_into_vec(results, dst)
merge_ord_into_vec(results, dst);
}

fn inf_arb_col_into<I, X, R>(dst: Option<Self>, par: ParIter<I, X, R>) -> Self
fn inf_arb_col_into<I, X, R>(dst: &mut Self, par: ParIter<I, X, R>)
where
I: ConcurrentIter,
X: Xap<I = I::Item, O = T>,
Expand All @@ -30,10 +32,6 @@ impl<T> ColIntoInf<T> for Vec<T> {
{
let (iter, x, mut exe, params) = par.destruct();
let results = exe.collect_arb(params, iter, x);

match dst {
Some(dst) => merge_arb_into_vec(results, dst),
None => merge_arb_into_first_vec(results),
}
merge_arb_into_vec(results, dst);
}
}
Loading
Loading