1use crate::EntityRef;
3use crate::boxed_slice::BoxedSlice;
4use crate::iter::{IntoIter, Iter, IterMut};
5use crate::keys::Keys;
6use alloc::boxed::Box;
7use alloc::vec::Vec;
8use core::fmt;
9use core::marker::PhantomData;
10use core::ops::{Index, IndexMut};
11use core::slice;
12#[cfg(feature = "enable-serde")]
13use serde_derive::{Deserialize, Serialize};
14use wasmtime_core::error::OutOfMemory;
15
16#[derive(Clone, Hash, PartialEq, Eq)]
32#[cfg_attr(feature = "enable-serde", derive(Serialize, Deserialize))]
33pub struct PrimaryMap<K, V>
34where
35 K: EntityRef,
36{
37 elems: Vec<V>,
38 unused: PhantomData<K>,
39}
40
41impl<K, V> PrimaryMap<K, V>
42where
43 K: EntityRef,
44{
45 pub fn new() -> Self {
47 Self {
48 elems: Vec::new(),
49 unused: PhantomData,
50 }
51 }
52
53 pub fn with_capacity(capacity: usize) -> Self {
55 Self {
56 elems: Vec::with_capacity(capacity),
57 unused: PhantomData,
58 }
59 }
60
61 pub fn try_with_capacity(capacity: usize) -> Result<Self, OutOfMemory> {
63 let mut map = Self::new();
64 map.try_reserve(capacity)?;
65 Ok(map)
66 }
67
68 pub fn is_valid(&self, k: K) -> bool {
70 k.index() < self.elems.len()
71 }
72
73 pub fn get(&self, k: K) -> Option<&V> {
75 self.elems.get(k.index())
76 }
77
78 pub fn get_range(&self, range: core::ops::Range<K>) -> Option<&[V]> {
80 self.elems.get(range.start.index()..range.end.index())
81 }
82
83 pub fn get_mut(&mut self, k: K) -> Option<&mut V> {
85 self.elems.get_mut(k.index())
86 }
87
88 pub fn is_empty(&self) -> bool {
90 self.elems.is_empty()
91 }
92
93 pub fn len(&self) -> usize {
95 self.elems.len()
96 }
97
98 pub fn keys(&self) -> Keys<K> {
100 Keys::with_len(self.elems.len())
101 }
102
103 pub fn values(&self) -> slice::Iter<'_, V> {
105 self.elems.iter()
106 }
107
108 pub fn values_mut(&mut self) -> slice::IterMut<'_, V> {
110 self.elems.iter_mut()
111 }
112
113 pub fn as_values_slice(&self) -> &[V] {
115 &self.elems
116 }
117
118 pub fn iter(&self) -> Iter<'_, K, V> {
120 Iter::new(self.elems.iter())
121 }
122
123 pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
125 IterMut::new(self.elems.iter_mut())
126 }
127
128 pub fn clear(&mut self) {
130 self.elems.clear()
131 }
132
133 pub fn next_key(&self) -> K {
135 K::new(self.elems.len())
136 }
137
138 pub fn push(&mut self, v: V) -> K {
140 let k = self.next_key();
141 self.elems.push(v);
142 k
143 }
144
145 pub fn last(&self) -> Option<(K, &V)> {
147 let len = self.elems.len();
148 let last = self.elems.last()?;
149 Some((K::new(len - 1), last))
150 }
151
152 pub fn last_mut(&mut self) -> Option<(K, &mut V)> {
154 let len = self.elems.len();
155 let last = self.elems.last_mut()?;
156 Some((K::new(len - 1), last))
157 }
158
159 pub fn reserve(&mut self, additional: usize) {
161 self.elems.reserve(additional)
162 }
163
164 pub fn try_reserve(&mut self, additional: usize) -> Result<(), OutOfMemory> {
166 self.elems
167 .try_reserve(additional)
168 .map_err(|_| OutOfMemory::new(self.len().saturating_add(additional)))
169 }
170
171 pub fn reserve_exact(&mut self, additional: usize) {
173 self.elems.reserve_exact(additional)
174 }
175
176 pub fn try_reserve_exact(&mut self, additional: usize) -> Result<(), OutOfMemory> {
178 self.elems
179 .try_reserve_exact(additional)
180 .map_err(|_| OutOfMemory::new(self.len().saturating_add(additional)))
181 }
182
183 pub fn shrink_to_fit(&mut self) {
185 self.elems.shrink_to_fit()
186 }
187
188 pub fn into_boxed_slice(self) -> BoxedSlice<K, V> {
190 unsafe { BoxedSlice::<K, V>::from_raw(Box::<[V]>::into_raw(self.elems.into_boxed_slice())) }
191 }
192
193 pub fn get_disjoint_mut<const N: usize>(
198 &mut self,
199 indices: [K; N],
200 ) -> Result<[&mut V; N], slice::GetDisjointMutError> {
201 self.elems.get_disjoint_mut(indices.map(|k| k.index()))
202 }
203
204 pub fn binary_search_values_by_key<'a, B, F>(&'a self, b: &B, f: F) -> Result<K, K>
216 where
217 F: FnMut(&'a V) -> B,
218 B: Ord,
219 {
220 self.elems
221 .binary_search_by_key(b, f)
222 .map(|i| K::new(i))
223 .map_err(|i| K::new(i))
224 }
225
226 pub fn get_raw_mut(&mut self, k: K) -> Option<*mut V> {
235 if k.index() < self.elems.len() {
236 unsafe { Some(self.elems.as_mut_ptr().add(k.index())) }
240 } else {
241 None
242 }
243 }
244}
245
246impl<K, V> Default for PrimaryMap<K, V>
247where
248 K: EntityRef,
249{
250 fn default() -> PrimaryMap<K, V> {
251 PrimaryMap::new()
252 }
253}
254
255impl<K, V> Index<K> for PrimaryMap<K, V>
258where
259 K: EntityRef,
260{
261 type Output = V;
262
263 fn index(&self, k: K) -> &V {
264 &self.elems[k.index()]
265 }
266}
267
268impl<K, V> IndexMut<K> for PrimaryMap<K, V>
270where
271 K: EntityRef,
272{
273 fn index_mut(&mut self, k: K) -> &mut V {
274 &mut self.elems[k.index()]
275 }
276}
277
278impl<K, V> IntoIterator for PrimaryMap<K, V>
279where
280 K: EntityRef,
281{
282 type Item = (K, V);
283 type IntoIter = IntoIter<K, V>;
284
285 fn into_iter(self) -> Self::IntoIter {
286 IntoIter::new(self.elems.into_iter())
287 }
288}
289
290impl<'a, K, V> IntoIterator for &'a PrimaryMap<K, V>
291where
292 K: EntityRef,
293{
294 type Item = (K, &'a V);
295 type IntoIter = Iter<'a, K, V>;
296
297 fn into_iter(self) -> Self::IntoIter {
298 Iter::new(self.elems.iter())
299 }
300}
301
302impl<'a, K, V> IntoIterator for &'a mut PrimaryMap<K, V>
303where
304 K: EntityRef,
305{
306 type Item = (K, &'a mut V);
307 type IntoIter = IterMut<'a, K, V>;
308
309 fn into_iter(self) -> Self::IntoIter {
310 IterMut::new(self.elems.iter_mut())
311 }
312}
313
314impl<K, V> FromIterator<V> for PrimaryMap<K, V>
315where
316 K: EntityRef,
317{
318 fn from_iter<T>(iter: T) -> Self
319 where
320 T: IntoIterator<Item = V>,
321 {
322 Self {
323 elems: Vec::from_iter(iter),
324 unused: PhantomData,
325 }
326 }
327}
328
329impl<K, V> Extend<V> for PrimaryMap<K, V>
330where
331 K: EntityRef,
332{
333 fn extend<T>(&mut self, iter: T)
334 where
335 T: IntoIterator<Item = V>,
336 {
337 self.elems.extend(iter);
338 }
339}
340
341impl<K, V> From<Vec<V>> for PrimaryMap<K, V>
342where
343 K: EntityRef,
344{
345 fn from(elems: Vec<V>) -> Self {
346 Self {
347 elems,
348 unused: PhantomData,
349 }
350 }
351}
352
353impl<K, V> From<PrimaryMap<K, V>> for Vec<V>
354where
355 K: EntityRef,
356{
357 fn from(map: PrimaryMap<K, V>) -> Self {
358 map.elems
359 }
360}
361
362impl<K: EntityRef + fmt::Debug, V: fmt::Debug> fmt::Debug for PrimaryMap<K, V> {
363 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
364 let mut struct_ = f.debug_struct("PrimaryMap");
365 for (k, v) in self {
366 struct_.field(&alloc::format!("{k:?}"), v);
367 }
368 struct_.finish()
369 }
370}
371
372#[cfg(test)]
373mod tests {
374 use super::*;
375
376 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
378 struct E(u32);
379
380 impl EntityRef for E {
381 fn new(i: usize) -> Self {
382 E(i as u32)
383 }
384 fn index(self) -> usize {
385 self.0 as usize
386 }
387 }
388
389 #[test]
390 fn basic() {
391 let r0 = E(0);
392 let r1 = E(1);
393 let m = PrimaryMap::<E, isize>::new();
394
395 let v: Vec<E> = m.keys().collect();
396 assert_eq!(v, []);
397
398 assert!(!m.is_valid(r0));
399 assert!(!m.is_valid(r1));
400 }
401
402 #[test]
403 fn push() {
404 let mut m = PrimaryMap::new();
405 let k0: E = m.push(12);
406 let k1 = m.push(33);
407
408 assert_eq!(m[k0], 12);
409 assert_eq!(m[k1], 33);
410
411 let v: Vec<E> = m.keys().collect();
412 assert_eq!(v, [k0, k1]);
413 }
414
415 #[test]
416 fn iter() {
417 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
418 m.push(12);
419 m.push(33);
420
421 let mut i = 0;
422 for (key, value) in &m {
423 assert_eq!(key.index(), i);
424 match i {
425 0 => assert_eq!(*value, 12),
426 1 => assert_eq!(*value, 33),
427 _ => panic!(),
428 }
429 i += 1;
430 }
431 i = 0;
432 for (key_mut, value_mut) in m.iter_mut() {
433 assert_eq!(key_mut.index(), i);
434 match i {
435 0 => assert_eq!(*value_mut, 12),
436 1 => assert_eq!(*value_mut, 33),
437 _ => panic!(),
438 }
439 i += 1;
440 }
441 }
442
443 #[test]
444 fn iter_rev() {
445 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
446 m.push(12);
447 m.push(33);
448
449 let mut i = 2;
450 for (key, value) in m.iter().rev() {
451 i -= 1;
452 assert_eq!(key.index(), i);
453 match i {
454 0 => assert_eq!(*value, 12),
455 1 => assert_eq!(*value, 33),
456 _ => panic!(),
457 }
458 }
459
460 i = 2;
461 for (key, value) in m.iter_mut().rev() {
462 i -= 1;
463 assert_eq!(key.index(), i);
464 match i {
465 0 => assert_eq!(*value, 12),
466 1 => assert_eq!(*value, 33),
467 _ => panic!(),
468 }
469 }
470 }
471 #[test]
472 fn keys() {
473 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
474 m.push(12);
475 m.push(33);
476
477 let mut i = 0;
478 for key in m.keys() {
479 assert_eq!(key.index(), i);
480 i += 1;
481 }
482 }
483
484 #[test]
485 fn keys_rev() {
486 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
487 m.push(12);
488 m.push(33);
489
490 let mut i = 2;
491 for key in m.keys().rev() {
492 i -= 1;
493 assert_eq!(key.index(), i);
494 }
495 }
496
497 #[test]
498 fn values() {
499 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
500 m.push(12);
501 m.push(33);
502
503 let mut i = 0;
504 for value in m.values() {
505 match i {
506 0 => assert_eq!(*value, 12),
507 1 => assert_eq!(*value, 33),
508 _ => panic!(),
509 }
510 i += 1;
511 }
512 i = 0;
513 for value_mut in m.values_mut() {
514 match i {
515 0 => assert_eq!(*value_mut, 12),
516 1 => assert_eq!(*value_mut, 33),
517 _ => panic!(),
518 }
519 i += 1;
520 }
521 }
522
523 #[test]
524 fn values_rev() {
525 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
526 m.push(12);
527 m.push(33);
528
529 let mut i = 2;
530 for value in m.values().rev() {
531 i -= 1;
532 match i {
533 0 => assert_eq!(*value, 12),
534 1 => assert_eq!(*value, 33),
535 _ => panic!(),
536 }
537 }
538 i = 2;
539 for value_mut in m.values_mut().rev() {
540 i -= 1;
541 match i {
542 0 => assert_eq!(*value_mut, 12),
543 1 => assert_eq!(*value_mut, 33),
544 _ => panic!(),
545 }
546 }
547 }
548
549 #[test]
550 fn from_iter() {
551 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
552 m.push(12);
553 m.push(33);
554
555 let n = m.values().collect::<PrimaryMap<E, _>>();
556 assert!(m.len() == n.len());
557 for (me, ne) in m.values().zip(n.values()) {
558 assert!(*me == **ne);
559 }
560 }
561
562 #[test]
563 fn from_vec() {
564 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
565 m.push(12);
566 m.push(33);
567
568 let n = PrimaryMap::<E, &usize>::from(m.values().collect::<Vec<_>>());
569 assert!(m.len() == n.len());
570 for (me, ne) in m.values().zip(n.values()) {
571 assert!(*me == **ne);
572 }
573 }
574
575 #[test]
576 fn get_many_mut() {
577 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
578 let _0 = m.push(0);
579 let _1 = m.push(1);
580 let _2 = m.push(2);
581
582 assert_eq!([&mut 0, &mut 2], m.get_disjoint_mut([_0, _2]).unwrap());
583 assert_eq!(
584 m.get_disjoint_mut([_0, _0]),
585 Err(slice::GetDisjointMutError::OverlappingIndices)
586 );
587 assert_eq!(
588 m.get_disjoint_mut([E(4)]),
589 Err(slice::GetDisjointMutError::IndexOutOfBounds)
590 );
591 }
592}