#generational #ecs #vector

gen-vec

使用世代索引索引的向量

2个不稳定版本

0.3.0 2020年7月29日
0.2.0 2020年7月15日

#408 in 内存管理

42 每月下载量

MIT 许可证

52KB
954

gen-vec 构建状态

拥有其值的可重复使用的、世代索引的向量

灵感来源于2018年RustConf上Catherine West的闭幕演讲

封闭与暴露的索引分配实现

ClosedGenVec 使用非用户可访问的索引分配器来管理索引

ExposedGenVec 依赖于外部的 IndexAllocator

因此,必须创建并使用 IndexAllocator 来手动分配/释放索引。这对于在多个 ExposedGenerationalVec 实例之间使用相同的 Index 非常有用

注意: IndexAllocator 不能与 ClosedGenerationalVec 一起使用,因为它有自己的内部 IndexAllocator

世代索引说明

Index 结构体用于访问向量的内容。一个 Index 包含向量的索引和一个世代(最初为0)。

已释放/删除的 Index 进入一个可以重用的空闲 Index 列表

每次重用 Index 时,内部世代都会增加。这确保了已释放的 Index 处理程序无法访问它不再有效指向的数据

用法

gen-vec 添加到您的 Cargo.toml

[dependencies]
gen-vec = "0.2.0"

使用自分配的 ClosedGenVec

use gen_vec::Index;
use gen_vec::closed::ClosedGenVec;

let mut vec: ClosedGenVec<i32> = ClosedGenVec::new();

let index: Index = vec.insert(42);
assert!(vec.contains(index));

let value: Option<&i32> = vec.get(index);
assert_eq!(value, Some(&42));

vec.remove(index);
assert!(!vec.contains(index));

使用 ExposedGenVecIndexAllocator

use gen_vec::Index;
use gen_vec::exposed::{IndexAllocator, ExposedGenVec};

let mut allocator: IndexAllocator = IndexAllocator::new();

let index: Index = allocator.allocate();

let mut vec: ExposedGenVec<i32> = ExposedGenVec::new();
vec.set(index, 5);
assert!(vec.contains(index));

let value: Option<&i32> = vec.get(index);
assert_eq!(value, Some(&5));

依赖

~175KB