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