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}