From 74159938759765395f8a12698ea3c520758b8264 Mon Sep 17 00:00:00 2001 From: orxfun Date: Sun, 12 Apr 2026 17:36:37 +0200 Subject: [PATCH 1/3] implement extend_from_nonoverlapping for generic growth strategies --- Cargo.toml | 3 ++- src/pinned_vec.rs | 48 +++++++++++++++++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 7 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index d48b17b..7d55505 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -12,7 +12,8 @@ categories = ["data-structures", "rust-patterns", "no-std"] [dependencies] orx-iterable = { version = "1.3.0", default-features = false } orx-pseudo-default = { version = "2.1.0", default-features = false } -orx-pinned-vec = { version = "3.21.0", default-features = false } +# orx-pinned-vec = { version = "3.21.0", default-features = false } +orx-pinned-vec = { path = "../orx-pinned-vec", default-features = false } orx-concurrent-iter = { version = "3.3.0", default-features = false } [[bench]] diff --git a/src/pinned_vec.rs b/src/pinned_vec.rs index bad277b..f9a96f9 100644 --- a/src/pinned_vec.rs +++ b/src/pinned_vec.rs @@ -317,13 +317,49 @@ impl PinnedVec for SplitVec { let last = &mut self.fragments[f]; let available = last.room(); - if available < slice.len() { - last.extend_from_slice(&slice[0..available]); - slice = &slice[available..]; + match available < slice.len() { + true => { + last.extend_from_slice(&slice[0..available]); + slice = &slice[available..]; + self.add_fragment(); + } + false => { + last.extend_from_slice(slice); + break; + } + } + } + } + + unsafe fn extend_from_nonoverlapping(&mut self, mut src: *const T, count: usize) { + self.len += count; + let mut left = count; + while left > 0 { + if !self.has_capacity_for_one() { self.add_fragment(); - } else { - last.extend_from_slice(slice); - break; + } + let f = self.fragments.len() - 1; + + let last = &mut self.fragments[f]; + let last_len = last.len(); + let last_available = last.room(); + + let dst = unsafe { last.as_mut_ptr().add(last.len()) }; + match last_available < left { + true => { + unsafe { dst.copy_from_nonoverlapping(src, last_available) }; + unsafe { last.set_len(last_len + last_available) }; + debug_assert_eq!(last.len(), last.capacity()); + + src = unsafe { src.add(last_available) }; + left -= last_available; + + self.add_fragment(); + } + false => { + unsafe { dst.copy_from_nonoverlapping(src, left) }; + unsafe { last.set_len(last_len + left) }; + } } } } From b645ff1b88bd2c1e3871d08ac83baedbbc36c6be Mon Sep 17 00:00:00 2001 From: orxfun Date: Sun, 12 Apr 2026 17:46:39 +0200 Subject: [PATCH 2/3] add missing break in extend_from_nonoverlapping --- src/pinned_vec.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/pinned_vec.rs b/src/pinned_vec.rs index f9a96f9..696a7a2 100644 --- a/src/pinned_vec.rs +++ b/src/pinned_vec.rs @@ -359,6 +359,7 @@ impl PinnedVec for SplitVec { false => { unsafe { dst.copy_from_nonoverlapping(src, left) }; unsafe { last.set_len(last_len + left) }; + break; } } } From 002ae18f51b17d51875657f37e9ab72a46130279 Mon Sep 17 00:00:00 2001 From: orxfun Date: Sun, 12 Apr 2026 17:54:38 +0200 Subject: [PATCH 3/3] increment version --- Cargo.toml | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 7d55505..7a066d3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "orx-split-vec" -version = "3.22.0" +version = "3.23.0" edition = "2024" authors = ["orxfun "] description = "An efficient dynamic capacity vector with pinned element guarantees." @@ -12,8 +12,7 @@ categories = ["data-structures", "rust-patterns", "no-std"] [dependencies] orx-iterable = { version = "1.3.0", default-features = false } orx-pseudo-default = { version = "2.1.0", default-features = false } -# orx-pinned-vec = { version = "3.21.0", default-features = false } -orx-pinned-vec = { path = "../orx-pinned-vec", default-features = false } +orx-pinned-vec = { version = "3.23.0", default-features = false } orx-concurrent-iter = { version = "3.3.0", default-features = false } [[bench]]