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