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}