mtb-entity-slab 0.2.4

Slab-style entity storage: stable IDs, internal mutability; not a full ECS.
Documentation
//! # 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::*;
//!
//! #[derive(Debug, Clone, PartialEq, Eq)]
//! struct Inst {
//!     pub opcode: u32,
//!     pub operands: [u64; 4],
//!     pub heap_data: String,
//! }
//!
//! impl Inst {
//!     fn new(opcode: u32) -> Self {
//!         Self {
//!             opcode,
//!             operands: [0; 4],
//!             heap_data: format!("InstData{}", opcode),
//!         }
//!     }
//! }
//!
//! let alloc: EntityAlloc<Inst, AllocPolicy256> = EntityAlloc::with_capacity(1024);
//! let ptrs = {
//!     let mut v = Vec::new();
//!     for i in 0..1000 {
//!         let ptr = IndexedID::allocate_from(&alloc, Inst::new(i));
//!         v.push(ptr);
//!     }
//!     v
//! };
//!
//! let inst = ptrs[500].deref(&alloc);
//!
//! // Allocates a new element while reading existing ones
//! // 在读取时分配新元素
//! let new_id = IndexedID::allocate_from(&alloc, 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.to_index(&alloc).unwrap();
//!     assert_eq!(inst.opcode as usize, indexed_id.get_order());
//! }
//! ```
//!
//! ## 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 设计, 仅为学习用途, 不保证在所有场景下的安全性. 在生产环境中使用时请谨慎评估风险.
#![warn(missing_docs)]

mod alloc;
mod bitalloc;
mod chunk;
mod container;
mod gen_index;
mod id;
mod iter;
mod policy;

pub use crate::{
    alloc::{EntityAccessErr, EntityAccessRes, EntityAlloc},
    container::{entity_list::*, list_base::*, order_cached_list::*, ring_list::*},
    gen_index::GenIndex,
    id::{IDBoundAlloc, IEntityAllocID, IPoliciedID, IndexedID, PtrID},
    iter::{EntityAllocConsumeIter, EntityAllocEditIter, EntityAllocReadIter},
    policy::{
        AllocPolicy128, AllocPolicy256, AllocPolicy512, AllocPolicy1024, AllocPolicy2048,
        AllocPolicy4096, IAllocPolicy, SlicePtrErr, SlicePtrRes,
    },
};
pub use mtb_entity_slab_macros::entity_id;

/// > Required by MTBLib package tools. Do not modify.
///
/// MTBLib package name.
pub const MTBLIB_PACKAGE_NAME: &str = "io.medihbt.mtb.entity";
/// > Required by MTBLib package tools. Do not modify.
///
/// MTBLib package version.
pub const MTBLIB_PACKAGE_VERSION: &str = env!("CARGO_PKG_VERSION");

mod tests;