#匿名 #anon #动态 #类型 #向量 #类型化 #vec

anon-vec

模仿动态类型的匿名向量

2个版本

0.1.1 2023年8月23日
0.1.0 2023年8月23日

#1831算法

MIT许可证

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::()创建。

AnonChainAnonChainMut使用push方法构建可以作为一个整体迭代的迭代器链。

无运行时依赖