#vec #type-erasure #erased #vec-t

nightly type_erased_vec

类型擦除Vec

5个版本

0.2.0 2021年12月21日
0.1.4 2021年12月17日

558内存管理

每月37次下载

MIT 许可证

14KB
219

type_erased_vec

此crate提供了一个名为TypeErasedVec的单个结构体,正如其名称所示,它是一个类型擦除的Vec

当你知道它的类型时,可以使用TypeErasedVec::getTypeErasedVec::get_mut获取切片或Vec

动机

当与Rust外部世界(例如GPU)通信时,它通常需要一个原始缓冲区和某种类型的描述符。

在Rust中有两种方法来表示这一点:

  • Vec<u8> + 类型描述符。
  • Vec<T>.

第一个选项不吸引人,因为Vec<u8>不能安全地用作Vec<T>,因此我们失去了修改缓冲区的能力。

第二个选项使所有包含该缓冲区的类型都泛型于T,当T必须在运行时确定时,这是不可行的。例如,可以从磁盘上的3D模型文件中加载缓冲区,该文件包含传递给3D渲染器的类型信息。

示例

use type_erased_vec::TypeErasedVec;

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

let mut vec_mut = unsafe { vec.get_mut() };
for i in 0..10 {
    vec_mut.push(i);
}

assert_eq!(*vec_mut, (0..10).collect::<Vec<_>>());

无运行时依赖