moa_idalloc 0.1.4

id 分配工具箱:单调号 / 回收位图 / 世代槽位表
Documentation
//! 单调递增 id 生成器(Fuchsia KOID 式)。

use core::sync::atomic::{AtomicU64, Ordering};

/// 全局单调递增 id 生成器。
///
/// 每次 [`alloc`](IdGen::alloc) 返回一个**永不复用**的 64 位 id:从 1 开始递增
/// (0 保留作无效/空哨兵),无锁,从机制上免疫 ABA/复用问题。64 位空间即便以
/// 10 亿/秒的速率分配也要数百年才回绕,实际不可能耗尽。适合做全局对象身份(koid)。
///
/// 是 `Sync` 的,可直接作为 `static` 使用。
pub struct IdGen {
    next: AtomicU64,
}

impl IdGen {
    /// 创建生成器,首个分配出的 id 为 `1`。
    pub const fn new() -> Self {
        Self { next: AtomicU64::new(1) }
    }

    /// 分配一个新的、永不复用的 id(`>= 1`)。
    #[inline(always)]
    pub fn alloc(&self) -> u64 {
        // 号的唯一性只需原子自增,不依赖任何内存序。
        self.next.fetch_add(1, Ordering::Relaxed)
    }
}

impl Default for IdGen {
    fn default() -> Self {
        Self::new()
    }
}