#vec #unsized #heap-allocation #vector

nightly no-std bin+lib unsized-vec

类似于 Vec,但用于无尺寸值

3 个版本

0.0.2-alpha.112024 年 6 月 10 日
0.0.2-alpha.102023 年 12 月 20 日
0.0.2-alpha.92023 年 11 月 24 日
0.0.2-alpha.7 2023 年 6 月 30 日
0.0.2-alpha.4 2022 年 10 月 30 日

数据结构 中排名第 331

Download history 82/week @ 2024-04-15 119/week @ 2024-06-10

每月下载量 1,215

MIT/Apache

235KB
4K SLoC

unsized-vec

docs.rs Crates.io

告别 Vec<Box<dyn Any>>!减少堆分配。 UnsizedVec<T> 类似于 Vec<T>,但 T 可以是 ?Sized

特性

  • 熟悉的 Vec API。
  • 主要操作(索引、推送、弹出、插入、删除)与 alloc::vec::Vec 相同的时间复杂度。
    • T 的对齐方式在编译时未知(例如,T 是一个 trait 对象)时,此规则有一个例外,请在 crate 文档中查阅。
  • 对于 T: SizedUnsizedVec<T> 编译为一个围绕 alloc::vec::Vec 的新类型,并且可以轻松地转换为它。
  • 对于无尺寸的 T,有两个堆分配:一个用于元素,一个用于指针元数据。
  • #[no_std](但需要 alloc)。

缺点

  • T 的不可变。
  • 实验性的,仅在 nightly 中可用。

示例

#![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);
}

许可证

unsized-vec 根据 MIT 许可证和 Apache 许可证(版本 2.0)的条款分发。

请参阅LICENSE-APACHELICENSE-MIT获取详细信息。

依赖项

~170KB