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