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}