1use core::{cmp::Ordering, marker::PhantomData};
12
13#[cfg(all(feature = "alloc", not(feature = "std")))]
14use alloc::vec::Vec;
15#[cfg(feature = "std")]
16use std::vec::Vec;
17
18use crate::{Error, Incrementable};
19
20#[derive(Clone, Debug, Hash, PartialEq, Eq, PartialOrd, Ord)]
98#[allow(clippy::module_name_repetitions)]
99pub struct UnmanagedGenVec<T, G = usize, I = usize, GenIndex = (I, G)> {
100 inner: Vec<(G, T)>,
101 index_ty: PhantomData<I>,
102 gen_index_ty: PhantomData<GenIndex>,
103}
104
105impl<T, G, I, GenIndex> UnmanagedGenVec<T, G, I, GenIndex> {
106 #[must_use]
110 pub fn new() -> Self {
111 Self {
112 inner: Vec::new(),
113 index_ty: PhantomData,
114 gen_index_ty: PhantomData,
115 }
116 }
117
118 #[must_use]
122 pub fn with_capacity(capacity: usize) -> Self {
123 Self {
124 inner: Vec::with_capacity(capacity),
125 index_ty: PhantomData,
126 gen_index_ty: PhantomData,
127 }
128 }
129
130 #[must_use]
134 #[inline]
135 pub fn len(&self) -> usize {
136 self.inner.len()
137 }
138
139 #[must_use]
143 #[inline]
144 pub fn is_empty(&self) -> bool {
145 self.inner.is_empty()
146 }
147
148 #[must_use]
152 #[inline]
153 pub fn capacity(&self) -> usize {
154 self.inner.capacity()
155 }
156
157 #[inline]
161 pub fn reserve(&mut self, additional: usize) {
162 self.inner.reserve(additional);
163 }
164
165 #[inline]
169 pub fn reserve_exact(&mut self, additional: usize) {
170 self.inner.reserve_exact(additional);
171 }
172}
173
174impl<T, G, I, GenIndex> Default for UnmanagedGenVec<T, G, I, GenIndex> {
175 fn default() -> Self {
176 Self {
177 inner: Vec::default(),
178 index_ty: PhantomData,
179 gen_index_ty: PhantomData,
180 }
181 }
182}
183
184impl<T, G, I, GenIndex> UnmanagedGenVec<T, G, I, GenIndex> {
185 #[inline]
189 pub fn push(&mut self, value: T)
190 where
191 G: Default,
192 {
193 self.inner.push((G::default(), value));
194 }
195
196 #[inline]
200 pub fn push_with_gen(&mut self, generation: G, value: T) {
201 self.inner.push((generation, value));
202 }
203
204 #[must_use]
206 #[inline]
207 pub fn contains_index(&self, gen_index: GenIndex) -> bool
208 where
209 GenIndex: Into<(I, G)>,
210 I: Into<usize>,
211 G: PartialEq,
212 {
213 self.get(gen_index).is_ok()
214 }
215
216 pub fn get(&self, gen_index: GenIndex) -> Result<&T, Error>
227 where
228 GenIndex: Into<(I, G)>,
229 I: Into<usize>,
230 G: PartialEq,
231 {
232 let gen_index = gen_index.into();
233 self.inner
234 .get(gen_index.0.into())
235 .ok_or_else(Error::index_out_of_bounds)
236 .map(|(gen, elem)| {
237 if gen_index.1 == *gen {
238 Some(elem)
239 } else {
240 None
241 }
242 })?
243 .ok_or_else(Error::not_equal_generation)
244 }
245
246 pub fn get_mut(&mut self, gen_index: GenIndex) -> Result<&mut T, Error>
257 where
258 GenIndex: Into<(I, G)>,
259 I: Into<usize>,
260 G: PartialEq,
261 {
262 let gen_index = gen_index.into();
263 let elem = self
264 .inner
265 .get_mut(gen_index.0.into())
266 .ok_or_else(Error::index_out_of_bounds)?;
267 if elem.0 == gen_index.1 {
268 Ok(&mut elem.1)
269 } else {
270 Err(Error::not_equal_generation())
271 }
272 }
273
274 #[inline]
282 #[must_use]
283 pub unsafe fn get_unchecked(&self, index: usize) -> &T {
284 &self.inner.get_unchecked(index).1
285 }
286
287 #[inline]
295 #[must_use]
296 pub unsafe fn get_unchecked_mut(&mut self, index: usize) -> &mut T {
297 &mut self.inner.get_unchecked_mut(index).1
298 }
299
300 #[inline]
304 pub fn get_gen(&self, index: I) -> Option<&G>
305 where
306 I: Into<usize>,
307 {
308 self.inner.get(index.into()).map(|(gen, _value)| gen)
309 }
310
311 fn internal_set(&mut self, index: usize, generation: G, value: T) -> Result<(G, T), Error>
312 where
313 G: PartialOrd,
314 {
315 let elem = self
316 .inner
317 .get_mut(index)
318 .ok_or_else(Error::index_out_of_bounds)?;
319 if elem.0 == generation {
320 let prev_value = core::mem::replace(elem, (generation, value));
321 Ok(prev_value)
322 } else {
323 assert!(
324 generation < elem.0,
325 "generation is greater than generation associated with element"
326 );
327 Err(Error::less_than_existing_generation())
328 }
329 }
330
331 #[inline]
349 pub fn set(&mut self, gen_index: GenIndex, value: T) -> Result<(G, T), Error>
350 where
351 GenIndex: Into<(I, G)>,
352 G: PartialOrd,
353 I: Into<usize>,
354 {
355 let gen_index = gen_index.into();
356 self.internal_set(gen_index.0.into(), gen_index.1, value)
357 }
358
359 pub fn set_or_push(&mut self, gen_index: GenIndex, value: T) -> Result<Option<(G, T)>, Error>
384 where
385 GenIndex: Into<(I, G)>,
386 G: PartialOrd,
387 I: Into<usize>,
388 {
389 let (index, generation) = gen_index.into();
390 let index = index.into();
391
392 match index.cmp(&self.len()) {
393 Ordering::Less => self.internal_set(index, generation, value).map(Some),
394 Ordering::Equal => {
395 debug_assert_eq!(index, self.len());
396 self.push_with_gen(generation, value);
397 Ok(None)
398 }
399 Ordering::Greater => Err(Error::index_out_of_bounds()),
400 }
401 }
402
403 pub fn set_next_gen(&mut self, gen_index: GenIndex) -> Result<G, Error>
422 where
423 GenIndex: Into<(I, G)>,
424 G: PartialOrd + Incrementable,
425 I: Into<usize>,
426 {
427 let (index, generation) = gen_index.into();
428 let elem = self
429 .inner
430 .get_mut(index.into())
431 .ok_or_else(Error::index_out_of_bounds)?;
432 if elem.0 < generation {
433 assert!(
434 elem.0.next().as_ref() == Some(&generation),
435 "generation is not the next generation of the current element"
436 );
437 let prev_value = core::mem::replace(&mut elem.0, generation);
438 Ok(prev_value)
439 } else if elem.0 == generation {
440 Err(Error::already_equal_generation())
441 } else {
442 Err(Error::less_than_existing_generation())
443 }
444 }
445
446 pub fn set_gen(&mut self, gen_index: GenIndex) -> Result<G, Error>
462 where
463 GenIndex: Into<(I, G)>,
464 I: Into<usize>,
465 {
466 let (index, generation) = gen_index.into();
467 let elem = self
468 .inner
469 .get_mut(index.into())
470 .ok_or_else(Error::index_out_of_bounds)?;
471 let prev_value = core::mem::replace(&mut elem.0, generation);
472 Ok(prev_value)
473 }
474}
475
476impl<T, G, I, GenIndex> core::ops::Index<GenIndex> for UnmanagedGenVec<T, G, I, GenIndex>
477where
478 I: Into<usize>,
479 GenIndex: Into<(I, G)>,
480 G: PartialEq,
481{
482 type Output = T;
483
484 fn index(&self, gen_index: GenIndex) -> &Self::Output {
485 let gen_index = gen_index.into();
486 let idx = gen_index.0.into();
487 let (cur_gen, elem) = &self.inner[idx];
488 let expected_gen = gen_index.1;
489 if expected_gen == *cur_gen {
490 elem
491 } else {
492 panic!("generation is not equal");
493 }
494 }
495}
496
497impl<T, G, I, GenIndex> core::ops::IndexMut<GenIndex> for UnmanagedGenVec<T, G, I, GenIndex>
498where
499 I: Into<usize>,
500 GenIndex: Into<(I, G)>,
501 G: PartialEq,
502{
503 fn index_mut(&mut self, gen_index: GenIndex) -> &mut Self::Output {
504 let gen_index = gen_index.into();
505 let idx = gen_index.0.into();
506 let (cur_gen, elem) = &mut self.inner[idx];
507 let expected_gen = gen_index.1;
508 if expected_gen == *cur_gen {
509 elem
510 } else {
511 panic!("generation is not equal");
512 }
513 }
514}
515
516#[cfg(test)]
517mod tests {
518 use super::*;
519
520 #[derive(Debug, PartialEq)]
521 struct Value<T>(T);
522
523 impl<T> Value<T> {
524 fn set(&mut self, value: T) {
525 self.0 = value;
526 }
527 }
528
529 #[test]
530 fn test_contains_index_out_of_bounds() {
531 let gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
532 assert!(!gen_vec.contains_index((0, 0)));
533 }
534
535 #[test]
536 fn test_contains_index_generation_less_than_existing() {
537 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
538 gen_vec.push_with_gen(1, Value(0));
539 assert!(!gen_vec.contains_index((0, 0)));
540 }
541
542 #[test]
543 fn test_contains_index_generation_greater_than_existing() {
544 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
545 gen_vec.push_with_gen(1, Value(0));
546 assert!(!gen_vec.contains_index((2, 0)));
547 }
548
549 #[test]
550 fn test_get_index_out_of_bounds() {
551 let gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
552 let err = gen_vec.get((0, 0)).unwrap_err();
553 assert!(err.is_index_out_of_bounds());
554 }
555
556 #[test]
557 fn test_get_generation_less_than_existing() {
558 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
559 gen_vec.push_with_gen(1, Value(0));
560
561 let err = gen_vec.get((0, 0)).unwrap_err();
562 assert!(err.is_not_equal_generation_error());
563 }
564
565 #[test]
566 fn test_get_generation_greater_than_existing() {
567 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
568 gen_vec.push_with_gen(1, Value(0));
569
570 let err = gen_vec.get((0, 2)).unwrap_err();
571 assert!(err.is_not_equal_generation_error());
572 }
573
574 #[test]
575 fn test_get_mut_index_out_of_bounds() {
576 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
577 let err = gen_vec.get_mut((0, 0)).unwrap_err();
578 assert!(err.is_index_out_of_bounds());
579 }
580
581 #[test]
582 fn test_get_mut_generation_less_than_existing() {
583 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
584 gen_vec.push_with_gen(1, Value(0));
585
586 let err = gen_vec.get_mut((0, 0)).unwrap_err();
587 assert!(err.is_not_equal_generation_error());
588 }
589
590 #[test]
591 fn test_get_mut_generation_greater_than_existing() {
592 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
593 gen_vec.push_with_gen(1, Value(0));
594
595 let err = gen_vec.get_mut((0, 2)).unwrap_err();
596 assert!(err.is_not_equal_generation_error());
597 }
598
599 #[test]
600 fn test_get_gen_index_out_of_bounds() {
601 let gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
602
603 assert_eq!(gen_vec.get_gen(0), None);
604 }
605
606 #[test]
607 fn test_set_index_out_of_bounds() {
608 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
609 let err = gen_vec.set((0, 0), Value(1)).unwrap_err();
610 assert!(err.is_index_out_of_bounds());
611 }
612
613 #[test]
614 fn test_set_generation_less_than_existing() {
615 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
616 gen_vec.push_with_gen(1, Value(0));
617 let err = gen_vec.set((0, 0), Value(1)).unwrap_err();
618 assert!(err.is_generation_less_than_existing());
619 }
620
621 #[test]
622 #[should_panic(expected = "generation is greater than generation associated with element")]
623 fn test_set_generation_greater_than_existing() {
624 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
625 gen_vec.push_with_gen(0, Value(0));
626 gen_vec.set((0, 1), Value(1)).unwrap();
627 }
628
629 #[test]
630 fn test_set_or_push_index_out_of_bounds() {
631 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
632 let err = gen_vec.set_or_push((1, 0), Value(1)).unwrap_err();
633 assert!(err.is_index_out_of_bounds());
634 }
635
636 #[test]
637 fn test_set_or_push_generation_less_than_existing() {
638 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
639 gen_vec.push_with_gen(1, Value(0));
640 let err = gen_vec.set((0, 0), Value(1)).unwrap_err();
641 assert!(err.is_generation_less_than_existing());
642 }
643
644 #[test]
645 #[should_panic(expected = "generation is greater than generation associated with element")]
646 fn test_set_or_push_generation_greater_than_existing() {
647 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
648 gen_vec.push_with_gen(0, Value(0));
649 gen_vec.set((0, 1), Value(1)).unwrap();
650 }
651
652 #[test]
653 fn test_set_next_gen_index_out_of_bounds() {
654 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
655 let err = gen_vec.set_next_gen((0, 1)).unwrap_err();
656 assert!(err.is_index_out_of_bounds());
657 }
658
659 #[test]
660 fn test_set_next_gen_generation_already_equal() {
661 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
662 gen_vec.push_with_gen(1, Value(0));
663 let err = gen_vec.set_next_gen((0, 1)).unwrap_err();
664 assert!(err.is_already_equal_generation_error());
665 }
666
667 #[test]
668 fn test_set_next_gen_generation_less_than_existing() {
669 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
670 gen_vec.push_with_gen(2, Value(0));
671 let err = gen_vec.set_next_gen((0, 1)).unwrap_err();
672 assert!(err.is_generation_less_than_existing());
673 }
674
675 #[test]
676 #[should_panic(expected = "generation is not the next generation of the current element")]
677 fn test_set_next_gen_generation_greater_than_more_than_one_existing() {
678 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
679 gen_vec.push_with_gen(1, Value(0));
680 let _ = gen_vec.set_next_gen((0, 3));
681 }
682
683 #[test]
684 #[should_panic(expected = "index out of bounds")]
685 fn test_index_out_of_bounds_index() {
686 let gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
687 let _ = gen_vec[(0, 0)];
688 }
689
690 #[test]
691 #[should_panic(expected = "generation is not equal")]
692 fn test_index_generation_less_than_existing() {
693 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
694 gen_vec.push_with_gen(1, Value(0));
695 let _ = &gen_vec[(0, 0)];
696 }
697
698 #[test]
699 #[should_panic(expected = "generation is not equal")]
700 fn test_index_generation_greater_than_existing() {
701 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
702 gen_vec.push_with_gen(0, Value(0));
703 let _ = &gen_vec[(0, 1)];
704 }
705
706 #[test]
707 #[should_panic(expected = "index out of bounds")]
708 fn test_index_mut_out_of_bounds_index() {
709 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
710 let _ = &mut gen_vec[(0, 0)];
711 }
712
713 #[test]
714 #[should_panic(expected = "generation is not equal")]
715 fn test_index_mut_generation_less_than_existing() {
716 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
717 gen_vec.push_with_gen(1, Value(0));
718 let _ = &mut gen_vec[(0, 0)];
719 }
720
721 #[test]
722 #[should_panic(expected = "generation is not equal")]
723 fn test_index_mut_generation_greater_than_existing() {
724 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
725 gen_vec.push_with_gen(0, Value(0));
726 let _ = &mut gen_vec[(0, 1)];
727 }
728
729 #[test]
730 fn test_index_mut() {
731 let mut gen_vec = UnmanagedGenVec::<Value<u32>, u8>::default();
732
733 let index = gen_vec.len();
734 assert_eq!(index, 0);
735 let generation = 0;
736 gen_vec.push_with_gen(generation, Value(0));
737 assert_eq!(gen_vec[(index, generation)], Value(0));
738
739 let value = &mut gen_vec[(index, generation)];
740 value.set(9);
741 assert_eq!(gen_vec[(index, generation)], Value(9));
742 }
743}