2 releases

0.1.1 Nov 27, 2021
0.1.0 Nov 25, 2021

#1790 in Data structures

Download history 2978/week @ 2023-11-23 3393/week @ 2023-11-30 3914/week @ 2023-12-07 4393/week @ 2023-12-14 2179/week @ 2023-12-21 2430/week @ 2023-12-28 3128/week @ 2024-01-04 4457/week @ 2024-01-11 6512/week @ 2024-01-18 6310/week @ 2024-01-25 11764/week @ 2024-02-01 17032/week @ 2024-02-08 9378/week @ 2024-02-15 8923/week @ 2024-02-22 12370/week @ 2024-02-29 7471/week @ 2024-03-07

40,282 downloads per month
Used in 36 crates (3 directly)

MIT/Apache

21KB
450 lines

Inplace-Vec-Builder

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);

Features

  • stdvec (default): std Vec support
  • smallvec: SmallVec support

Dependencies

~19KB