Skip to content

Commit acf31d7

Browse files
authored
Merge pull request #77 from orxfun/concurrent-iterators
Concurrent iterators
2 parents 4a56e5a + 1f7f087 commit acf31d7

53 files changed

Lines changed: 2185 additions & 489 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/ci.yml

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
name: Rust
2+
3+
on:
4+
push:
5+
branches: [ "main" ]
6+
pull_request:
7+
branches: [ "main" ]
8+
9+
env:
10+
CARGO_TERM_COLOR: always
11+
12+
jobs:
13+
build:
14+
15+
runs-on: ubuntu-latest
16+
strategy:
17+
matrix:
18+
toolchain: ["stable"]
19+
20+
steps:
21+
- uses: actions/checkout@v4
22+
23+
- name: Install toolchain
24+
uses: dtolnay/rust-toolchain@master
25+
with:
26+
toolchain: ${{ matrix.toolchain }}
27+
28+
- name: Install 32bit target
29+
run: rustup target add i686-unknown-linux-musl
30+
- name: Install wasm target
31+
run: rustup target add wasm32v1-none
32+
- name: Install miri
33+
run: rustup component add --toolchain nightly-x86_64-unknown-linux-gnu miri
34+
- name: Install no-std-check
35+
run: cargo install cargo-no-std-check
36+
37+
- name: Build
38+
run: cargo build --verbose
39+
- name: Build-32bit
40+
run: cargo build --verbose --target i686-unknown-linux-musl
41+
- name: Build-wasm
42+
run: cargo build --verbose --target wasm32v1-none
43+
44+
- name: Test
45+
run: cargo test --verbose
46+
- name: Test-32bit
47+
run: cargo test --verbose --target i686-unknown-linux-musl
48+
- name: Check-wasm
49+
run: cargo check --verbose --target wasm32v1-none
50+
51+
- name: Clippy
52+
run: cargo clippy -- -D warnings --verbose
53+
54+
- name: Miri
55+
run: cargo +nightly miri test --verbose
56+
57+
- name: NoStd
58+
run: cargo +nightly no-std-check

Cargo.toml

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
[package]
22
name = "orx-split-vec"
3-
version = "3.15.0"
4-
edition = "2021"
3+
version = "3.16.0"
4+
edition = "2024"
55
authors = ["orxfun <orx.ugur.arikan@gmail.com>"]
66
description = "An efficient dynamic capacity vector with pinned element guarantees."
77
license = "MIT OR Apache-2.0"
@@ -10,9 +10,9 @@ keywords = ["vec", "array", "split", "fragments", "pinned"]
1010
categories = ["data-structures", "rust-patterns", "no-std"]
1111

1212
[dependencies]
13-
orx-iterable = { version = "1.2.0", default-features = false }
14-
orx-pseudo-default = { version = "2.0.0", default-features = false }
15-
orx-pinned-vec = "3.15"
13+
orx-iterable = { version = "1.3.0", default-features = false }
14+
orx-pseudo-default = { version = "2.1.0", default-features = false }
15+
orx-pinned-vec = { version = "3.16.0", default-features = false }
1616

1717
[[bench]]
1818
name = "serial_access"
@@ -23,5 +23,3 @@ criterion = { version = "0.5", default-features = false }
2323
rand = { version = "0.9", default-features = false }
2424
rand_chacha = { version = "0.9", default-features = false }
2525
test-case = "3.3.1"
26-
wasm-bindgen = "0.2"
27-
wasm-bindgen-test = "0.3"

README.md

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -142,19 +142,19 @@ let slice = vec.try_get_slice(3..7);
142142
assert_eq!(slice, SplitVecSlice::OutOfBounds);
143143

