Expand description
§MTB Entity Allocator and Utilities
Address-stable, internally mutable entity Slab allocator. Mainly solves the problem
where Slab cannot allocate new elements while reading existing ones.
地址稳定、内部可变的实体 Slab 分块分配器. 主要解决 Slab 无法在读取元素的同时
分配新元素的问题.
§Example 使用示例
use mtb_entity_slab::{EntityAlloc, PtrID, IEntityAllocID, IEntityAllocatable, EntityAllocPolicy256};
#[derive(Debug, Clone, PartialEq, Eq)]
struct Inst {
pub opcode: u32,
pub operands: [u64; 4],
pub heap_data: String,
}
impl IEntityAllocatable for Inst {
/// Allocation policy type. You can switch types from 128 to 4096 bytes.
/// 分配策略类型. 可在 128 到 4096 字节间切换.
type AllocatePolicyT = EntityAllocPolicy256<Self>;
/// Pointer ID type. You can define your own PtrID type if needed.
/// 指针 ID 类型. 如有需要, 可自定义 PtrID 类型.
type PtrID = PtrID<Self>;
}
impl Inst {
fn new(opcode: u32) -> Self {
Self {
opcode,
operands: [0; 4],
heap_data: format!("InstData{}", opcode),
}
}
}
fn main() {
let mut alloc = EntityAlloc::with_capacity(1024);
let ptrs = {
let mut v = Vec::new();
for i in 0..1000 {
let ptr = alloc.allocate(Inst::new(i));
v.push(ptr);
}
v
};
let inst = ptrs[500].deref(&alloc);
// Allocates a new element while reading existing ones
// 在读取时分配新元素
let new_id = alloc.allocate(Inst::new(2000));
assert_eq!(inst.opcode, 500);
assert_eq!(new_id.deref(&alloc).opcode, 2000);
for &ptr in ptrs.iter() {
let inst = ptr.deref(&alloc);
let indexed_id = ptr.as_indexed(&alloc).unwrap();
assert_eq!(inst.opcode as usize, indexed_id.0);
assert!(ptr.free(&mut alloc).is_some());
}
}§Safety 安全性
This crate provides access to allocated elements via PtrID. PtrID contains a raw pointer,
and most operations on PtrID are safe, but there is no ABA usage detection.
This crate is designed for Remusys-IR and is for learning purposes only. It does not guarantee safety in all scenarios. Please carefully assess the risks when using it in production environments.
本库通过 PtrID 提供对分配元素的访问. PtrID 内部包含裸指针, 对 PtrID 的大多数操作都是安全的,
但没有 ABA 使用检测.
本库为 Remusys-IR 设计, 仅为学习用途, 不保证在所有场景下的安全性. 在生产环境中使用时请谨慎评估风险.
Structs§
- Entity
Alloc - Entity
Alloc Consume Iter - Entity
Alloc Edit Iter - Entity
Alloc Policy128 - Entity
Alloc Policy256 - Entity
Alloc Policy512 - Entity
Alloc Policy1024 - Entity
Alloc Policy2048 - Entity
Alloc Policy4096 - Entity
Alloc Read Iter - Entity
List - Entity
List Head - Entity
List Range - A partial-close range of an entity pointer list representing
[start, end). - Entity
List Read Iter - Entity
Ring List - A doubly-linked ring list of entity pointers.
- Entity
Ring List Read Iter - IDProxy
- Maybe unsafe!
- IndexedID
- PtrID
Enums§
Constants§
Traits§
- IEntity
AllocID - IEntity
Alloc Policy - IEntity
Allocatable - IEntity
List Node - IEntity
Ring List Node - An entity pointer list node that supports ring lists.