deferred_map/
map.rs

1use crate::handle::Handle;
2use crate::slot::SlotContent::Occupied;
3use crate::slot::SlotContentMut::OccupiedMut;
4use crate::slot::{Slot, SlotUnion};
5use crate::utils::{decode_key, encode_key, likely, unlikely};
6use std::mem::ManuallyDrop;
7
8/// DeferredMap is a high-performance map based on slotmap
9///
10/// Usage requires first obtaining a Handle via `allocate_handle`,
11/// then using the Handle to insert.
12///
13/// DeferredMap 是一个基于 slotmap 的高性能映射表
14///
15/// 使用前需要先通过 `allocate_handle` 获取 Handle,然后使用 Handle 进行插入
16///
17/// # Features (特性)
18///
19/// - O(1) insertion, lookup, and removal | O(1) 插入、查找和删除
20/// - Generational indices prevent use-after-free | 代数索引防止释放后使用
21/// - Handle-based deferred insertion | 基于 Handle 的延迟插入
22/// - Memory efficient with union-based slots | 使用 union 的内存高效 slot
23///
24/// # Examples (示例)
25///
26/// ```
27/// use deferred_map::DeferredMap;
28///
29/// let mut map = DeferredMap::new();
30///
31/// // Allocate handle first | 先分配 handle
32/// let handle = map.allocate_handle();
33/// let key = handle.key();
34///
35/// // Insert value later | 之后插入值
36/// map.insert(handle, 42);
37///
38/// // Access value | 访问值
39/// assert_eq!(map.get(key), Some(&42));
40///
41/// // Remove value | 删除值
42/// assert_eq!(map.remove(key), Some(42));
43/// ```
44#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
45pub struct DeferredMap<T> {
46    slots: Vec<Slot<T>>,
47    free_head: u32, // Head of free list | 空闲列表的头部索引
48    num_elems: u32, // Current element count | 当前元素数量
49}
50
51impl<T> DeferredMap<T> {
52    /// Create a new empty DeferredMap
53    ///
54    /// 创建一个新的空 DeferredMap
55    ///
56    /// # Examples (示例)
57    ///
58    /// ```
59    /// use deferred_map::DeferredMap;
60    ///
61    /// let map: DeferredMap<i32> = DeferredMap::new();
62    /// assert!(map.is_empty());
63    /// ```
64    #[inline(always)]
65    pub fn new() -> Self {
66        Self::with_capacity(0)
67    }
68
69    /// Create a DeferredMap with specified capacity
70    ///
71    /// 创建一个指定容量的 DeferredMap
72    ///
73    /// # Parameters
74    /// - `capacity`: Initial capacity (number of slots to pre-allocate)
75    ///
76    /// # 参数
77    /// - `capacity`: 初始容量(预分配的 slot 数量)
78    ///
79    /// # Examples (示例)
80    ///
81    /// ```
82    /// use deferred_map::DeferredMap;
83    ///
84    /// let map: DeferredMap<i32> = DeferredMap::with_capacity(100);
85    /// assert_eq!(map.capacity(), 0);
86    /// ```
87    #[inline]
88    pub fn with_capacity(capacity: usize) -> Self {
89        // Create slots with sentinel at index 0
90        // Sentinel is not used but maintains index consistency
91        // 创建 slots,在索引 0 处添加 sentinel
92        // sentinel 不实际使用,但保持索引一致性
93        let mut slots = Vec::with_capacity(capacity + 1);
94        slots.push(Slot {
95            u: SlotUnion { next_free: 0 },
96            version: 0,
97        });
98
99        Self {
100            slots,
101            free_head: 1, // Start allocation from index 1 | 从索引 1 开始分配
102            num_elems: 0,
103        }
104    }
105
106    /// Pre-allocate a Handle
107    ///
108    /// This Handle can be used later to insert a value.
109    /// The slot is immediately created in Reserved state.
110    ///
111    /// 预分配一个 Handle
112    ///
113    /// 这个 Handle 可以在之后用于插入值
114    /// slot 立即创建为 Reserved 状态
115    ///
116    /// # Returns
117    /// A unique Handle for later insertion
118    ///
119    /// # 返回值
120    /// 用于后续插入的唯一 Handle
121    ///
122    /// # Examples (示例)
123    ///
124    /// ```
125    /// use deferred_map::DeferredMap;
126    ///
127    /// let mut map = DeferredMap::new();
128    /// let handle = map.allocate_handle();
129    /// let key = handle.key();
130    /// map.insert(handle, "value");
131    /// assert_eq!(map.get(key), Some(&"value"));
132    /// ```
133    pub fn allocate_handle(&mut self) -> Handle {
134        if let Some(slot) = self.slots.get_mut(self.free_head as usize) {
135            // Reuse existing vacant slot from free list
136            // 从空闲列表中复用已有的空闲 slot
137            let index = self.free_head;
138
139            // Update free_head to next free slot before changing state
140            // 在改变状态前更新 free_head 到下一个空闲 slot
141            unsafe {
142                self.free_head = slot.u.next_free;
143            }
144
145            // Transition: vacant(0bXX00) -> reserved(0bXX01)
146            // 状态转换:vacant(0bXX00) -> reserved(0bXX01)
147            slot.version += 1;
148
149            let raw = encode_key(index, slot.generation());
150            Handle::new(raw)
151        } else {
152            // Need to extend Vec, allocate new slot
153            // 需要扩展 Vec,分配新 slot
154            let index = self.slots.len() as u32;
155            let version = 0b01; // New slot starts in reserved state | 新 slot 从 reserved 状态开始
156
157            // Create reserved slot
158            // 创建 reserved slot
159            self.slots.push(Slot {
160                u: SlotUnion { next_free: 0 }, // Value doesn't matter for reserved | 对于 reserved 状态该值不重要
161                version,
162            });
163
164            // Update free_head
165            // 更新 free_head
166            self.free_head = index + 1;
167
168            // Extract generation from version (reserved state: 0b01)
169            // 从 version 提取 generation(reserved 状态:0b01)
170            let raw = encode_key(index, version >> 2);
171            Handle::new(raw)
172        }
173    }
174
175    /// Insert value using Handle
176    ///
177    /// The Handle is consumed (moved), ensuring it can only be used once.
178    /// The slot must be in Reserved state.
179    ///
180    /// 使用 Handle 插入值
181    ///
182    /// Handle 会被消耗(move),确保只能使用一次
183    /// slot 必须处于 Reserved 状态
184    ///
185    /// # Parameters
186    /// - `handle`: The Handle obtained from `allocate_handle`
187    /// - `value`: The value to insert
188    ///
189    /// # 参数
190    /// - `handle`: 从 `allocate_handle` 获取的 Handle
191    /// - `value`: 要插入的值
192    ///
193    /// # Examples (示例)
194    ///
195    /// ```
196    /// use deferred_map::DeferredMap;
197    ///
198    /// let mut map = DeferredMap::new();
199    /// let handle = map.allocate_handle();
200    /// let key = handle.key();
201    /// map.insert(handle, 42);
202    /// assert_eq!(map.get(key), Some(&42));
203    /// ```
204    pub fn insert(&mut self, handle: Handle, value: T) {
205        let index = handle.index();
206
207        // Validate index (skip sentinel)
208        // 验证 index 有效(跳过 sentinel)
209        debug_assert!(index != 0, "Invalid handle: sentinel index");
210
211        // Slot must exist (allocate_handle should have created it)
212        // slot 必须存在(allocate_handle 应该已经创建了它)
213        debug_assert!(
214            (index as usize) < self.slots.len(),
215            "Invalid handle: index out of bounds"
216        );
217
218        let slot = unsafe { self.slots.get_unchecked_mut(index as usize) };
219
220        // Validate generation match (handle stores generation, not version)
221        // 验证 generation 匹配(handle 存储 generation,不是 version)
222        debug_assert!(
223            slot.generation() == handle.generation(),
224            "Generation mismatch"
225        );
226
227        // Validate slot is in Reserved state
228        // 验证 slot 处于 Reserved 状态
229        debug_assert!(slot.is_reserved(), "Handle already used or invalid state");
230
231        // Insert value and transition: reserved(0bXX01) -> occupied(0bXX11)
232        // 插入值并状态转换:reserved(0bXX01) -> occupied(0bXX11)
233        slot.u.value = ManuallyDrop::new(value);
234        slot.version += 2; // 0bXX01 -> 0bXX11
235
236        self.num_elems += 1;
237    }
238
239    /// Get immutable reference to value by u64 key
240    ///
241    /// 通过 u64 key 获取值的不可变引用
242    ///
243    /// # Parameters
244    /// - `key`: The key returned from `insert`
245    ///
246    /// # Returns
247    /// - `Some(&T)`: Reference to the value if key is valid
248    /// - `None`: If key is invalid or value has been removed
249    ///
250    /// # 参数
251    /// - `key`: 从 `insert` 返回的 key
252    ///
253    /// # 返回值
254    /// - `Some(&T)`: 如果 key 有效则返回值的引用
255    /// - `None`: 如果 key 无效或值已被删除
256    ///
257    /// # Examples (示例)
258    ///
259    /// ```
260    /// use deferred_map::DeferredMap;
261    ///
262    /// let mut map = DeferredMap::new();
263    /// let handle = map.allocate_handle();
264    /// let key = handle.key();
265    /// map.insert(handle, 42);
266    /// assert_eq!(map.get(key), Some(&42));
267    /// ```
268    #[inline]
269    pub fn get(&self, key: u64) -> Option<&T> {
270        let (index, generation) = decode_key(key);
271
272        // Bounds check
273        // 边界检查
274        if unlikely(index as usize >= self.slots.len()) {
275            return None;
276        }
277
278        // SAFETY: We've checked that index < slots.len()
279        let slot = unsafe { self.slots.get_unchecked(index as usize) };
280
281        // Fast path: check generation match and return value
282        // 快速路径:检查 generation 匹配并返回值
283        if likely(slot.generation() == generation && slot.is_occupied()) {
284            // SAFETY: We've checked that slot is occupied
285            Some(unsafe { &*slot.u.value })
286        } else {
287            None
288        }
289    }
290
291    /// Get mutable reference to value by u64 key
292    ///
293    /// 通过 u64 key 获取值的可变引用
294    ///
295    /// # Parameters
296    /// - `key`: The key returned from `insert`
297    ///
298    /// # Returns
299    /// - `Some(&mut T)`: Mutable reference to the value if key is valid
300    /// - `None`: If key is invalid or value has been removed
301    ///
302    /// # 参数
303    /// - `key`: 从 `insert` 返回的 key
304    ///
305    /// # 返回值
306    /// - `Some(&mut T)`: 如果 key 有效则返回值的可变引用
307    /// - `None`: 如果 key 无效或值已被删除
308    ///
309    /// # Examples (示例)
310    ///
311    /// ```
312    /// use deferred_map::DeferredMap;
313    ///
314    /// let mut map = DeferredMap::new();
315    /// let handle = map.allocate_handle();
316    /// let key = handle.key();
317    /// map.insert(handle, 42);
318    ///
319    /// if let Some(value) = map.get_mut(key) {
320    ///     *value = 100;
321    /// }
322    /// assert_eq!(map.get(key), Some(&100));
323    /// ```
324    #[inline]
325    pub fn get_mut(&mut self, key: u64) -> Option<&mut T> {
326        let (index, generation) = decode_key(key);
327
328        // Bounds check
329        // 边界检查
330        if unlikely(index as usize >= self.slots.len()) {
331            return None;
332        }
333
334        // SAFETY: We've checked that index < slots.len()
335        let slot = unsafe { self.slots.get_unchecked_mut(index as usize) };
336
337        // Fast path: check generation match and return mutable reference
338        // 快速路径:检查 generation 匹配并返回可变引用
339        if likely(slot.generation() == generation && slot.is_occupied()) {
340            // SAFETY: We've checked that slot is occupied
341            Some(unsafe { &mut *slot.u.value })
342        } else {
343            None
344        }
345    }
346
347    /// Remove value by u64 key
348    ///
349    /// If successful, returns the removed value and adds the slot to the free list.
350    ///
351    /// 通过 u64 key 移除值
352    ///
353    /// 如果成功移除,返回被移除的值,并将该 slot 加入空闲列表
354    ///
355    /// # Parameters
356    /// - `key`: The key returned from `insert`
357    ///
358    /// # Returns
359    /// - `Some(T)`: The removed value if key is valid
360    /// - `None`: If key is invalid or value has already been removed
361    ///
362    /// # 参数
363    /// - `key`: 从 `insert` 返回的 key
364    ///
365    /// # 返回值
366    /// - `Some(T)`: 如果 key 有效则返回被移除的值
367    /// - `None`: 如果 key 无效或值已被删除
368    ///
369    /// # Examples (示例)
370    ///
371    /// ```
372    /// use deferred_map::DeferredMap;
373    ///
374    /// let mut map = DeferredMap::new();
375    /// let handle = map.allocate_handle();
376    /// let key = handle.key();
377    /// map.insert(handle, 42);
378    ///
379    /// assert_eq!(map.remove(key), Some(42));
380    /// assert_eq!(map.get(key), None);
381    /// ```
382    #[inline]
383    pub fn remove(&mut self, key: u64) -> Option<T> {
384        let (index, generation) = decode_key(key);
385
386        // Bounds check
387        // 边界检查
388        if unlikely(index as usize >= self.slots.len()) {
389            return None;
390        }
391
392        // SAFETY: We've checked that index < slots.len()
393        let slot = unsafe { self.slots.get_unchecked_mut(index as usize) };
394
395        // Fast path: check generation and occupied state
396        // 快速路径:检查 generation 和占用状态
397        if likely(slot.generation() == generation && slot.is_occupied()) {
398            // Take value from slot
399            // 从 slot 中取出值
400            let value = unsafe { ManuallyDrop::take(&mut slot.u.value) };
401
402            // Add this slot to free list head
403            // 将此 slot 加入空闲列表头部
404            slot.u.next_free = self.free_head;
405            self.free_head = index;
406
407            // Transition: occupied(0bXX11) -> vacant(0bYY00, next generation)
408            // 状态转换:occupied(0bXX11) -> vacant(0bYY00,下一代)
409            slot.version = slot.version.wrapping_add(1); // 0bXX11 -> 0bYY00
410
411            self.num_elems -= 1;
412            Some(value)
413        } else {
414            None
415        }
416    }
417
418    /// Release an unused Handle
419    ///
420    /// Returns the reserved slot back to the free list.
421    /// This is useful when you allocated a handle but decided not to use it.
422    ///
423    /// 释放未使用的 Handle
424    ///
425    /// 将预留的 slot 返回到空闲列表
426    /// 当你分配了 handle 但决定不使用时很有用
427    ///
428    /// # Parameters
429    /// - `handle`: The Handle to release
430    ///
431    /// # 参数
432    /// - `handle`: 要释放的 Handle
433    ///
434    /// # Examples (示例)
435    ///
436    /// ```
437    /// use deferred_map::DeferredMap;
438    ///
439    /// let mut map = DeferredMap::<i32>::new();
440    /// let handle = map.allocate_handle();
441    ///
442    /// // Decided not to use it
443    /// // 决定不使用它
444    /// map.release_handle(handle);
445    /// ```
446    pub fn release_handle(&mut self, handle: Handle) {
447        let index = handle.index();
448        let handle_generation = handle.generation();
449
450        // Validate index (skip sentinel)
451        // 验证 index 有效(跳过 sentinel)
452        debug_assert!(index != 0, "Invalid handle: sentinel index");
453
454        // Slot must exist
455        // slot 必须存在
456        debug_assert!(
457            (index as usize) < self.slots.len(),
458            "Invalid handle: index out of bounds"
459        );
460
461        let slot = &mut self.slots[index as usize];
462
463        // Validate generation match (handle stores generation, not version)
464        // 验证 generation 匹配(handle 存储 generation,不是 version)
465        debug_assert!(
466            slot.generation() == handle_generation,
467            "Generation mismatch"
468        );
469
470        // Validate slot is in Reserved state
471        // 验证 slot 处于 Reserved 状态
472        debug_assert!(slot.is_reserved(), "Handle already used or invalid state");
473
474        // Add this slot to free list head
475        // 将此 slot 加入空闲列表头部
476        slot.u.next_free = self.free_head;
477        self.free_head = index;
478
479        // Transition: reserved(0bXX01) -> vacant(0bYY00, next generation)
480        // 状态转换:reserved(0bXX01) -> vacant(0bYY00,下一代)
481        slot.version = slot.version.wrapping_add(3); // 0bXX01 + 3 = 0bYY00
482    }
483
484    /// Check if key exists
485    ///
486    /// 检查 key 是否存在
487    ///
488    /// # Parameters
489    /// - `key`: The key to check
490    ///
491    /// # Returns
492    /// `true` if the key exists, `false` otherwise
493    ///
494    /// # 参数
495    /// - `key`: 要检查的 key
496    ///
497    /// # 返回值
498    /// 如果 key 存在则返回 `true`,否则返回 `false`
499    ///
500    /// # Examples (示例)
501    ///
502    /// ```
503    /// use deferred_map::DeferredMap;
504    ///
505    /// let mut map = DeferredMap::new();
506    /// let handle = map.allocate_handle();
507    /// let key = handle.key();
508    /// map.insert(handle, 42);
509    ///
510    /// assert!(map.contains_key(key));
511    /// map.remove(key);
512    /// assert!(!map.contains_key(key));
513    /// ```
514    #[inline]
515    pub fn contains_key(&self, key: u64) -> bool {
516        self.get(key).is_some()
517    }
518
519    /// Return the number of valid elements
520    ///
521    /// 返回有效元素的数量
522    ///
523    /// # Examples (示例)
524    ///
525    /// ```
526    /// use deferred_map::DeferredMap;
527    ///
528    /// let mut map = DeferredMap::new();
529    /// assert_eq!(map.len(), 0);
530    ///
531    /// let handle = map.allocate_handle();
532    /// map.insert(handle, 42);
533    /// assert_eq!(map.len(), 1);
534    /// ```
535    #[inline]
536    pub fn len(&self) -> usize {
537        self.num_elems as usize
538    }
539
540    /// Check if the map is empty
541    ///
542    /// 检查是否为空
543    ///
544    /// # Examples (示例)
545    ///
546    /// ```
547    /// use deferred_map::DeferredMap;
548    ///
549    /// let map: DeferredMap<i32> = DeferredMap::new();
550    /// assert!(map.is_empty());
551    /// ```
552    #[inline]
553    pub fn is_empty(&self) -> bool {
554        self.num_elems == 0
555    }
556
557    /// Return capacity (number of allocated slots, excluding sentinel)
558    ///
559    /// 返回容量(已分配的 slot 数量,不包括 sentinel)
560    ///
561    /// # Examples (示例)
562    ///
563    /// ```
564    /// use deferred_map::DeferredMap;
565    ///
566    /// let map: DeferredMap<i32> = DeferredMap::with_capacity(10);
567    /// assert_eq!(map.capacity(), 0);
568    /// ```
569    #[inline]
570    pub fn capacity(&self) -> usize {
571        // Subtract sentinel slot
572        // 减去 sentinel slot
573        self.slots.len().saturating_sub(1)
574    }
575
576    /// Clear all elements
577    ///
578    /// 清空所有元素
579    ///
580    /// # Examples (示例)
581    ///
582    /// ```
583    /// use deferred_map::DeferredMap;
584    ///
585    /// let mut map = DeferredMap::new();
586    /// let handle = map.allocate_handle();
587    /// map.insert(handle, 42);
588    ///
589    /// map.clear();
590    /// assert!(map.is_empty());
591    /// ```
592    #[inline]
593    pub fn clear(&mut self) {
594        self.slots.clear();
595        // Re-add sentinel
596        // 重新添加 sentinel
597        self.slots.push(Slot {
598            u: SlotUnion { next_free: 0 },
599            version: 0,
600        });
601        self.free_head = 1;
602        self.num_elems = 0;
603    }
604
605    /// Return an iterator over all (key, value) pairs
606    ///
607    /// 返回一个迭代器,遍历所有 (key, value) 对
608    ///
609    /// # Examples (示例)
610    ///
611    /// ```
612    /// use deferred_map::DeferredMap;
613    ///
614    /// let mut map = DeferredMap::new();
615    ///
616    /// let h1 = map.allocate_handle();
617    /// map.insert(h1, 1);
618    ///
619    /// let h2 = map.allocate_handle();
620    /// map.insert(h2, 2);
621    ///
622    /// let sum: i32 = map.iter().map(|(_, v)| v).sum();
623    /// assert_eq!(sum, 3);
624    /// ```
625    #[inline]
626    pub fn iter(&self) -> impl Iterator<Item = (u64, &T)> {
627        self.slots
628            .iter()
629            .enumerate()
630            .skip(1)
631            .filter_map(|(index, slot)| {
632                if let Occupied(value) = slot.get() {
633                    let key = encode_key(index as u32, slot.generation());
634                    Some((key, value))
635                } else {
636                    None
637                }
638            })
639    }
640
641    /// Return a mutable iterator over all (key, value) pairs
642    ///
643    /// 返回一个可变迭代器,遍历所有 (key, value) 对
644    ///
645    /// # Examples (示例)
646    ///
647    /// ```
648    /// use deferred_map::DeferredMap;
649    ///
650    /// let mut map = DeferredMap::new();
651    ///
652    /// let h1 = map.allocate_handle();
653    /// map.insert(h1, 1);
654    ///
655    /// let h2 = map.allocate_handle();
656    /// map.insert(h2, 2);
657    ///
658    /// for (_, value) in map.iter_mut() {
659    ///     *value *= 2;
660    /// }
661    ///
662    /// let sum: i32 = map.iter().map(|(_, v)| v).sum();
663    /// assert_eq!(sum, 6);
664    /// ```
665    #[inline]
666    pub fn iter_mut(&mut self) -> impl Iterator<Item = (u64, &mut T)> {
667        self.slots
668            .iter_mut()
669            .enumerate()
670            .skip(1)
671            .filter_map(|(index, slot)| {
672                let generation = slot.generation();
673                if let OccupiedMut(value) = slot.get_mut() {
674                    let key = encode_key(index as u32, generation);
675                    Some((key, value))
676                } else {
677                    None
678                }
679            })
680    }
681}
682
683impl<T: Clone> Clone for DeferredMap<T> {
684    #[inline]
685    fn clone(&self) -> Self {
686        Self {
687            slots: self.slots.clone(),
688            free_head: self.free_head,
689            num_elems: self.num_elems,
690        }
691    }
692
693    #[inline]
694    fn clone_from(&mut self, source: &Self) {
695        self.slots.clone_from(&source.slots);
696        self.free_head = source.free_head;
697        self.num_elems = source.num_elems;
698    }
699}
700
701impl<T> Default for DeferredMap<T> {
702    #[inline]
703    fn default() -> Self {
704        Self::new()
705    }
706}
707
708#[cfg(test)]
709mod basic_tests {
710    use super::*;
711
712    #[test]
713    fn test_basic_insert_and_get() {
714        let mut map = DeferredMap::new();
715
716        let handle = map.allocate_handle();
717        let key = handle.key();
718        map.insert(handle, 42);
719
720        assert_eq!(map.get(key), Some(&42));
721    }
722
723    #[test]
724    fn test_remove_and_reuse() {
725        let mut map = DeferredMap::new();
726
727        let handle1 = map.allocate_handle();
728        let key1 = handle1.key();
729        map.insert(handle1, 42);
730
731        assert_eq!(map.len(), 1);
732        assert_eq!(map.remove(key1), Some(42));
733        assert_eq!(map.len(), 0);
734        assert_eq!(map.get(key1), None);
735
736        // Allocating new handle should reuse previous slot
737        // 分配新的 handle 应该复用之前的 slot
738        let handle2 = map.allocate_handle();
739        let key2 = handle2.key();
740        map.insert(handle2, 100);
741
742        // key2 should have different generation
743        // key2 应该有不同的 generation
744        assert_ne!(key1, key2);
745        assert_eq!(map.get(key2), Some(&100));
746        assert_eq!(map.get(key1), None); // Old key should be invalid | 旧 key 应该无效
747    }
748
749    #[test]
750    fn test_multiple_inserts() {
751        let mut map = DeferredMap::new();
752
753        let mut keys = Vec::new();
754        for i in 0..10 {
755            let handle = map.allocate_handle();
756            let key = handle.key();
757            map.insert(handle, i * 10);
758            keys.push(key);
759        }
760
761        assert_eq!(map.len(), 10);
762
763        for (i, &key) in keys.iter().enumerate() {
764            assert_eq!(map.get(key), Some(&(i * 10)));
765        }
766    }
767
768    #[test]
769    fn test_get_mut() {
770        let mut map = DeferredMap::new();
771
772        let handle = map.allocate_handle();
773        let key = handle.key();
774        map.insert(handle, 42);
775
776        if let Some(value) = map.get_mut(key) {
777            *value = 100;
778        }
779
780        assert_eq!(map.get(key), Some(&100));
781    }
782
783    #[test]
784    fn test_contains_key() {
785        let mut map = DeferredMap::new();
786
787        let handle = map.allocate_handle();
788        let key = handle.key();
789        map.insert(handle, 42);
790
791        assert!(map.contains_key(key));
792
793        map.remove(key);
794        assert!(!map.contains_key(key));
795    }
796
797    #[test]
798    fn test_is_empty() {
799        let mut map: DeferredMap<i32> = DeferredMap::new();
800
801        assert!(map.is_empty());
802
803        let handle = map.allocate_handle();
804        let key = handle.key();
805        map.insert(handle, 42);
806
807        assert!(!map.is_empty());
808
809        map.remove(key);
810        assert!(map.is_empty());
811    }
812
813    #[test]
814    fn test_capacity() {
815        let mut map: DeferredMap<i32> = DeferredMap::with_capacity(10);
816
817        for _ in 0..5 {
818            let handle = map.allocate_handle();
819            map.insert(handle, 42);
820        }
821
822        assert_eq!(map.len(), 5);
823        assert_eq!(map.capacity(), 5);
824    }
825
826    #[test]
827    fn test_clear() {
828        let mut map = DeferredMap::new();
829
830        for i in 0..5 {
831            let handle = map.allocate_handle();
832            map.insert(handle, i);
833        }
834
835        assert_eq!(map.len(), 5);
836
837        map.clear();
838
839        assert_eq!(map.len(), 0);
840        assert_eq!(map.capacity(), 0);
841        assert!(map.is_empty());
842    }
843
844    #[test]
845    fn test_iter() {
846        let mut map = DeferredMap::new();
847
848        let mut keys = Vec::new();
849        for i in 0..5 {
850            let handle = map.allocate_handle();
851            let key = handle.key();
852            map.insert(handle, i * 10);
853            keys.push(key);
854        }
855
856        let collected: Vec<_> = map.iter().collect();
857        assert_eq!(collected.len(), 5);
858
859        for (key, &value) in map.iter() {
860            assert!(keys.contains(&key));
861            let index = keys.iter().position(|&k| k == key).unwrap();
862            assert_eq!(value, index * 10);
863        }
864    }
865
866    #[test]
867    fn test_iter_mut() {
868        let mut map = DeferredMap::new();
869
870        for i in 0..5 {
871            let handle = map.allocate_handle();
872            map.insert(handle, i);
873        }
874
875        for (_, value) in map.iter_mut() {
876            *value *= 2;
877        }
878
879        for (_, &value) in map.iter() {
880            assert_eq!(value % 2, 0);
881        }
882    }
883
884    #[test]
885    fn test_handle_encoding_decoding() {
886        let mut map: DeferredMap<i32> = DeferredMap::new();
887        let handle = map.allocate_handle();
888
889        let key = handle.key();
890        let index = handle.index();
891        let generation = handle.generation();
892
893        // encode_key uses generation (32 bits), not version (which includes state bits)
894        // encode_key 使用 generation(32 位),而不是 version(包含状态位)
895        assert_eq!(encode_key(index, generation), key);
896        assert_eq!(decode_key(key), (index, generation));
897    }
898
899    #[test]
900    fn test_stress_test() {
901        let mut map = DeferredMap::new();
902        let mut keys = Vec::new();
903
904        // Insert 100 elements | 插入 100 个元素
905        for i in 0..100 {
906            let handle = map.allocate_handle();
907            let key = handle.key();
908            map.insert(handle, i);
909            keys.push(key);
910        }
911
912        assert_eq!(map.len(), 100);
913
914        // Remove elements at even indices | 删除偶数索引的元素
915        for i in (0..100).step_by(2) {
916            map.remove(keys[i]);
917        }
918
919        assert_eq!(map.len(), 50);
920
921        // Re-insert 50 elements (should reuse previously deleted slots)
922        // 重新插入 50 个元素(应该复用之前删除的 slot)
923        for i in 0..50 {
924            let handle = map.allocate_handle();
925            let key = handle.key();
926            map.insert(handle, i + 1000);
927            keys[i * 2] = key; // Update key | 更新 key
928        }
929
930        assert_eq!(map.len(), 100);
931
932        // Verify all elements | 验证所有元素
933        let mut count = 0;
934        for (_, _) in map.iter() {
935            count += 1;
936        }
937        assert_eq!(count, 100);
938    }
939
940    #[test]
941    fn test_generation_wrapping() {
942        let mut map = DeferredMap::new();
943
944        // Test generation wrapping
945        // Through many insertions and deletions to increment version
946        // 测试 generation wrapping
947        // 通过大量的插入和删除来增加 version
948        let mut keys = Vec::new();
949        for i in 0..10 {
950            let handle = map.allocate_handle();
951            let key = handle.key();
952            map.insert(handle, i);
953            keys.push(key);
954        }
955
956        // Remove all, test version increment
957        // 删除所有,测试 version 递增
958        for key in &keys {
959            map.remove(*key);
960        }
961
962        // Re-insert, version should increment
963        // 重新插入,version 应该递增
964        let handle = map.allocate_handle();
965        let new_key = handle.key();
966        map.insert(handle, 100);
967
968        // Old key should be invalid | 旧 key 应该无效
969        assert_eq!(map.get(keys[0]), None);
970        // New key is valid | 新 key 有效
971        assert_eq!(map.get(new_key), Some(&100));
972    }
973}