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