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(always)]
49 fn new(raw: u64) -> Self {
50 Self { raw }
51 }
52
53 /// Get the internal u64 value
54 ///
55 /// 获取内部的 u64 值
56 #[inline(always)]
57 pub fn raw_value(&self) -> u64 {
58 self.raw
59 }
60
61 /// Extract index (lower 32 bits)
62 ///
63 /// 提取 index(低 32 位)
64 #[inline(always)]
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(always)]
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(always)]
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(always)]
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(always)]
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(always)]
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(always)]
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(always)]
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 #[cfg(debug_assertions)]
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
520 let slot = unsafe { self.slots.get_unchecked_mut(index as usize) };
521
522 #[cfg(debug_assertions)]
523 {
524 let handle_version = handle.version();
525
526 // Validate version match (handle should have reserved version)
527 // 验证 version 匹配(handle 应该有 reserved version)
528 if unlikely(slot.version != handle_version) {
529 return Err(DeferredMapError::GenerationMismatch);
530 }
531
532 // Validate slot is in Reserved state
533 // 验证 slot 处于 Reserved 状态
534 if unlikely(!slot.is_reserved()) {
535 if slot.is_occupied() {
536 return Err(DeferredMapError::HandleAlreadyUsed);
537 } else {
538 return Err(DeferredMapError::GenerationMismatch);
539 }
540 }
541 }
542
543 // Insert value and transition: reserved(0bXX01) -> occupied(0bXX11)
544 // 插入值并状态转换:reserved(0bXX01) -> occupied(0bXX11)
545 slot.u.value = ManuallyDrop::new(value);
546 slot.version += 2; // 0bXX01 -> 0bXX11
547
548 self.num_elems += 1;
549
550 // Return key with the new occupied version
551 // 返回带有新的 occupied version 的 key
552 Ok(Self::encode_key(index, slot.version))
553 }
554
555 /// Get immutable reference to value by u64 key
556 ///
557 /// 通过 u64 key 获取值的不可变引用
558 ///
559 /// # Parameters
560 /// - `key`: The key returned from `insert`
561 ///
562 /// # Returns
563 /// - `Some(&T)`: Reference to the value if key is valid
564 /// - `None`: If key is invalid or value has been removed
565 ///
566 /// # 参数
567 /// - `key`: 从 `insert` 返回的 key
568 ///
569 /// # 返回值
570 /// - `Some(&T)`: 如果 key 有效则返回值的引用
571 /// - `None`: 如果 key 无效或值已被删除
572 ///
573 /// # Examples (示例)
574 ///
575 /// ```
576 /// use deferred_map::DeferredMap;
577 ///
578 /// let mut map = DeferredMap::new();
579 /// let handle = map.allocate_handle();
580 /// let key = map.insert(handle, 42).unwrap();
581 /// assert_eq!(map.get(key), Some(&42));
582 /// ```
583 #[inline]
584 pub fn get(&self, key: u64) -> Option<&T> {
585 let (index, generation) = Self::decode_key(key);
586
587 // Bounds check
588 // 边界检查
589 if unlikely(index as usize >= self.slots.len()) {
590 return None;
591 }
592
593 // SAFETY: We've checked that index < slots.len()
594 let slot = unsafe { self.slots.get_unchecked(index as usize) };
595
596 // Fast path: check version match and return value
597 // 快速路径:检查 version 匹配并返回值
598 if likely(slot.version == generation && slot.is_occupied()) {
599 // SAFETY: We've checked that slot is occupied
600 Some(unsafe { &*slot.u.value })
601 } else {
602 None
603 }
604 }
605
606 /// Get mutable reference to value by u64 key
607 ///
608 /// 通过 u64 key 获取值的可变引用
609 ///
610 /// # Parameters
611 /// - `key`: The key returned from `insert`
612 ///
613 /// # Returns
614 /// - `Some(&mut T)`: Mutable reference to the value if key is valid
615 /// - `None`: If key is invalid or value has been removed
616 ///
617 /// # 参数
618 /// - `key`: 从 `insert` 返回的 key
619 ///
620 /// # 返回值
621 /// - `Some(&mut T)`: 如果 key 有效则返回值的可变引用
622 /// - `None`: 如果 key 无效或值已被删除
623 ///
624 /// # Examples (示例)
625 ///
626 /// ```
627 /// use deferred_map::DeferredMap;
628 ///
629 /// let mut map = DeferredMap::new();
630 /// let handle = map.allocate_handle();
631 /// let key = map.insert(handle, 42).unwrap();
632 ///
633 /// if let Some(value) = map.get_mut(key) {
634 /// *value = 100;
635 /// }
636 /// assert_eq!(map.get(key), Some(&100));
637 /// ```
638 #[inline]
639 pub fn get_mut(&mut self, key: u64) -> Option<&mut T> {
640 let (index, generation) = Self::decode_key(key);
641
642 // Bounds check
643 // 边界检查
644 if unlikely(index as usize >= self.slots.len()) {
645 return None;
646 }
647
648 // SAFETY: We've checked that index < slots.len()
649 let slot = unsafe { self.slots.get_unchecked_mut(index as usize) };
650
651 // Fast path: check version match and return mutable reference
652 // 快速路径:检查 version 匹配并返回可变引用
653 if likely(slot.version == generation && slot.is_occupied()) {
654 // SAFETY: We've checked that slot is occupied
655 Some(unsafe { &mut *slot.u.value })
656 } else {
657 None
658 }
659 }
660
661 /// Remove value by u64 key
662 ///
663 /// If successful, returns the removed value and adds the slot to the free list.
664 ///
665 /// 通过 u64 key 移除值
666 ///
667 /// 如果成功移除,返回被移除的值,并将该 slot 加入空闲列表
668 ///
669 /// # Parameters
670 /// - `key`: The key returned from `insert`
671 ///
672 /// # Returns
673 /// - `Some(T)`: The removed value if key is valid
674 /// - `None`: If key is invalid or value has already been removed
675 ///
676 /// # 参数
677 /// - `key`: 从 `insert` 返回的 key
678 ///
679 /// # 返回值
680 /// - `Some(T)`: 如果 key 有效则返回被移除的值
681 /// - `None`: 如果 key 无效或值已被删除
682 ///
683 /// # Examples (示例)
684 ///
685 /// ```
686 /// use deferred_map::DeferredMap;
687 ///
688 /// let mut map = DeferredMap::new();
689 /// let handle = map.allocate_handle();
690 /// let key = map.insert(handle, 42).unwrap();
691 ///
692 /// assert_eq!(map.remove(key), Some(42));
693 /// assert_eq!(map.get(key), None);
694 /// ```
695 #[inline]
696 pub fn remove(&mut self, key: u64) -> Option<T> {
697 let (index, generation) = Self::decode_key(key);
698
699 // Bounds check
700 // 边界检查
701 if unlikely(index as usize >= self.slots.len()) {
702 return None;
703 }
704
705 // SAFETY: We've checked that index < slots.len()
706 let slot = unsafe { self.slots.get_unchecked_mut(index as usize) };
707
708 // Fast path: check version and occupied state
709 // 快速路径:检查 version 和占用状态
710 if likely(slot.version == generation && slot.is_occupied()) {
711 // Take value from slot
712 // 从 slot 中取出值
713 let value = unsafe { ManuallyDrop::take(&mut slot.u.value) };
714
715 // Add this slot to free list head
716 // 将此 slot 加入空闲列表头部
717 slot.u.next_free = self.free_head;
718 self.free_head = index;
719
720 // Transition: occupied(0bXX11) -> vacant(0bYY00, next generation)
721 // 状态转换:occupied(0bXX11) -> vacant(0bYY00,下一代)
722 slot.version = slot.version.wrapping_add(1); // 0bXX11 -> 0bYY00
723
724 self.num_elems -= 1;
725 Some(value)
726 } else {
727 None
728 }
729 }
730
731 /// Release an unused Handle
732 ///
733 /// Returns the reserved slot back to the free list.
734 /// This is useful when you allocated a handle but decided not to use it.
735 ///
736 /// 释放未使用的 Handle
737 ///
738 /// 将预留的 slot 返回到空闲列表
739 /// 当你分配了 handle 但决定不使用时很有用
740 ///
741 /// # Parameters
742 /// - `handle`: The Handle to release
743 ///
744 /// # Returns
745 /// - `Ok(())`: Handle successfully released
746 /// - `Err(DeferredMapError)`: Error if handle is invalid or already used
747 ///
748 /// # 参数
749 /// - `handle`: 要释放的 Handle
750 ///
751 /// # 返回值
752 /// - `Ok(())`: Handle 成功释放
753 /// - `Err(DeferredMapError)`: 如果 handle 无效或已被使用则返回错误
754 ///
755 /// # Examples (示例)
756 ///
757 /// ```
758 /// use deferred_map::DeferredMap;
759 ///
760 /// let mut map = DeferredMap::<i32>::new();
761 /// let handle = map.allocate_handle();
762 ///
763 /// // Decided not to use it
764 /// // 决定不使用它
765 /// map.release_handle(handle).unwrap();
766 /// ```
767 pub fn release_handle(&mut self, handle: Handle) -> Result<(), DeferredMapError> {
768 let index = handle.index();
769 let handle_version = handle.version();
770
771 // Validate index (skip sentinel)
772 // 验证 index 有效(跳过 sentinel)
773 if unlikely(index == 0) {
774 return Err(DeferredMapError::InvalidHandle);
775 }
776
777 // Slot must exist
778 // slot 必须存在
779 if unlikely(index as usize >= self.slots.len()) {
780 return Err(DeferredMapError::InvalidHandle);
781 }
782
783 let slot = &mut self.slots[index as usize];
784
785 // Validate version match (handle should have reserved version)
786 // 验证 version 匹配(handle 应该有 reserved version)
787 if unlikely(slot.version != handle_version) {
788 return Err(DeferredMapError::GenerationMismatch);
789 }
790
791 // Validate slot is in Reserved state
792 // 验证 slot 处于 Reserved 状态
793 if unlikely(!slot.is_reserved()) {
794 if slot.is_occupied() {
795 return Err(DeferredMapError::HandleAlreadyUsed);
796 } else {
797 return Err(DeferredMapError::GenerationMismatch);
798 }
799 }
800
801 // Add this slot to free list head
802 // 将此 slot 加入空闲列表头部
803 slot.u.next_free = self.free_head;
804 self.free_head = index;
805
806 // Transition: reserved(0bXX01) -> vacant(0bYY00, next generation)
807 // 状态转换:reserved(0bXX01) -> vacant(0bYY00,下一代)
808 slot.version = slot.version.wrapping_add(3); // 0bXX01 + 3 = 0bYY00
809
810 Ok(())
811 }
812
813 /// Check if key exists
814 ///
815 /// 检查 key 是否存在
816 ///
817 /// # Parameters
818 /// - `key`: The key to check
819 ///
820 /// # Returns
821 /// `true` if the key exists, `false` otherwise
822 ///
823 /// # 参数
824 /// - `key`: 要检查的 key
825 ///
826 /// # 返回值
827 /// 如果 key 存在则返回 `true`,否则返回 `false`
828 ///
829 /// # Examples (示例)
830 ///
831 /// ```
832 /// use deferred_map::DeferredMap;
833 ///
834 /// let mut map = DeferredMap::new();
835 /// let handle = map.allocate_handle();
836 /// let key = map.insert(handle, 42).unwrap();
837 ///
838 /// assert!(map.contains_key(key));
839 /// map.remove(key);
840 /// assert!(!map.contains_key(key));
841 /// ```
842 #[inline]
843 pub fn contains_key(&self, key: u64) -> bool {
844 self.get(key).is_some()
845 }
846
847 /// Return the number of valid elements
848 ///
849 /// 返回有效元素的数量
850 ///
851 /// # Examples (示例)
852 ///
853 /// ```
854 /// use deferred_map::DeferredMap;
855 ///
856 /// let mut map = DeferredMap::new();
857 /// assert_eq!(map.len(), 0);
858 ///
859 /// let handle = map.allocate_handle();
860 /// map.insert(handle, 42).unwrap();
861 /// assert_eq!(map.len(), 1);
862 /// ```
863 #[inline]
864 pub fn len(&self) -> usize {
865 self.num_elems as usize
866 }
867
868 /// Check if the map is empty
869 ///
870 /// 检查是否为空
871 ///
872 /// # Examples (示例)
873 ///
874 /// ```
875 /// use deferred_map::DeferredMap;
876 ///
877 /// let map: DeferredMap<i32> = DeferredMap::new();
878 /// assert!(map.is_empty());
879 /// ```
880 #[inline]
881 pub fn is_empty(&self) -> bool {
882 self.num_elems == 0
883 }
884
885 /// Return capacity (number of allocated slots, excluding sentinel)
886 ///
887 /// 返回容量(已分配的 slot 数量,不包括 sentinel)
888 ///
889 /// # Examples (示例)
890 ///
891 /// ```
892 /// use deferred_map::DeferredMap;
893 ///
894 /// let map: DeferredMap<i32> = DeferredMap::with_capacity(10);
895 /// assert_eq!(map.capacity(), 0);
896 /// ```
897 #[inline]
898 pub fn capacity(&self) -> usize {
899 // Subtract sentinel slot
900 // 减去 sentinel slot
901 self.slots.len().saturating_sub(1)
902 }
903
904 /// Clear all elements
905 ///
906 /// 清空所有元素
907 ///
908 /// # Examples (示例)
909 ///
910 /// ```
911 /// use deferred_map::DeferredMap;
912 ///
913 /// let mut map = DeferredMap::new();
914 /// let handle = map.allocate_handle();
915 /// map.insert(handle, 42).unwrap();
916 ///
917 /// map.clear();
918 /// assert!(map.is_empty());
919 /// ```
920 #[inline]
921 pub fn clear(&mut self) {
922 self.slots.clear();
923 // Re-add sentinel
924 // 重新添加 sentinel
925 self.slots.push(Slot {
926 u: SlotUnion { next_free: 0 },
927 version: 0,
928 });
929 self.free_head = 1;
930 self.num_elems = 0;
931 }
932
933 /// Return an iterator over all (key, value) pairs
934 ///
935 /// 返回一个迭代器,遍历所有 (key, value) 对
936 ///
937 /// # Examples (示例)
938 ///
939 /// ```
940 /// use deferred_map::DeferredMap;
941 ///
942 /// let mut map = DeferredMap::new();
943 ///
944 /// let h1 = map.allocate_handle();
945 /// map.insert(h1, 1).unwrap();
946 ///
947 /// let h2 = map.allocate_handle();
948 /// map.insert(h2, 2).unwrap();
949 ///
950 /// let sum: i32 = map.iter().map(|(_, v)| v).sum();
951 /// assert_eq!(sum, 3);
952 /// ```
953 #[inline]
954 pub fn iter(&self) -> impl Iterator<Item = (u64, &T)> {
955 self.slots.iter().enumerate().skip(1).filter_map(|(index, slot)| {
956 if let Occupied(value) = slot.get() {
957 let key = Self::encode_key(index as u32, slot.version);
958 Some((key, value))
959 } else {
960 None
961 }
962 })
963 }
964
965 /// Return a mutable iterator over all (key, value) pairs
966 ///
967 /// 返回一个可变迭代器,遍历所有 (key, value) 对
968 ///
969 /// # Examples (示例)
970 ///
971 /// ```
972 /// use deferred_map::DeferredMap;
973 ///
974 /// let mut map = DeferredMap::new();
975 ///
976 /// let h1 = map.allocate_handle();
977 /// map.insert(h1, 1).unwrap();
978 ///
979 /// let h2 = map.allocate_handle();
980 /// map.insert(h2, 2).unwrap();
981 ///
982 /// for (_, value) in map.iter_mut() {
983 /// *value *= 2;
984 /// }
985 ///
986 /// let sum: i32 = map.iter().map(|(_, v)| v).sum();
987 /// assert_eq!(sum, 6);
988 /// ```
989 #[inline]
990 pub fn iter_mut(&mut self) -> impl Iterator<Item = (u64, &mut T)> {
991 self.slots.iter_mut().enumerate().skip(1).filter_map(|(index, slot)| {
992 let version = slot.version;
993 if let OccupiedMut(value) = slot.get_mut() {
994 let key = Self::encode_key(index as u32, version);
995 Some((key, value))
996 } else {
997 None
998 }
999 })
1000 }
1001}
1002
1003impl<T: Clone> Clone for DeferredMap<T> {
1004 #[inline]
1005 fn clone(&self) -> Self {
1006 Self {
1007 slots: self.slots.clone(),
1008 free_head: self.free_head,
1009 num_elems: self.num_elems,
1010 }
1011 }
1012
1013 #[inline]
1014 fn clone_from(&mut self, source: &Self) {
1015 self.slots.clone_from(&source.slots);
1016 self.free_head = source.free_head;
1017 self.num_elems = source.num_elems;
1018 }
1019}
1020
1021impl<T> Default for DeferredMap<T> {
1022 #[inline]
1023 fn default() -> Self {
1024 Self::new()
1025 }
1026}
1027
1028#[cfg(test)]
1029mod basic_tests {
1030 use super::*;
1031
1032 #[test]
1033 fn test_basic_insert_and_get() {
1034 let mut map = DeferredMap::new();
1035
1036 let handle = map.allocate_handle();
1037 let key = map.insert(handle, 42).unwrap();
1038
1039 assert_eq!(map.get(key), Some(&42));
1040 }
1041
1042 #[test]
1043 fn test_handle_cannot_be_used_twice() {
1044 let mut map = DeferredMap::new();
1045
1046 let handle = map.allocate_handle();
1047 let key = map.insert(handle, 42).unwrap();
1048
1049 // Attempting to insert again with the same key should fail
1050 // 尝试使用相同的 key 再次插入应该失败
1051 let handle2 = Handle::new(key);
1052 let result = map.insert(handle2, 100);
1053
1054 assert_eq!(result, Err(DeferredMapError::HandleAlreadyUsed));
1055 assert_eq!(map.get(key), Some(&42)); // Original value unchanged | 原值不变
1056 }
1057
1058 #[test]
1059 fn test_remove_and_reuse() {
1060 let mut map = DeferredMap::new();
1061
1062 let handle1 = map.allocate_handle();
1063 let key1 = map.insert(handle1, 42).unwrap();
1064
1065 assert_eq!(map.len(), 1);
1066 assert_eq!(map.remove(key1), Some(42));
1067 assert_eq!(map.len(), 0);
1068 assert_eq!(map.get(key1), None);
1069
1070 // Allocating new handle should reuse previous slot
1071 // 分配新的 handle 应该复用之前的 slot
1072 let handle2 = map.allocate_handle();
1073 let key2 = map.insert(handle2, 100).unwrap();
1074
1075 // key2 should have different generation
1076 // key2 应该有不同的 generation
1077 assert_ne!(key1, key2);
1078 assert_eq!(map.get(key2), Some(&100));
1079 assert_eq!(map.get(key1), None); // Old key should be invalid | 旧 key 应该无效
1080 }
1081
1082 #[test]
1083 fn test_generation_mismatch() {
1084 let mut map = DeferredMap::new();
1085
1086 let handle = map.allocate_handle();
1087 let old_key = handle.raw_value();
1088 map.insert(handle, 42).unwrap();
1089
1090 map.remove(old_key);
1091
1092 // Attempting to use old key should fail
1093 // 尝试使用旧的 key 对应的 handle 应该失败
1094 let old_handle = Handle::new(old_key);
1095 let result = map.insert(old_handle, 100);
1096
1097 assert_eq!(result, Err(DeferredMapError::GenerationMismatch));
1098 }
1099
1100 #[test]
1101 fn test_multiple_inserts() {
1102 let mut map = DeferredMap::new();
1103
1104 let mut keys = Vec::new();
1105 for i in 0..10 {
1106 let handle = map.allocate_handle();
1107 let key = map.insert(handle, i * 10).unwrap();
1108 keys.push(key);
1109 }
1110
1111 assert_eq!(map.len(), 10);
1112
1113 for (i, &key) in keys.iter().enumerate() {
1114 assert_eq!(map.get(key), Some(&(i * 10)));
1115 }
1116 }
1117
1118 #[test]
1119 fn test_get_mut() {
1120 let mut map = DeferredMap::new();
1121
1122 let handle = map.allocate_handle();
1123 let key = map.insert(handle, 42).unwrap();
1124
1125 if let Some(value) = map.get_mut(key) {
1126 *value = 100;
1127 }
1128
1129 assert_eq!(map.get(key), Some(&100));
1130 }
1131
1132 #[test]
1133 fn test_contains_key() {
1134 let mut map = DeferredMap::new();
1135
1136 let handle = map.allocate_handle();
1137 let key = map.insert(handle, 42).unwrap();
1138
1139 assert!(map.contains_key(key));
1140
1141 map.remove(key);
1142 assert!(!map.contains_key(key));
1143 }
1144
1145 #[test]
1146 fn test_is_empty() {
1147 let mut map: DeferredMap<i32> = DeferredMap::new();
1148
1149 assert!(map.is_empty());
1150
1151 let handle = map.allocate_handle();
1152 let key = map.insert(handle, 42).unwrap();
1153
1154 assert!(!map.is_empty());
1155
1156 map.remove(key);
1157 assert!(map.is_empty());
1158 }
1159
1160 #[test]
1161 fn test_capacity() {
1162 let mut map: DeferredMap<i32> = DeferredMap::with_capacity(10);
1163
1164 for _ in 0..5 {
1165 let handle = map.allocate_handle();
1166 map.insert(handle, 42).unwrap();
1167 }
1168
1169 assert_eq!(map.len(), 5);
1170 assert_eq!(map.capacity(), 5);
1171 }
1172
1173 #[test]
1174 fn test_clear() {
1175 let mut map = DeferredMap::new();
1176
1177 for i in 0..5 {
1178 let handle = map.allocate_handle();
1179 map.insert(handle, i).unwrap();
1180 }
1181
1182 assert_eq!(map.len(), 5);
1183
1184 map.clear();
1185
1186 assert_eq!(map.len(), 0);
1187 assert_eq!(map.capacity(), 0);
1188 assert!(map.is_empty());
1189 }
1190
1191 #[test]
1192 fn test_iter() {
1193 let mut map = DeferredMap::new();
1194
1195 let mut keys = Vec::new();
1196 for i in 0..5 {
1197 let handle = map.allocate_handle();
1198 let key = map.insert(handle, i * 10).unwrap();
1199 keys.push(key);
1200 }
1201
1202 let collected: Vec<_> = map.iter().collect();
1203 assert_eq!(collected.len(), 5);
1204
1205 for (key, &value) in map.iter() {
1206 assert!(keys.contains(&key));
1207 let index = keys.iter().position(|&k| k == key).unwrap();
1208 assert_eq!(value, index * 10);
1209 }
1210 }
1211
1212 #[test]
1213 fn test_iter_mut() {
1214 let mut map = DeferredMap::new();
1215
1216 for i in 0..5 {
1217 let handle = map.allocate_handle();
1218 map.insert(handle, i).unwrap();
1219 }
1220
1221 for (_, value) in map.iter_mut() {
1222 *value *= 2;
1223 }
1224
1225 for (_, &value) in map.iter() {
1226 assert_eq!(value % 2, 0);
1227 }
1228 }
1229
1230 #[test]
1231 fn test_handle_encoding_decoding() {
1232 let mut map: DeferredMap<i32> = DeferredMap::new();
1233 let handle = map.allocate_handle();
1234
1235 let raw = handle.raw_value();
1236 let index = handle.index();
1237 let version = (raw >> 32) as u32; // Full version including state bits
1238
1239 // encode_key uses version (32 bits), not generation (30 bits)
1240 // encode_key 使用 version(32 位),而不是 generation(30 位)
1241 assert_eq!(DeferredMap::<i32>::encode_key(index, version), raw);
1242 assert_eq!(DeferredMap::<i32>::decode_key(raw), (index, version));
1243 }
1244
1245 #[test]
1246 fn test_stress_test() {
1247 let mut map = DeferredMap::new();
1248 let mut keys = Vec::new();
1249
1250 // Insert 100 elements | 插入 100 个元素
1251 for i in 0..100 {
1252 let handle = map.allocate_handle();
1253 let key = map.insert(handle, i).unwrap();
1254 keys.push(key);
1255 }
1256
1257 assert_eq!(map.len(), 100);
1258
1259 // Remove elements at even indices | 删除偶数索引的元素
1260 for i in (0..100).step_by(2) {
1261 map.remove(keys[i]);
1262 }
1263
1264 assert_eq!(map.len(), 50);
1265
1266 // Re-insert 50 elements (should reuse previously deleted slots)
1267 // 重新插入 50 个元素(应该复用之前删除的 slot)
1268 for i in 0..50 {
1269 let handle = map.allocate_handle();
1270 let key = map.insert(handle, i + 1000).unwrap();
1271 keys[i * 2] = key; // Update key | 更新 key
1272 }
1273
1274 assert_eq!(map.len(), 100);
1275
1276 // Verify all elements | 验证所有元素
1277 let mut count = 0;
1278 for (_, _) in map.iter() {
1279 count += 1;
1280 }
1281 assert_eq!(count, 100);
1282 }
1283
1284 #[test]
1285 fn test_generation_wrapping() {
1286 let mut map = DeferredMap::new();
1287
1288 // Test generation wrapping
1289 // Through many insertions and deletions to increment version
1290 // 测试 generation wrapping
1291 // 通过大量的插入和删除来增加 version
1292 let mut keys = Vec::new();
1293 for i in 0..10 {
1294 let handle = map.allocate_handle();
1295 let key = map.insert(handle, i).unwrap();
1296 keys.push(key);
1297 }
1298
1299 // Remove all, test version increment
1300 // 删除所有,测试 version 递增
1301 for key in &keys {
1302 map.remove(*key);
1303 }
1304
1305 // Re-insert, version should increment
1306 // 重新插入,version 应该递增
1307 let handle = map.allocate_handle();
1308 let new_key = map.insert(handle, 100).unwrap();
1309
1310 // Old key should be invalid | 旧 key 应该无效
1311 assert_eq!(map.get(keys[0]), None);
1312 // New key is valid | 新 key 有效
1313 assert_eq!(map.get(new_key), Some(&100));
1314 }
1315}