deferred-map 0.3.1

High-performance generational arena using handle-based deferred insertion with O(1) operations
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
// Edge cases and error handling comprehensive tests
// 边界情况和错误处理的全面测试

use crate::DeferredMap;

#[test]
fn test_get_with_invalid_key() {
    let mut map = DeferredMap::new();

    let h = map.allocate_handle();
    let _ = h.key();
    map.insert(h, 42);

    // Try to get with valid key from un-inserted handle
    // 尝试使用未插入 handle 的有效 key 获取
    let h2 = map.allocate_handle();
    let k2 = h2.key();
    assert_eq!(map.get(k2), None);
}

#[test]
fn test_get_mut_with_invalid_key() {
    let mut map = DeferredMap::new();

    let h = map.allocate_handle();
    let _ = h.key();
    map.insert(h, 42);

    // Try to get_mut with valid key from un-inserted handle
    // 尝试使用未插入 handle 的有效 key 进行 get_mut
    let h2 = map.allocate_handle();
    let k2 = h2.key();
    assert_eq!(map.get_mut(k2), None);
}

#[test]
fn test_contains_key_with_invalid_key() {
    let mut map = DeferredMap::new();

    let h = map.allocate_handle();
    let k = h.key();
    map.insert(h, 42);

    assert!(map.contains_key(k));

    let h2 = map.allocate_handle();
    let k2 = h2.key();
    assert!(!map.contains_key(k2));
}

#[test]
fn test_operations_after_clear() {
    let mut map = DeferredMap::new();

    // Insert some elements
    // 插入一些元素
    let mut keys = Vec::new();
    for i in 0..10 {
        let h = map.allocate_handle();
        let k = h.key();
        map.insert(h, i);
        keys.push(k);
    }

    map.clear();

    // All previous keys should be invalid
    // 所有先前的 key 应该无效
    for key in keys {
        assert_eq!(map.get(key), None);
        assert_eq!(map.remove(key), None);
        assert!(!map.contains_key(key));
    }

    assert!(map.is_empty());
    assert_eq!(map.len(), 0);
}

#[test]
fn test_iter_on_empty_map() {
    let map: DeferredMap<i32> = DeferredMap::new();

    let count = map.iter().count();
    assert_eq!(count, 0);
}

#[test]
fn test_iter_mut_on_empty_map() {
    let mut map: DeferredMap<i32> = DeferredMap::new();

    let count = map.iter_mut().count();
    assert_eq!(count, 0);
}

#[test]
fn test_iter_skips_removed_elements() {
    let mut map = DeferredMap::new();

    let mut keys = Vec::new();
    for i in 0..10 {
        let h = map.allocate_handle();
        let k = h.key();
        map.insert(h, i);
        keys.push(k);
    }

    // Remove some elements
    // 删除一些元素
    map.remove(keys[2]);
    map.remove(keys[5]);
    map.remove(keys[8]);

    let count = map.iter().count();
    assert_eq!(count, 7); // 10 - 3 = 7
}

#[test]
fn test_iter_mut_skips_removed_elements() {
    let mut map = DeferredMap::new();

    let mut keys = Vec::new();
    for i in 0..10 {
        let h = map.allocate_handle();
        let k = h.key();
        map.insert(h, i);
        keys.push(k);
    }

    map.remove(keys[0]);
    map.remove(keys[9]);

    let count = map.iter_mut().count();
    assert_eq!(count, 8);
}

#[test]
fn test_clone_empty_map() {
    let map: DeferredMap<i32> = DeferredMap::new();
    let cloned = map.clone();

    assert_eq!(cloned.len(), 0);
    assert_eq!(cloned.capacity(), 0);
    assert!(cloned.is_empty());
}

#[test]
fn test_clone_with_values() {
    let mut map = DeferredMap::new();

    let h1 = map.allocate_handle();
    let _k1 = h1.key();
    map.insert(h1, 42);

    let h2 = map.allocate_handle();
    let _k2 = h2.key();
    map.insert(h2, 100);

    let cloned = map.clone();
    assert_eq!(cloned.len(), 2);

    // Verify values exist by iterating
    let values: Vec<_> = cloned.iter().map(|(_, v)| *v).collect();
    assert!(values.contains(&42));
    assert!(values.contains(&100));
}

#[test]
fn test_clone_independence() {
    let mut map = DeferredMap::new();

    let h = map.allocate_handle();
    let k = h.key();
    map.insert(h, 42);

    let mut cloned = map.clone();

    // Find the key corresponding to 42 in the cloned map
    let (k_cloned, _) = cloned
        .iter()
        .find(|(_, v)| **v == 42)
        .expect("Value 42 not found in cloned map");

    // Modify cloned map using its own key
    if let Some(value) = cloned.get_mut(k_cloned) {
        *value = 100;
    }

    // Original should be unchanged
    // 原始的应该不变
    assert_eq!(map.get(k), Some(&42));
    // Verify modification in cloned map
    assert_eq!(cloned.get(k_cloned), Some(&100));
}

#[test]
fn test_clone_from() {
    let mut map1 = DeferredMap::new();
    let h1 = map1.allocate_handle();
    let _k1 = h1.key();
    map1.insert(h1, 1);

    let mut map2 = DeferredMap::new();
    let h2 = map2.allocate_handle();
    map2.insert(h2, 2);

    map2.clone_from(&map1);

    assert_eq!(map2.len(), 1);
    // Verify content via iteration
    let (k2, v2) = map2.iter().next().expect("Map2 should not be empty");
    assert_eq!(v2, &1);
    // Verification that k2 is usable on map2
    assert_eq!(map2.get(k2), Some(&1));
}

