unsized-vec

Crates.iounsized-vec
lib.rsunsized-vec
version0.0.2-alpha.11
sourcesrc
created_at2022-10-08 21:49:23.654468
updated_at2024-06-10 14:45:09.151768
descriptionLike Vec, but for unsized values
homepage
repositoryhttps://github.com/Jules-Bertholet/unsized-vec/
max_upload_size
id683731
size191,891
Jules Bertholet (Jules-Bertholet)

documentation

README

unsized-vec

docs.rs Crates.io

Say goodbye to Vec<Box<dyn Any>>! Cut down on your heap allocations. UnsizedVec<T> is like Vec<T>, but T can be ?Sized.

Features

  • Familiar Vec API.
  • Same time complexity as alloc::vec::Vec for major operations(indexing, push, pop, insert, remove).
    • When T's alignment is not known at compile time (e.g. T is a trait object), this rule has one expection, explained in the crate docs.
  • For T: Sized, UnsizedVec<T> compiles to a newtype around alloc::vec::Vec, and can be trivially converted to/from it.
  • For unsized T, there are two heap allocations: one for the elements, and one for the pointer metadata.
  • #[no_std] (but requires alloc).

Drawbacks

  • Invariant in T.
  • Experimental, nightly-only.

Example

#![feature(unsized_fn_params)]

use core::fmt::Debug;

use emplacable::box_new_with;
use unsized_vec::{unsize_vec, UnsizedVec};

fn main() {
    let mut vec: UnsizedVec<dyn Debug> = unsize_vec![27.53_f32, "oh the places we'll go", Some(())];

    for traitobj in &vec {
        dbg!(traitobj);
    };

    assert_eq!(vec.len(), 3);

    let maybe_popped: Option<Box<dyn Debug>> = vec.pop_into().map(box_new_with);
    let popped = maybe_popped.unwrap();
    dbg!(&*popped);

    assert_eq!(vec.len(), 2);
}

License

unsized-vec is distributed under the terms of both the MIT license and the Apache License (Version 2.0).

See LICENSE-APACHE and LICENSE-MIT for details.

Commit count: 56

cargo fmt