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