1 个不稳定版本

0.1.0 2024年5月5日

#1475 in 数据结构

0BSD 许可证

63KB
1K SLoC

non_empty_continuous

用于非空连续集合的Crate。

由于连续性,这种方式使得类型与其常规对应类型之间的转换成为一种零成本的运算。所有类型都利用了 #[repr(transparent)]

这个Crate试图尽可能多地重新实现非空对应的功能。在许多情况下,它们可以作为直接替换。

示例

let first_element = 10;
let mut non_empty_vec: NonEmptyVec<i32> = NonEmptyVec::new(first_element);
non_empty_vec.reserve(2);
non_empty_vec.push(20);
non_empty_vec.push(30);
_ = non_empty_vec.try_pop();

let non_empty_slice: &NonEmptySlice<i32> = &non_empty_vec[..=1];
let non_empty_slice_mut: &mut NonEmptySlice<i32> = &mut non_empty_vec[..];

let length: std::num::NonZeroUsize = non_empty_slice.len();

let non_empty_vec_from_macro = ne_vec![99, 98, 97];

功能

smallvec

公开了 NonEmptySmallVec,这是 small_vec 包中的 SmallVec 的非空包装。

let first_element = 10;
let mut non_empty_small_vec: NonEmptySmallVec<[usize; 5]> = NonEmptySmallVec::new(first_element);
non_empty_small_vec.reserve(2);
non_empty_small_vec.push(20);
non_empty_small_vec.push(30);

let _: bool = non_empty_small_vec.spilled();

let non_empty_slice: &NonEmptySlice<i32> = &non_empty_small_vec[..=1];
let non_empty_slice_mut: &mut NonEmptySlice<i32> = &mut non_empty_small_vec[..];

let non_empty_smallvec_from_macro = ne_smallvec![99, 98, 97];

static_assert_generic

允许进行在编译时检查长度不为0的数组的不可失败操作。

let arr = [1, 2, 3];
let mut non_empty_vec: NonEmptyVec<i32> = NonEmptyVec::from_arr(arr);


空数组会产生错误。

let arr2 = [];
let mut non_empty_vec: NonEmptyVec<i32> = NonEmptyVec::from_arr(arr); // !!!


Smallvec static_assert_generic 功能还需要 smallvecconst_generics 功能。

let arr3 = [4, 5, 6];
let mut non_empty_small_vec: NonEmptySmallVec<i32> = NonEmptySmallVec::from_arr(arr3);

许可证:0BSD

依赖

~125KB