2个版本
0.1.1 | 2023年8月23日 |
---|---|
0.1.0 | 2023年8月23日 |
#1831 在 算法
33KB
575 行
匿名向量
AnonVec为Rust中动态类型模拟提供匿名类型和匿名类型化向量。
anon_vec本质上是Box的一个易于使用的替代品,没有Box带来的安全检查。它是为strata-ecs创建的,旨在使用AnonVec存储组件。
内存安全
Anon、AnonVec和AnonVec迭代器的使用本身是不安全的,应谨慎使用。尝试错误地访问这些类型可能会导致数据泄漏、值不正确和无效的内存访问,从而引发灾难性错误。
尽管未来可能实现,但anon_vec目前没有实现任何错误检查。您应该谨慎管理这些类型的不安全性。
使用方法
如果您需要动态类型并且可以接受一些不安全的代码,请使用此包。
anon_vec支持匿名单类型,称为Anon
。这些类型在您的引擎中移动数据时非常有用,内部值只能在已知类型(T
)的作用域内访问。
use anon_vec::Anon;
use std::mem::size_of;
use std::any::TypeId;
// you can create anons from existing values...
let x: i32 = 5;
let mut anon1 = Anon::new::<i32>(x);
// the value within can then be accessed.
let y: &i32 = anon1.cast_ref::<i32>();
let z: &i32 = anon1.cast_ref::<i32>();
// Anons can also be uninitialized.
let mut anon2 = Anon::uninit();
if anon2.is_uninit() {
anon2.init::<i32>(5);
} else {
// do something to the value
}
anon_vec支持匿名向量,称为AnonVec
。当您想存储Vec,但在编译时不知道T时,此类型非常有用。AnonVec将T转换为u8,允许以最小的堆分配顺序存储T。AnonVec可以通过T或将其转换为Anon来访问。
use anon_vec::AnonVec;
use anon_vec::Anon;
use std::mem::size_of;
use std::any::TypeId;
// You can create AnonVecs from a T...
let mut anon1 = AnonVec::new::<i32>();
// ...or from a size.
let mut anon2 = AnonVec::from_size(size_of::<i32>(), TypeId::of::<i32>());
// values can be pushed to the vec.
anon1.push::<i32>(5);
anon1.push::<i32>(5);
// and removed.
anon1.remove(1);
// AnonVecs can also be uninitialized
let mut anon3 = Anon::uninit();
if anon3.is_uninit() {
anon3.init::<i32>(5);
} else {
// do something to the value.
}
anon_vec支持对AnonVec
的带类型迭代器,并可以链接迭代器。这对于ECS尤其有用,并且包含链接迭代器的原因。
可以使用AnonVec::iter::()创建AnonIter
。它接收AnonIter
内部值的指针,并且不检查生命周期。如果迭代器超过了其父AnonVec的生命周期,迭代它将访问无效数据。
AnonIterMut
与AnonIter相同,可以使用AnonVec::iter_mut::()创建。
AnonChain
和AnonChainMut
使用push方法构建可以作为一个整体迭代的迭代器链。