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