map_in_place

Crates.iomap_in_place
lib.rsmap_in_place
version0.1.0
sourcesrc
created_at2016-08-18 16:17:01.937413
updated_at2016-08-18 16:17:01.937413
descriptionReuse the memory of a Vec, Box<[T]> or Box when mapping the elements if possible.
homepage
repositoryhttps://github.com/tormol/map_in_place
max_upload_size
id6017
size23,869
Torbjørn Birch Moltu (tormol)

documentation

https://tormol.github.io/rustdoc/map_in_place/

README

map_in_place

Reuse alloations when mapping the elements of a Vec, Box<[T]> or Box<T> if possible.

To map in place the types must have identical alignment and:

  • for boxes and boxed slices the sizes must be equal,
  • for vectors the size of in must be a multiple of the out type. (so out cannot be bigger than in)

The ..._in_place() methods will panic if not possible, while the others will fall back to iterating and collecting.

Example

extern crate map_in_place;
use map_in_place::MapVecInPlace;
fn main() {
    let v = vec![8_u32,29,14,5];
    let v = v.filter_map(|n| if n < 10 {Some( (n as u8+b'0') as char)}
                             else      {None}
                        );// happens in place
    assert_eq!(&v, &['8','5']);
    let v = v.map(|c| c as u8);// falls back to iterators
    assert_eq!(&v[..], &b"85"[..]);
}

Why all those restrictions?

The rust allocation interface is a bit more complex than the standard C one of malloc(size_t) and free(void*):

First, malloc and free takes the alignment of the types you want to store, and allocating with one alignment and freeing with another is undefined behaviour.

Second, rust requires the owner to know the size of the memory to free, which means one of the types' size must be a multiple of the other, since the capacity is an integer.

License

Licensed under either of

at your option.

Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions.

Commit count: 11

cargo fmt