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::mem;
11use core::ops::{Index, IndexMut};
12use core::slice;
13#[cfg(feature = "enable-serde")]
14use serde_derive::{Deserialize, Serialize};
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 is_valid(&self, k: K) -> bool {
63 k.index() < self.elems.len()
64 }
65
66 pub fn get(&self, k: K) -> Option<&V> {
68 self.elems.get(k.index())
69 }
70
71 pub fn get_mut(&mut self, k: K) -> Option<&mut V> {
73 self.elems.get_mut(k.index())
74 }
75
76 pub fn is_empty(&self) -> bool {
78 self.elems.is_empty()
79 }
80
81 pub fn len(&self) -> usize {
83 self.elems.len()
84 }
85
86 pub fn keys(&self) -> Keys<K> {
88 Keys::with_len(self.elems.len())
89 }
90
91 pub fn values(&self) -> slice::Iter<'_, V> {
93 self.elems.iter()
94 }
95
96 pub fn values_mut(&mut self) -> slice::IterMut<'_, V> {
98 self.elems.iter_mut()
99 }
100
101 pub fn iter(&self) -> Iter<'_, K, V> {
103 Iter::new(self.elems.iter())
104 }
105
106 pub fn iter_mut(&mut self) -> IterMut<'_, K, V> {
108 IterMut::new(self.elems.iter_mut())
109 }
110
111 pub fn clear(&mut self) {
113 self.elems.clear()
114 }
115
116 pub fn next_key(&self) -> K {
118 K::new(self.elems.len())
119 }
120
121 pub fn push(&mut self, v: V) -> K {
123 let k = self.next_key();
124 self.elems.push(v);
125 k
126 }
127
128 pub fn last(&self) -> Option<(K, &V)> {
130 let len = self.elems.len();
131 let last = self.elems.last()?;
132 Some((K::new(len - 1), last))
133 }
134
135 pub fn last_mut(&mut self) -> Option<(K, &mut V)> {
137 let len = self.elems.len();
138 let last = self.elems.last_mut()?;
139 Some((K::new(len - 1), last))
140 }
141
142 pub fn reserve(&mut self, additional: usize) {
144 self.elems.reserve(additional)
145 }
146
147 pub fn reserve_exact(&mut self, additional: usize) {
149 self.elems.reserve_exact(additional)
150 }
151
152 pub fn shrink_to_fit(&mut self) {
154 self.elems.shrink_to_fit()
155 }
156
157 pub fn into_boxed_slice(self) -> BoxedSlice<K, V> {
159 unsafe { BoxedSlice::<K, V>::from_raw(Box::<[V]>::into_raw(self.elems.into_boxed_slice())) }
160 }
161
162 pub fn get_many_mut<const N: usize>(
170 &mut self,
171 indices: [K; N],
172 ) -> Result<[&mut V; N], GetManyMutError<K>> {
173 for (i, &idx) in indices.iter().enumerate() {
174 if idx.index() >= self.len() {
175 return Err(GetManyMutError::DoesNotExist(idx));
176 }
177 for &idx2 in &indices[..i] {
178 if idx == idx2 {
179 return Err(GetManyMutError::MultipleOf(idx));
180 }
181 }
182 }
183
184 let slice: *mut V = self.elems.as_mut_ptr();
185 let mut arr: mem::MaybeUninit<[&mut V; N]> = mem::MaybeUninit::uninit();
186 let arr_ptr = arr.as_mut_ptr();
187
188 unsafe {
189 for i in 0..N {
190 let idx = *indices.get_unchecked(i);
191 *(*arr_ptr).get_unchecked_mut(i) = &mut *slice.add(idx.index());
192 }
193 Ok(arr.assume_init())
194 }
195 }
196
197 pub fn binary_search_values_by_key<'a, B, F>(&'a self, b: &B, f: F) -> Result<K, K>
209 where
210 F: FnMut(&'a V) -> B,
211 B: Ord,
212 {
213 self.elems
214 .binary_search_by_key(b, f)
215 .map(|i| K::new(i))
216 .map_err(|i| K::new(i))
217 }
218
219 pub fn get_raw_mut(&mut self, k: K) -> Option<*mut V> {
228 if k.index() < self.elems.len() {
229 unsafe { Some(self.elems.as_mut_ptr().add(k.index())) }
233 } else {
234 None
235 }
236 }
237}
238
239#[derive(Debug, PartialEq, Eq, Clone, Copy)]
240pub enum GetManyMutError<K> {
241 DoesNotExist(K),
242 MultipleOf(K),
243}
244
245impl<K, V> Default for PrimaryMap<K, V>
246where
247 K: EntityRef,
248{
249 fn default() -> PrimaryMap<K, V> {
250 PrimaryMap::new()
251 }
252}
253
254impl<K, V> Index<K> for PrimaryMap<K, V>
257where
258 K: EntityRef,
259{
260 type Output = V;
261
262 fn index(&self, k: K) -> &V {
263 &self.elems[k.index()]
264 }
265}
266
267impl<K, V> IndexMut<K> for PrimaryMap<K, V>
269where
270 K: EntityRef,
271{
272 fn index_mut(&mut self, k: K) -> &mut V {
273 &mut self.elems[k.index()]
274 }
275}
276
277impl<K, V> IntoIterator for PrimaryMap<K, V>
278where
279 K: EntityRef,
280{
281 type Item = (K, V);
282 type IntoIter = IntoIter<K, V>;
283
284 fn into_iter(self) -> Self::IntoIter {
285 IntoIter::new(self.elems.into_iter())
286 }
287}
288
289impl<'a, K, V> IntoIterator for &'a PrimaryMap<K, V>
290where
291 K: EntityRef,
292{
293 type Item = (K, &'a V);
294 type IntoIter = Iter<'a, K, V>;
295
296 fn into_iter(self) -> Self::IntoIter {
297 Iter::new(self.elems.iter())
298 }
299}
300
301impl<'a, K, V> IntoIterator for &'a mut PrimaryMap<K, V>
302where
303 K: EntityRef,
304{
305 type Item = (K, &'a mut V);
306 type IntoIter = IterMut<'a, K, V>;
307
308 fn into_iter(self) -> Self::IntoIter {
309 IterMut::new(self.elems.iter_mut())
310 }
311}
312
313impl<K, V> FromIterator<V> for PrimaryMap<K, V>
314where
315 K: EntityRef,
316{
317 fn from_iter<T>(iter: T) -> Self
318 where
319 T: IntoIterator<Item = V>,
320 {
321 Self {
322 elems: Vec::from_iter(iter),
323 unused: PhantomData,
324 }
325 }
326}
327
328impl<K, V> From<Vec<V>> for PrimaryMap<K, V>
329where
330 K: EntityRef,
331{
332 fn from(elems: Vec<V>) -> Self {
333 Self {
334 elems,
335 unused: PhantomData,
336 }
337 }
338}
339
340impl<K: EntityRef + fmt::Debug, V: fmt::Debug> fmt::Debug for PrimaryMap<K, V> {
341 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
342 let mut struct_ = f.debug_struct("PrimaryMap");
343 for (k, v) in self {
344 struct_.field(&alloc::format!("{k:?}"), v);
345 }
346 struct_.finish()
347 }
348}
349
350#[cfg(test)]
351mod tests {
352 use super::*;
353
354 #[derive(Clone, Copy, Debug, PartialEq, Eq)]
356 struct E(u32);
357
358 impl EntityRef for E {
359 fn new(i: usize) -> Self {
360 E(i as u32)
361 }
362 fn index(self) -> usize {
363 self.0 as usize
364 }
365 }
366
367 #[test]
368 fn basic() {
369 let r0 = E(0);
370 let r1 = E(1);
371 let m = PrimaryMap::<E, isize>::new();
372
373 let v: Vec<E> = m.keys().collect();
374 assert_eq!(v, []);
375
376 assert!(!m.is_valid(r0));
377 assert!(!m.is_valid(r1));
378 }
379
380 #[test]
381 fn push() {
382 let mut m = PrimaryMap::new();
383 let k0: E = m.push(12);
384 let k1 = m.push(33);
385
386 assert_eq!(m[k0], 12);
387 assert_eq!(m[k1], 33);
388
389 let v: Vec<E> = m.keys().collect();
390 assert_eq!(v, [k0, k1]);
391 }
392
393 #[test]
394 fn iter() {
395 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
396 m.push(12);
397 m.push(33);
398
399 let mut i = 0;
400 for (key, value) in &m {
401 assert_eq!(key.index(), i);
402 match i {
403 0 => assert_eq!(*value, 12),
404 1 => assert_eq!(*value, 33),
405 _ => panic!(),
406 }
407 i += 1;
408 }
409 i = 0;
410 for (key_mut, value_mut) in m.iter_mut() {
411 assert_eq!(key_mut.index(), i);
412 match i {
413 0 => assert_eq!(*value_mut, 12),
414 1 => assert_eq!(*value_mut, 33),
415 _ => panic!(),
416 }
417 i += 1;
418 }
419 }
420
421 #[test]
422 fn iter_rev() {
423 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
424 m.push(12);
425 m.push(33);
426
427 let mut i = 2;
428 for (key, value) in m.iter().rev() {
429 i -= 1;
430 assert_eq!(key.index(), i);
431 match i {
432 0 => assert_eq!(*value, 12),
433 1 => assert_eq!(*value, 33),
434 _ => panic!(),
435 }
436 }
437
438 i = 2;
439 for (key, value) in m.iter_mut().rev() {
440 i -= 1;
441 assert_eq!(key.index(), i);
442 match i {
443 0 => assert_eq!(*value, 12),
444 1 => assert_eq!(*value, 33),
445 _ => panic!(),
446 }
447 }
448 }
449 #[test]
450 fn keys() {
451 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
452 m.push(12);
453 m.push(33);
454
455 let mut i = 0;
456 for key in m.keys() {
457 assert_eq!(key.index(), i);
458 i += 1;
459 }
460 }
461
462 #[test]
463 fn keys_rev() {
464 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
465 m.push(12);
466 m.push(33);
467
468 let mut i = 2;
469 for key in m.keys().rev() {
470 i -= 1;
471 assert_eq!(key.index(), i);
472 }
473 }
474
475 #[test]
476 fn values() {
477 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
478 m.push(12);
479 m.push(33);
480
481 let mut i = 0;
482 for value in m.values() {
483 match i {
484 0 => assert_eq!(*value, 12),
485 1 => assert_eq!(*value, 33),
486 _ => panic!(),
487 }
488 i += 1;
489 }
490 i = 0;
491 for value_mut in m.values_mut() {
492 match i {
493 0 => assert_eq!(*value_mut, 12),
494 1 => assert_eq!(*value_mut, 33),
495 _ => panic!(),
496 }
497 i += 1;
498 }
499 }
500
501 #[test]
502 fn values_rev() {
503 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
504 m.push(12);
505 m.push(33);
506
507 let mut i = 2;
508 for value in m.values().rev() {
509 i -= 1;
510 match i {
511 0 => assert_eq!(*value, 12),
512 1 => assert_eq!(*value, 33),
513 _ => panic!(),
514 }
515 }
516 i = 2;
517 for value_mut in m.values_mut().rev() {
518 i -= 1;
519 match i {
520 0 => assert_eq!(*value_mut, 12),
521 1 => assert_eq!(*value_mut, 33),
522 _ => panic!(),
523 }
524 }
525 }
526
527 #[test]
528 fn from_iter() {
529 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
530 m.push(12);
531 m.push(33);
532
533 let n = m.values().collect::<PrimaryMap<E, _>>();
534 assert!(m.len() == n.len());
535 for (me, ne) in m.values().zip(n.values()) {
536 assert!(*me == **ne);
537 }
538 }
539
540 #[test]
541 fn from_vec() {
542 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
543 m.push(12);
544 m.push(33);
545
546 let n = PrimaryMap::<E, &usize>::from(m.values().collect::<Vec<_>>());
547 assert!(m.len() == n.len());
548 for (me, ne) in m.values().zip(n.values()) {
549 assert!(*me == **ne);
550 }
551 }
552
553 #[test]
554 fn get_many_mut() {
555 let mut m: PrimaryMap<E, usize> = PrimaryMap::new();
556 let _0 = m.push(0);
557 let _1 = m.push(1);
558 let _2 = m.push(2);
559
560 assert_eq!([&mut 0, &mut 2], m.get_many_mut([_0, _2]).unwrap());
561 assert_eq!(
562 m.get_many_mut([_0, _0]),
563 Err(GetManyMutError::MultipleOf(_0))
564 );
565 assert_eq!(
566 m.get_many_mut([E(4)]),
567 Err(GetManyMutError::DoesNotExist(E(4)))
568 );
569 }
570}