deferred_map/
handle.rs

1/// Handle is a one-time token for inserting values into DeferredMap
2///
3/// Handle does not implement the Clone trait, ensuring it can only be used once
4/// through Rust's move semantics.
5///
6/// Handle 是一次性令牌,用于向 DeferredMap 插入值
7///
8/// Handle 不实现 Clone trait,通过 Rust 的 move semantics 确保只能使用一次
9///
10/// # Examples (示例)
11///
12/// ```
13/// use deferred_map::DeferredMap;
14///
15/// let mut map = DeferredMap::new();
16/// let handle = map.allocate_handle();
17/// let key = handle.key();
18/// map.insert(handle, 42);
19/// assert_eq!(map.get(key), Some(&42));
20/// ```
21#[derive(Debug, PartialEq, Eq)]
22#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
23pub struct Handle {
24    key: u64, // The key of the handle
25    #[cfg(debug_assertions)]
26    pub(crate) map_id: u64,
27}
28
29impl Handle {
30    /// Create a new Handle (internal use)
31    ///
32    /// 创建一个新的 Handle(内部使用)
33    #[inline(always)]
34    pub(crate) fn new(key: u64, #[cfg(debug_assertions)] map_id: u64) -> Self {
35        Self {
36            key,
37            #[cfg(debug_assertions)]
38            map_id,
39        }
40    }
41
42    /// Get the key that will be used for this handle
43    ///
44    /// This is the same as raw_value(), but with a more semantic name.
45    ///
46    /// 获取此 handle 对应的 key
47    ///
48    /// 这与 raw_value() 相同,但名称更具语义性
49    #[inline(always)]
50    pub fn key(&self) -> u64 {
51        self.key
52    }
53
54    /// Extract index (lower 32 bits)
55    ///
56    /// 提取 index(低 32 位)
57    #[inline(always)]
58    pub fn index(&self) -> u32 {
59        self.key as u32
60    }
61    /// Extract generation (upper 32 bits)
62    ///
63    /// 提取 generation(高 32 位)
64    #[inline(always)]
65    pub fn generation(&self) -> u32 {
66        (self.key >> 32) as u32
67    }
68}