144144
// instead of a single slice; we can get an iterator of slices
145-
let slices = vec.slices(..);
145+
let mut slices = vec.slices(..);
146146
assert_eq!(2, slices.len());
147-
assert_eq!(slices[0], &[0, 1, 2, 3]);
148-
assert_eq!(slices[1], &[4]);
147+
assert_eq!(slices.next().unwrap(), &[0, 1, 2, 3]);
148+
assert_eq!(slices.next().unwrap(), &[4]);
149149

150-
let slices = vec.slices(0..3);
150+
let mut slices = vec.slices(0..3);
151151
assert_eq!(1, slices.len());
152-
assert_eq!(slices[0], &[0, 1, 2]);
152+
assert_eq!(slices.next().unwrap(), &[0, 1, 2]);
153153

154-
let slices = vec.slices(3..5);
154+
let mut slices = vec.slices(3..5);
155155
assert_eq!(2, slices.len());
156-
assert_eq!(slices[0], &[3]);
157-
assert_eq!(slices[1], &[4]);
156+
assert_eq!(slices.next().unwrap(), &[3]);
157+
assert_eq!(slices.next().unwrap(), &[4]);
158158
```
159159

160160
Finally, its main difference and objective is to provide pinned element guarantees as demonstrated in the example below.

benches/append.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use criterion::{black_box, criterion_group, criterion_main, BatchSize, BenchmarkId, Criterion};
1+
use criterion::{BatchSize, BenchmarkId, Criterion, black_box, criterion_group, criterion_main};
22
use orx_split_vec::*;
33
use rand::prelude::*;
44
use rand_chacha::ChaCha8Rng;
@@ -17,7 +17,7 @@ fn get_vectors(n: usize) -> Vectors {
1717
let mut rng = ChaCha8Rng::seed_from_u64(685412);
1818
Vectors(
1919
(0..NUM_APPEND_OPS)
20-
.map(|_| (0..n).map(|_| rng.gen_range(0..n)).collect())
20+
.map(|_| (0..n).map(|_| rng.random_range(0..n)).collect())
2121
.collect(),
2222
)
2323
}

benches/random_access.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use criterion::{
2-
black_box, criterion_group, criterion_main, measurement::WallTime, BenchmarkGroup, BenchmarkId,
3-
Criterion,
2+
BenchmarkGroup, BenchmarkId, Criterion, black_box, criterion_group, criterion_main,
3+
measurement::WallTime,
44
};
55
use orx_split_vec::*;
66
use rand::prelude::*;
@@ -10,7 +10,7 @@ fn get_indices(n: usize) -> Vec<usize> {
1010
let mut rng = ChaCha8Rng::seed_from_u64(7541);
1111
let mut vec = Vec::with_capacity(n);
1212
for _ in 0..n {
13-
vec.push(rng.gen_range(0..n));
13+
vec.push(rng.random_range(0..n));
1414
}
1515
vec
1616
}

src/algorithms/tests/binary_search.rs

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::algorithms::binary_search::binary_search_by;
2-
use crate::{test_all_growth_types, Growth, SplitVec};
2+
use crate::{Growth, SplitVec, test_all_growth_types};
33
use core::cmp::Ordering;
44
use orx_pinned_vec::PinnedVec;
55

@@ -78,10 +78,15 @@ fn bin_search_randomized() {
7878
use rand_chacha::ChaCha8Rng;
7979

8080
fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
81+
#[cfg(not(miri))]
82+
let len = 1033;
83+
#[cfg(miri)]
84+
let len = 33;
85+
8186
let mut rng = ChaCha8Rng::seed_from_u64(8654);
8287
let mut ref_vec = alloc::vec![];
8388
let mut idx = 0;
84-
while ref_vec.len() < 1033 {
89+
while ref_vec.len() < len {
8590
if rng.random::<f32>() < 0.85 {
8691
ref_vec.push(idx);
8792
vec.push(idx);

src/algorithms/tests/in_place_sort.rs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use crate::{
2-
algorithms::in_place_sort::{find_position_to_insert, in_place_sort_by},
32
Doubling, Fragment, Growth, Linear, Recursive,
3+
algorithms::in_place_sort::{find_position_to_insert, in_place_sort_by},
44
};
55
use alloc::vec::Vec;
66
use core::cmp::Ordering::*;
@@ -82,11 +82,15 @@ fn sort_simple() {
8282

8383
#[test_case(Doubling)]
8484
#[test_case(Recursive)]
85-
#[test_case(Linear::new(10))]
85+
#[test_case(Linear::new(6))]
8686
fn sort_growth(growth: impl Growth) {
8787
let mut c = |a: &i32, b: &i32| a.cmp(b);
8888

89+
#[cfg(not(miri))]
8990
let num_fragments = 10;
91+
#[cfg(miri)]
92+
let num_fragments = 3;
93+
9094
let mut fragments: Vec<Fragment<_>> = alloc::vec![];
9195

9296
let mut len = 0;

src/common_traits/clone.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ mod tests {
2727
#[test]
2828
fn clone() {
2929
fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
30-
for i in 0..168 {
30+
for i in 0..57 {
3131
vec.push(i);
3232
}
3333

src/common_traits/eq.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ mod tests {
8787
#[test]
8888
fn eq() {
8989
fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
90-
for i in 0..142 {
90+
for i in 0..57 {
9191
vec.push(i);
9292
}
9393

src/common_traits/index.rs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -196,17 +196,17 @@ mod tests {
196196
#[test]
197197
fn index() {
198198
fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
199-
vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
200-
vec.extend_from_slice(&(42..63).collect::<Vec<_>>());
201-
vec.extend_from_slice(&(63..100).collect::<Vec<_>>());
199+
vec.extend_from_slice(&(0..21).collect::<Vec<_>>());
200+
vec.extend_from_slice(&(21..33).collect::<Vec<_>>());
201+
vec.extend_from_slice(&(33..50).collect::<Vec<_>>());
202202

203-
assert_eq!(100, vec.len());
204-
for i in 0..100 {
203+
assert_eq!(50, vec.len());
204+
for i in 0..50 {
205205
assert_eq!(i, vec[i]);
206-
vec[i] += 100;
206+
vec[i] += 50;
207207
}
208-
for i in 0..100 {
209-
assert_eq!(100 + i, vec[i]);
208+
for i in 0..50 {
209+
assert_eq!(50 + i, vec[i]);
210210
}
211211
}
212212
test_all_growth_types!(test);
@@ -215,19 +215,19 @@ mod tests {
215215
#[test]
216216
fn double_indices() {
217217
fn test<G: Growth>(mut vec: SplitVec<usize, G>) {
218-
vec.extend_from_slice(&(0..42).collect::<Vec<_>>());
219-
vec.extend_from_slice(&(42..63).collect::<Vec<_>>());
220-
vec.extend_from_slice(&(63..100).collect::<Vec<_>>());
218+
vec.extend_from_slice(&(0..21).collect::<Vec<_>>());
219+
vec.extend_from_slice(&(21..33).collect::<Vec<_>>());
220+
vec.extend_from_slice(&(33..50).collect::<Vec<_>>());
221221

222-
assert_eq!(100, vec.len());
223-
for i in 0..100 {
222+
assert_eq!(50, vec.len());
223+
for i in 0..50 {
224224
let (f, j) = vec.get_fragment_and_inner_indices(i).expect("is-some");
225225
assert_eq!(i, vec[(f, j)]);
226-
vec[(f, j)] += 100;
226+
vec[(f, j)] += 50;
227227
}
228-
for i in 0..100 {
228+
for i in 0..50 {
229229
let (f, j) = vec.get_fragment_and_inner_indices(i).expect("is-some");
230-
assert_eq!(100 + i, vec[(f, j)]);
230+
assert_eq!(50 + i, vec[(f, j)]);
231231
}
232232
}
233233
test_all_growth_types!(test);

0 commit comments

Comments
 (0)