Crates.io | inplace-vec-builder |
lib.rs | inplace-vec-builder |
version | 0.1.1 |
source | src |
created_at | 2021-11-25 08:08:50.570709 |
updated_at | 2021-11-27 09:11:36.291364 |
description | Build a vec from a vec, in place |
homepage | |
repository | https://github.com/rklaehn/inplace-vec-builder |
max_upload_size | |
id | 487463 |
size | 22,324 |
A small library to build a Vec or SmallVec out of itself without allocating.
This is useful when writing in place operations that do not allocate.
Imagine you have a vec that contains some numbers. You now want to apply some transformation on these elements, like mapping, filtering, adding some elements, and then store the result in the same place.
The simplest way to do this would be something like this:
let mut res = self
.elements
.iter()
.filter(|x| **x > 5)
.map(|x| *x * 2)
.chain(std::iter::once(123))
.collect();
std::mem::swap(&mut self.elements, &mut res);
But this does allocate a new vector. Usually not a big deal, but if this is some very frequently used code, you want to avoid it.
Note that in many cases where you do filtering combined with a transformation, retain can be used. If that is the case using retain is of course preferable.
This crate provides a helper that allows doing something like the above without allocations. It is fairly low level, since it is intended to be used from other libraries.
let mut t = InPlaceVecBuilder::from(&mut self.elements);
while let Some(elem) = t.pop_front() {
if elem > 5 {
t.push(elem * 2);
}
}
t.push(123);