Skip to content

Commit 1d3fab7

Browse files
authored
Merge pull request #92 from orxfun/extend_from_nonoverlapping
Extend from nonoverlapping
2 parents 4dc8a25 + 002ae18 commit 1d3fab7

2 files changed

Lines changed: 45 additions & 8 deletions

File tree

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "orx-split-vec"
3-
version = "3.22.0"
3+
version = "3.23.0"
44
edition = "2024"
55
authors = ["orxfun <orx.ugur.arikan@gmail.com>"]
66
description = "An efficient dynamic capacity vector with pinned element guarantees."
@@ -12,7 +12,7 @@ categories = ["data-structures", "rust-patterns", "no-std"]
1212
[dependencies]
1313
orx-iterable = { version = "1.3.0", default-features = false }
1414
orx-pseudo-default = { version = "2.1.0", default-features = false }
15-
orx-pinned-vec = { version = "3.21.0", default-features = false }
15+
orx-pinned-vec = { version = "3.23.0", default-features = false }
1616
orx-concurrent-iter = { version = "3.3.0", default-features = false }
1717

1818
[[bench]]

src/pinned_vec.rs

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -317,13 +317,50 @@ impl<T, G: Growth> PinnedVec<T> for SplitVec<T, G> {
317317
let last = &mut self.fragments[f];
318318
let available = last.room();
319319

320-
if available < slice.len() {
321-
last.extend_from_slice(&slice[0..available]);
322-
slice = &slice[available..];
320+
match available < slice.len() {
321+
true => {
322+
last.extend_from_slice(&slice[0..available]);
323+
slice = &slice[available..];
324+
self.add_fragment();
325+
}
326+
false => {
327+
last.extend_from_slice(slice);
328+
break;
329+
}
330+
}
331+
}
332+
}
333+
334+
unsafe fn extend_from_nonoverlapping(&mut self, mut src: *const T, count: usize) {
335+
self.len += count;
336+
let mut left = count;
337+
while left > 0 {
338+
if !self.has_capacity_for_one() {
323339
self.add_fragment();
324-
} else {
325-
last.extend_from_slice(slice);
326-
break;
340+
}
341+
let f = self.fragments.len() - 1;
342+
343+
let last = &mut self.fragments[f];
344+
let last_len = last.len();
345+
let last_available = last.room();
346+
347+
let dst = unsafe { last.as_mut_ptr().add(last.len()) };
348+
match last_available < left {
349+
true => {
350+
unsafe { dst.copy_from_nonoverlapping(src, last_available) };
351+
unsafe { last.set_len(last_len + last_available) };
352+
debug_assert_eq!(last.len(), last.capacity());
353+
354+
src = unsafe { src.add(last_available) };
355+
left -= last_available;
356+
357+
self.add_fragment();
358+
}
359+
false => {
360+
unsafe { dst.copy_from_nonoverlapping(src, left) };
361+
unsafe { last.set_len(last_len + left) };
362+
break;
363+
}
327364
}
328365
}
329366
}

0 commit comments

Comments
 (0)