#[test]
fn test_default_creates_empty_map() {
    let map: DeferredMap<i32> = DeferredMap::default();

    assert!(map.is_empty());
    assert_eq!(map.len(), 0);
}

#[test]
fn test_with_capacity_zero() {
    let map: DeferredMap<i32> = DeferredMap::with_capacity(0);

    assert_eq!(map.capacity(), 0);
    assert!(map.is_empty());
}

#[test]
fn test_with_capacity_large() {
    let map: DeferredMap<i32> = DeferredMap::with_capacity(1000);

    // Capacity should be at least what was requested
    // 容量应至少为请求的大小
    assert!(map.capacity() >= 1000);
}

#[test]
fn test_operations_on_map_with_gaps() {
    let mut map = DeferredMap::new();

    // Create map with gaps (insert, remove, insert pattern)
    // 创建有间隙的 map(插入、删除、插入模式)
    let h1 = map.allocate_handle();
    let k1 = h1.key();
    map.insert(h1, 1);

    let h2 = map.allocate_handle();
    let k2 = h2.key();
    map.insert(h2, 2);

    let h3 = map.allocate_handle();
    let k3 = h3.key();
    map.insert(h3, 3);

    // Remove middle element
    // 删除中间元素
    map.remove(k2);

    // Insert new element (should reuse k2's slot)
    // 插入新元素(应该复用 k2 的 slot)
    let h4 = map.allocate_handle();
    let k4 = h4.key();
    map.insert(h4, 4);

    // Verify all operations work correctly
    // 验证所有操作正常工作
    assert_eq!(map.get(k1), Some(&1));
    assert_eq!(map.get(k2), None); // Outdated key | 过时的 key
    assert_eq!(map.get(k3), Some(&3));
    assert_eq!(map.get(k4), Some(&4));

    assert_eq!(map.len(), 3);
}

#[test]
fn test_get_after_modification() {
    let mut map = DeferredMap::new();

    let h = map.allocate_handle();
    let k = h.key();
    map.insert(h, 42);

    // Modify through get_mut
    // 通过 get_mut 修改
    if let Some(value) = map.get_mut(k) {
        *value = 100;
    }

    // Verify change through get
    // 通过 get 验证更改
    assert_eq!(map.get(k), Some(&100));
}

#[test]
fn test_remove_during_iteration() {
    let mut map = DeferredMap::new();

    let mut keys = Vec::new();
    for i in 0..10 {
        let h = map.allocate_handle();
        let k = h.key();
        map.insert(h, i);
        keys.push(k);
    }

    // Collect keys from iteration
    // 从迭代中收集 key
    let iter_keys: Vec<_> = map.iter().map(|(k, _)| k).collect();

    // Remove some elements
    // 删除一些元素
    for &k in &iter_keys[0..5] {
        map.remove(k);
    }

    // New iteration should show reduced count
    // 新迭代应该显示减少的计数
    assert_eq!(map.iter().count(), 5);
}

#[test]
fn test_very_large_key_values() {
    let mut map: DeferredMap<i32> = DeferredMap::new();

    // Test with valid key format but not inserted
    let h = map.allocate_handle();
    let k = h.key();
    assert_eq!(map.get(k), None);
}

#[test]
fn test_consecutive_handle_allocations() {
    let mut map = DeferredMap::<i32>::new();

    let handles: Vec<_> = (0..100).map(|_| map.allocate_handle()).collect();

    // Verify all handles have unique indices
    // 验证所有 handle 都有唯一的索引
    let mut indices = std::collections::HashSet::new();
    for handle in &handles {
        let index = handle.index();
        assert!(indices.insert(index), "Duplicate index found");
    }
}

#[test]
fn test_interleaved_operations() {
    let mut map = DeferredMap::new();

    // Allocate
    let h1 = map.allocate_handle();

    // Insert
    let k1 = h1.key();
    map.insert(h1, 1);

    // Allocate more
    let h2 = map.allocate_handle();

    // Get
    assert_eq!(map.get(k1), Some(&1));

    // Insert
    let k2 = h2.key();
    map.insert(h2, 2);

    // Remove
    map.remove(k1);

    // Allocate (should reuse k1's slot)
    let h3 = map.allocate_handle();

    // Insert
    let k3 = h3.key();
    map.insert(h3, 3);

    // Verify state
    assert_eq!(map.get(k2), Some(&2));
    assert_eq!(map.get(k3), Some(&3));
    assert_eq!(map.len(), 2);
}

#[test]
fn test_map_with_option_type() {
    let mut map = DeferredMap::new();

    let h1 = map.allocate_handle();
    let k1 = h1.key();
    map.insert(h1, Some(42));

    let h2 = map.allocate_handle();
    let k2 = h2.key();
    map.insert(h2, None::<i32>);

    assert_eq!(map.get(k1), Some(&Some(42)));
    assert_eq!(map.get(k2), Some(&None));
}

#[test]
fn test_map_with_result_type() {
    let mut map = DeferredMap::new();

    let h1 = map.allocate_handle();
    let k1 = h1.key();
    map.insert(h1, Ok::<i32, String>(42));

    let h2 = map.allocate_handle();
    let k2 = h2.key();
    map.insert(h2, Err::<i32, String>("error".to_string()));

    assert_eq!(map.get(k1), Some(&Ok(42)));
    assert_eq!(map.get(k2), Some(&Err("error".to_string())));
}