1 个不稳定版本
0.1.0 | 2024年5月5日 |
---|
#1475 in 数据结构
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
功能还需要 smallvec
的 const_generics
功能。
let arr3 = [4, 5, 6];
let mut non_empty_small_vec: NonEmptySmallVec<i32> = NonEmptySmallVec::from_arr(arr3);
许可证:0BSD
依赖
~125KB