add Vec::extend_from_within method under vec_extend_from_within feature gate#79015
add Vec::extend_from_within method under vec_extend_from_within feature gate#79015bors merged 2 commits intorust-lang:masterfrom
Vec::extend_from_within method under vec_extend_from_within feature gate#79015Conversation
|
r? @KodrAus (rust_highfive has picked a reviewer for you, use r? to override) |
|
I agree with Simon that this function feels a bit ad-hoc. But if you want to add this functionality then I think append_copy_from_within is a better name. For such uncommonly used function a long but clear name is OK (by Zipf's law). |
|
To be clear, the implementation is written by @WanzenBug, not myself. I have authored the RFC in question, but not the implementation. The fact that the function feels niche is addressed in the RFC. TL;DR: this is a basic building block for many multimedia encoders/decoders, which they presently hand-roll using unsafe code and often get it wrong, leading to exploitable memory safety bugs. |
|
It should already be possible to specialize this using our If we don't want to try commit to specializing upfront then I'm ok with |
|
If this can be reliably specialized for The Performance is crucial for this function: if it leaves performance on the table people will go back to hand-rolling this using ad-hoc unsafe code and getting it wrong. |
Vec::append_from_within method under vec_append_from_within feature gateVec::extend_from_within method under vec_extend_from_within feature gate
|
@KodrAus I don't know the details of the I've also added a test which checks that the specialization was indeed used (so users may relay that it's cheap when |
|
@KodrAus waiting for your review on this |
|
☔ The latest upstream changes (presumably #80530) made this pull request unmergeable. Please resolve the merge conflicts. |
767a211 to
789dc50
Compare
|
The job Click to see the possible cause of the failure (guessed by this bot) |
|
@bors retry Looks spurious. cc @rust-lang/infra, I think I've seen this error a couple times now. |
|
Oh wait, that was mingw-check that failed, sorry. Would still be great to find the cause though. @bors r- |
789dc50 to
3c5f78c
Compare
|
The job Click to see the possible cause of the failure (guessed by this bot) |
|
I've tried to force-push to rerun CI, hoping that it's a phantom error, but since the error didn't change, I guess the error is stable. |
|
☔ The latest upstream changes (presumably #80758) made this pull request unmergeable. Please resolve the merge conflicts. |
3c5f78c to
3fcadb6
Compare
|
The job Click to see the possible cause of the failure (guessed by this bot) |
|
☔ The latest upstream changes (presumably #80746) made this pull request unmergeable. Please resolve the merge conflicts. |
d071e4d to
d5c2211
Compare
|
Thanks @WaffleLapkin! This looks good to me. @bors r+ |
|
📌 Commit d5c2211 has been approved by |
|
@bors r- Just noticed we need a tracking issue! I'll sort that now. |
|
@bors r+ |
|
📌 Commit 125ec78 has been approved by |
|
Yay. Thanks, @KodrAus, for reviewing! |
|
☀️ Test successful - checks-actions |
Make Vec::split_at_spare_mut public
This PR introduces a new method to the public API, under
`vec_split_at_spare` feature gate:
```rust
impl<T, A: Allocator> impl Vec<T, A> {
pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit<T>]);
}
```
The method returns 2 slices, one slice references the content of the vector,
and the other references the remaining spare capacity.
The method was previously implemented while adding `Vec::extend_from_within` in rust-lang#79015,
and used to implement `Vec::spare_capacity_mut` (as the later is just a
subset of former one).
See also previous [discussion in `Vec::spare_capacity_mut` tracking issue](rust-lang#75017 (comment)).
## Unresolved questions
- [ ] Should we consider changing the name? `split_at_spare_mut` doesn't seem like an intuitive name
- [ ] Should we deprecate `Vec::spare_capacity_mut`? Any usecase of `Vec::spare_capacity_mut` can be replaced with `Vec::split_at_spare_mut` (but not vise-versa)
r? `@KodrAus`
…lfJung Revert `Vec::spare_capacity_mut` impl to prevent pointers invalidation The implementation was changed in rust-lang#79015. Later it was [pointed out](rust-lang#81944 (comment)) that the implementation invalidates pointers to the buffer (initialized elements) by creating a unique reference to the buffer. This PR reverts the implementation. r? `@RalfJung`
…lfJung Revert `Vec::spare_capacity_mut` impl to prevent pointers invalidation The implementation was changed in rust-lang#79015. Later it was [pointed out](rust-lang#81944 (comment)) that the implementation invalidates pointers to the buffer (initialized elements) by creating a unique reference to the buffer. This PR reverts the implementation. r? ``@RalfJung``
…lfJung Revert `Vec::spare_capacity_mut` impl to prevent pointers invalidation The implementation was changed in rust-lang#79015. Later it was [pointed out](rust-lang#81944 (comment)) that the implementation invalidates pointers to the buffer (initialized elements) by creating a unique reference to the buffer. This PR reverts the implementation. r? ```@RalfJung```
Implement rust-lang/rfcs#2714
tl;dr
This PR adds a
extend_from_withinmethod toVecwhich allows copying elements from a range to the end:Implementation notes
Originally I've copied @Shnatsel's implementation with some minor changes to support other ranges:
But then I've realized that this duplicates most of the code from (private)
Vec::append_elements, so I've used it instead.Then I've applied @KodrAus suggestions from #79015 (comment).