Crate mtb_entity_slab

Crate mtb_entity_slab 

Source
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§

EntityAlloc
EntityAllocConsumeIter
EntityAllocEditIter
EntityAllocPolicy128
EntityAllocPolicy256
EntityAllocPolicy512
EntityAllocPolicy1024
EntityAllocPolicy2048
EntityAllocPolicy4096
EntityAllocReadIter
EntityList
EntityListHead
EntityListRange
A partial-close range of an entity pointer list representing [start, end).
EntityListReadIter
EntityRingList
A doubly-linked ring list of entity pointers.
EntityRingListReadIter
IDProxy
Maybe unsafe!
IndexedID
PtrID

Enums§

EntityListError

Constants§

MTBLIB_PACKAGE_NAME
MTBLIB_PACKAGE_VERSION
NULL_INDEXED_ID

Traits§

IEntityAllocID
IEntityAllocPolicy
IEntityAllocatable
IEntityListNode
IEntityRingListNode
An entity pointer list node that supports ring lists.

Type Aliases§

PtrListRes