#slice #rc #arc #range #vector

no-std rc-slice2

易于分片的自引用计数切片

3个不稳定版本

0.4.1 2023年7月20日
0.4.0 2023年7月18日
0.3.1 2023年7月18日

#1745 in 数据结构

MIT/Apache

74KB
690

rc-slice2

rc-slice2库提供了RcSliceArcSlice类型,它们表示包含在RcArc中的数组类似数据结构的切片。支持原始数组、装箱切片、VecSmallVec(带有smallvec功能)。包括对调整原始数组大小的有限支持,以节省内存。

该库完全no_std,没有unsafe块。每个函数现在都通过示例和详尽的文档进行了全面测试。

rc_slice发生了什么变化?

rc-slice2rc_slice包的后继。由于供应链信任问题,所有权没有转移。此包的0.3.1版本与rc_slice 0.3.0完全向后兼容。版本0.4.0包含一个小的破坏性更改,因为泛型参数指定的方法已更改。但是,API的行为仍然向后兼容。

用法

rc-slice2 = "0.4"
extern crate alloc;
use rc_slice2::RcSlice;
use alloc::rc::Rc;
use RcSlice as Rcs;

let buffer: Rc<[u8]> = Rc::new([2, 4, 6, 8, 10]);

// Supports all kinds of slicing during construction
assert_eq!(*Rcs::new(&buffer, 1..4), [4, 6, 8]);
assert_eq!(*Rcs::new(&buffer, ..), [2, 4, 6, 8, 10]);
assert_eq!(*Rcs::new(&buffer, 0..=2), [2, 4, 6]);
assert_eq!(*Rcs::new(&buffer, 10..), []);

// Behaves like any other slice.
let mut slice = Rcs::new(&buffer, 1..);
assert_eq!(*slice, [4, 6, 8, 10]);
assert_eq!(slice[2..], [8, 10]);
assert_eq!(slice[1], 6);

// The slice can shrink, and returns cut-off elements.
assert_eq!(Rcs::advance(&mut slice, 2), Some([4, 6].as_slice()));
assert_eq!(*slice, [8, 10]);
assert_eq!(Rcs::retract(&mut slice, 1), Some([10].as_slice()));
assert_eq!(*slice, [8]);

// If the original buffer can change size, and there is only one
// strong reference, then the buffer can be shrunk to the slice.
let buffer = Rc::new(vec![12, 14, 16, 18, 20]);
let mut slice = Rcs::new(&buffer, 2..4);
assert_eq!(*slice, [16, 18]);

// Fails because `buffer` is still alive.
assert_eq!(Rcs::shrink(&mut slice), false);
let weak_buffer = Rc::downgrade(&buffer);
core::mem::drop(buffer);

// Success; only one strong reference. Original buffer has been shrunk.
assert_eq!(Rcs::shrink(&mut slice), true);
let buffer = Rcs::inner(&slice).clone();
assert_eq!(*buffer, [16, 18]);

// But weak references were not preserved.
assert_eq!(weak_buffer.upgrade(), None);

许可证

rc-slice2根据Apache许可证版本2.0(见LICENSE-APACHE)或MIT许可证(见LICENSE-MIT)发布,由您选择。

依赖关系