1use core::fmt;
26use core::mem::MaybeUninit;
27use core::ops::{Deref, DerefMut};
28use core::slice;
29
30pub struct ConstVec<T, const N: usize> {
32 data: [MaybeUninit<T>; N],
34 len: usize,
36}
37
38unsafe impl<T: Send, const N: usize> Send for ConstVec<T, N> {}
39unsafe impl<T: Send, const N: usize> Sync for ConstVec<T, N> {}
40
41impl<T, const N: usize> ConstVec<T, N> {
42 #[inline(always)]
53 pub fn new() -> Self {
54 let data = core::array::from_fn(|_| MaybeUninit::uninit());
57
58 Self { data, len: 0 }
59 }
60
61 #[inline(always)]
74 pub const fn len(&self) -> usize {
75 self.len
76 }
77
78 #[inline(always)]
91 pub const fn is_empty(&self) -> bool {
92 self.len == 0
93 }
94
95 #[inline(always)]
105 pub const fn capacity(&self) -> usize {
106 N
107 }
108
109 #[inline(always)]
123 pub const fn is_full(&self) -> bool {
124 self.len == N
125 }
126
127 #[inline]
145 pub fn push(&mut self, item: T) -> Result<(), T> {
146 if self.len < N {
147 self.data[self.len] = MaybeUninit::new(item);
149 self.len += 1;
150 Ok(())
151 } else {
152 Err(item)
153 }
154 }
155
156 #[inline]
173 pub fn pop(&mut self) -> Option<T> {
174 if self.len > 0 {
175 self.len -= 1;
176 let item = unsafe { self.data[self.len].assume_init_read() };
178 Some(item)
179 } else {
180 None
181 }
182 }
183
184 #[inline]
201 pub fn get(&self, index: usize) -> Option<&T> {
202 if index < self.len {
203 Some(unsafe { self.data[index].assume_init_ref() })
205 } else {
206 None
207 }
208 }
209
210 #[inline]
228 pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
229 if index < self.len {
230 Some(unsafe { self.data[index].assume_init_mut() })
232 } else {
233 None
234 }
235 }
236
237 #[inline]
273 pub fn insert(&mut self, index: usize, item: T) -> Option<T> {
274 if index > self.len {
275 return None;
277 }
278
279 if self.len < N {
280 for i in (index..self.len).rev() {
283 unsafe {
284 let src = self.data[i].as_ptr();
285 let dst = self.data[i + 1].as_mut_ptr();
286 core::ptr::copy_nonoverlapping(src, dst, 1);
287 }
288 }
289 self.data[index] = MaybeUninit::new(item);
291 self.len += 1;
292 None
293 } else {
294 let last_item = unsafe { self.data[N - 1].assume_init_read() };
297
298 for i in (index..N - 1).rev() {
300 unsafe {
301 let src = self.data[i].as_ptr();
302 let dst = self.data[i + 1].as_mut_ptr();
303 core::ptr::copy_nonoverlapping(src, dst, 1);
304 }
305 }
306
307 self.data[index] = MaybeUninit::new(item);
309
310 Some(last_item)
311 }
312 }
313
314 #[inline]
332 pub fn iter(&self) -> slice::Iter<'_, T> {
333 self.deref().iter()
334 }
335
336 #[inline]
356 pub fn iter_mut(&mut self) -> slice::IterMut<'_, T> {
357 self.deref_mut().iter_mut()
358 }
359}
360
361impl<T, const N: usize> Deref for ConstVec<T, N> {
362 type Target = [T];
363
364 #[inline]
365 fn deref(&self) -> &Self::Target {
366 unsafe { core::slice::from_raw_parts::<T>(self.data.as_ptr() as *const T, self.len) }
367 }
368}
369
370impl<T, const N: usize> DerefMut for ConstVec<T, N> {
371 #[inline]
372 fn deref_mut(&mut self) -> &mut Self::Target {
373 unsafe { core::slice::from_raw_parts_mut::<T>(self.data.as_mut_ptr() as *mut T, self.len) }
374 }
375}
376
377impl<'a, T, const N: usize> IntoIterator for &'a ConstVec<T, N> {
378 type Item = &'a T;
379 type IntoIter = slice::Iter<'a, T>;
380
381 #[inline]
382 fn into_iter(self) -> Self::IntoIter {
383 self.iter()
384 }
385}
386
387impl<'a, T, const N: usize> IntoIterator for &'a mut ConstVec<T, N> {
388 type Item = &'a mut T;
389 type IntoIter = slice::IterMut<'a, T>;
390
391 #[inline]
392 fn into_iter(self) -> Self::IntoIter {
393 self.iter_mut()
394 }
395}
396
397impl<T: fmt::Debug, const N: usize> fmt::Debug for ConstVec<T, N> {
398 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
399 f.debug_struct("ConstVec")
400 .field("len", &self.len)
401 .field("capacity", &N)
402 .field("data", &&self.data[..self.len])
403 .finish()
404 }
405}
406
407impl<T: Clone, const N: usize> Clone for ConstVec<T, N> {
408 fn clone(&self) -> Self {
409 let mut new_vec = Self::new();
410 for i in 0..self.len {
411 let item = unsafe { self.data[i].assume_init_ref() };
413 match new_vec.push(item.clone()) {
416 Ok(()) => {}
417 Err(_) => panic!("ConstVec clone failed: capacity exceeded"),
418 }
419 }
420 new_vec
421 }
422}
423
424impl<T: PartialEq, const N: usize> PartialEq for ConstVec<T, N> {
425 fn eq(&self, other: &Self) -> bool {
426 if self.len != other.len {
427 return false;
428 }
429 for i in 0..self.len {
430 let a = unsafe { self.data[i].assume_init_ref() };
432 let b = unsafe { other.data[i].assume_init_ref() };
433 if a != b {
434 return false;
435 }
436 }
437 true
438 }
439}
440
441impl<T: Eq, const N: usize> Eq for ConstVec<T, N> {}
442
443impl<T, const N: usize> Default for ConstVec<T, N> {
444 fn default() -> Self {
445 Self::new()
446 }
447}
448
449impl<T, const N: usize> core::ops::Index<usize> for ConstVec<T, N> {
450 type Output = T;
451
452 #[inline]
469 fn index(&self, index: usize) -> &Self::Output {
470 self.get(index).expect("index out of bounds")
471 }
472}
473
474impl<T, const N: usize> core::ops::IndexMut<usize> for ConstVec<T, N> {
475 #[inline]
492 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
493 self.get_mut(index).expect("index out of bounds")
494 }
495}
496
497impl<T, const N: usize> Drop for ConstVec<T, N> {
498 fn drop(&mut self) {
499 for i in 0..self.len {
501 unsafe {
502 self.data[i].assume_init_drop();
503 }
504 }
505 }
506}
507
508#[cfg(test)]
509mod tests {
510 use super::*;
511
512 #[test]
513 fn test_new() {
514 let vec: ConstVec<i32, 5> = ConstVec::new();
515 assert!(vec.is_empty());
516 assert_eq!(vec.len(), 0);
517 assert_eq!(vec.capacity(), 5);
518 assert!(!vec.is_full());
519 }
520
521 #[test]
522 fn test_push_pop() {
523 let mut vec: ConstVec<i32, 3> = ConstVec::new();
524
525 assert!(vec.push(1).is_ok());
526 assert!(vec.push(2).is_ok());
527 assert!(vec.push(3).is_ok());
528 assert!(vec.is_full());
529 assert_eq!(vec.len(), 3);
530
531 assert_eq!(vec.push(4), Err(4));
533 assert_eq!(vec.len(), 3);
534
535 assert_eq!(vec.pop(), Some(3));
537 assert_eq!(vec.pop(), Some(2));
538 assert_eq!(vec.pop(), Some(1));
539 assert_eq!(vec.pop(), None);
540 assert!(vec.is_empty());
541
542 assert!(vec.push(10).is_ok());
544 assert_eq!(vec.pop(), Some(10));
545 }
546
547 #[test]
548 fn test_get() {
549 let mut vec: ConstVec<i32, 5> = ConstVec::new();
550
551 vec.push(10).expect("push failed");
552 vec.push(20).expect("push failed");
553 vec.push(30).expect("push failed");
554
555 assert_eq!(vec.get(0), Some(&10));
556 assert_eq!(vec.get(1), Some(&20));
557 assert_eq!(vec.get(2), Some(&30));
558 assert_eq!(vec.get(3), None);
559 assert_eq!(vec.get(100), None);
560 }
561
562 #[test]
563 fn test_get_mut() {
564 let mut vec: ConstVec<i32, 5> = ConstVec::new();
565
566 vec.push(10).expect("push failed");
567 vec.push(20).expect("push failed");
568
569 if let Some(elem) = vec.get_mut(0) {
570 *elem = 100;
571 }
572
573 assert_eq!(vec.get(0), Some(&100));
574 assert_eq!(vec.get(1), Some(&20));
575 }
576
577 #[test]
578 fn test_is_full() {
579 let mut vec: ConstVec<i32, 2> = ConstVec::new();
580
581 assert!(!vec.is_full());
582 vec.push(1).expect("push failed");
583 assert!(!vec.is_full());
584 vec.push(2).expect("push failed");
585 assert!(vec.is_full());
586
587 vec.pop();
588 assert!(!vec.is_full());
589 }
590
591 #[test]
592 fn test_clone() {
593 let mut vec: ConstVec<i32, 5> = ConstVec::new();
594 vec.push(1).expect("push failed");
595 vec.push(2).expect("push failed");
596 vec.push(3).expect("push failed");
597
598 let cloned = vec.clone();
599 assert_eq!(cloned.len(), 3);
600 assert_eq!(cloned.get(0), Some(&1));
601 assert_eq!(cloned.get(1), Some(&2));
602 assert_eq!(cloned.get(2), Some(&3));
603 }
604
605 #[test]
606 fn test_eq() {
607 let mut vec1: ConstVec<i32, 5> = ConstVec::new();
608 vec1.push(1).expect("push failed");
609 vec1.push(2).expect("push failed");
610
611 let mut vec2: ConstVec<i32, 5> = ConstVec::new();
612 vec2.push(1).expect("push failed");
613 vec2.push(2).expect("push failed");
614
615 let mut vec3: ConstVec<i32, 5> = ConstVec::new();
616 vec3.push(1).expect("push failed");
617 vec3.push(3).expect("push failed");
618
619 assert_eq!(vec1, vec2);
620 assert_ne!(vec1, vec3);
621 }
622
623 #[test]
624 fn test_debug() {
625 let mut vec: ConstVec<i32, 5> = ConstVec::new();
626 vec.push(1).expect("push failed");
627 vec.push(2).expect("push failed");
628
629 let debug_str = format!("{:?}", vec);
630 assert!(debug_str.contains("ConstVec"));
631 assert!(debug_str.contains("len"));
632 assert!(debug_str.contains("capacity"));
633 }
634
635 #[test]
636 fn test_default() {
637 let vec: ConstVec<i32, 5> = ConstVec::default();
638 assert!(vec.is_empty());
639 assert_eq!(vec.capacity(), 5);
640 }
641
642 #[test]
643 fn test_drop() {
644 use crate::test::{CounterI32, alive_count, reset_alive_count};
645
646 reset_alive_count();
647 {
648 let mut vec: ConstVec<CounterI32, 3> = ConstVec::new();
649 vec.push(CounterI32::new(1)).expect("push failed");
650 vec.push(CounterI32::new(2)).expect("push failed");
651 vec.push(CounterI32::new(3)).expect("push failed");
652 assert_eq!(alive_count(), 3);
653 }
654 assert_eq!(alive_count(), 0);
655 }
656
657 #[test]
658 fn test_insert_not_full() {
659 let mut vec: ConstVec<i32, 5> = ConstVec::new();
660 vec.push(1).expect("push failed");
661 vec.push(2).expect("push failed");
662 vec.push(3).expect("push failed");
663
664 assert_eq!(vec.insert(1, 10), None);
666 assert_eq!(vec.len(), 4);
667 assert_eq!(vec.get(0), Some(&1));
668 assert_eq!(vec.get(1), Some(&10));
669 assert_eq!(vec.get(2), Some(&2));
670 assert_eq!(vec.get(3), Some(&3));
671 assert_eq!(vec.get(4), None);
672
673 assert_eq!(vec.insert(0, 20), None);
675 assert_eq!(vec.len(), 5);
676 assert_eq!(vec.get(0), Some(&20));
677 assert_eq!(vec.get(1), Some(&1));
678 assert_eq!(vec.get(2), Some(&10));
679 assert_eq!(vec.get(3), Some(&2));
680 assert_eq!(vec.get(4), Some(&3));
681 assert!(vec.is_full());
682 }
683
684 #[test]
685 fn test_insert_full() {
686 let mut vec: ConstVec<i32, 4> = ConstVec::new();
687 vec.push(1).expect("push failed");
688 vec.push(2).expect("push failed");
689 vec.push(3).expect("push failed");
690 vec.push(4).expect("push failed");
691 assert!(vec.is_full());
692
693 let removed = vec.insert(1, 10);
695 assert_eq!(removed, Some(4));
696 assert_eq!(vec.len(), 4); assert_eq!(vec.get(0), Some(&1));
698 assert_eq!(vec.get(1), Some(&10));
699 assert_eq!(vec.get(2), Some(&2));
700 assert_eq!(vec.get(3), Some(&3));
701
702 let removed = vec.insert(0, 20);
704 assert_eq!(removed, Some(3));
705 assert_eq!(vec.len(), 4);
706 assert_eq!(vec.get(0), Some(&20));
707 assert_eq!(vec.get(1), Some(&1));
708 assert_eq!(vec.get(2), Some(&10));
709 assert_eq!(vec.get(3), Some(&2));
710 }
711
712 #[test]
713 fn test_insert_at_end() {
714 let mut vec: ConstVec<i32, 4> = ConstVec::new();
715 vec.push(1).expect("push failed");
716 vec.push(2).expect("push failed");
717
718 assert_eq!(vec.insert(2, 10), None);
720 assert_eq!(vec.len(), 3);
721 assert_eq!(vec.get(0), Some(&1));
722 assert_eq!(vec.get(1), Some(&2));
723 assert_eq!(vec.get(2), Some(&10));
724 }
725
726 #[test]
727 fn test_insert_invalid_index() {
728 let mut vec: ConstVec<i32, 4> = ConstVec::new();
729 vec.push(1).expect("push failed");
730 vec.push(2).expect("push failed");
731
732 assert_eq!(vec.insert(5, 10), None);
734 assert_eq!(vec.len(), 2); assert_eq!(vec.get(0), Some(&1));
736 assert_eq!(vec.get(1), Some(&2));
737 }
738
739 #[test]
740 fn test_insert_empty() {
741 let mut vec: ConstVec<i32, 4> = ConstVec::new();
742
743 assert_eq!(vec.insert(0, 10), None);
745 assert_eq!(vec.len(), 1);
746 assert_eq!(vec.get(0), Some(&10));
747 }
748
749 #[test]
750 fn test_iter() {
751 let mut vec: ConstVec<i32, 5> = ConstVec::new();
752 vec.push(1).expect("push failed");
753 vec.push(2).expect("push failed");
754 vec.push(3).expect("push failed");
755
756 let mut iter = vec.iter();
757 assert_eq!(iter.next(), Some(&1));
758 assert_eq!(iter.next(), Some(&2));
759 assert_eq!(iter.next(), Some(&3));
760 assert_eq!(iter.next(), None);
761
762 let mut iter2 = vec.iter();
764 assert_eq!(iter2.size_hint(), (3, Some(3)));
765 iter2.next();
766 assert_eq!(iter2.size_hint(), (2, Some(2)));
767 }
768
769 #[test]
770 fn test_iter_mut() {
771 let mut vec: ConstVec<i32, 5> = ConstVec::new();
772 vec.push(1).expect("push failed");
773 vec.push(2).expect("push failed");
774 vec.push(3).expect("push failed");
775
776 for elem in vec.iter_mut() {
778 *elem *= 2;
779 }
780
781 assert_eq!(vec.get(0), Some(&2));
782 assert_eq!(vec.get(1), Some(&4));
783 assert_eq!(vec.get(2), Some(&6));
784
785 let mut iter = vec.iter_mut();
787 assert_eq!(iter.next(), Some(&mut 2));
788 assert_eq!(iter.next(), Some(&mut 4));
789 assert_eq!(iter.next(), Some(&mut 6));
790 assert_eq!(iter.next(), None);
791 }
792
793 #[test]
794 fn test_index() {
795 let mut vec: ConstVec<i32, 5> = ConstVec::new();
796 vec.push(10).expect("push failed");
797 vec.push(20).expect("push failed");
798 vec.push(30).expect("push failed");
799
800 assert_eq!(vec[0], 10);
801 assert_eq!(vec[1], 20);
802 assert_eq!(vec[2], 30);
803
804 fn get_element(vec: &ConstVec<i32, 5>, index: usize) -> i32 {
806 vec[index]
807 }
808
809 assert_eq!(get_element(&vec, 1), 20);
810 }
811
812 #[test]
813 fn test_index_mut() {
814 let mut vec: ConstVec<i32, 5> = ConstVec::new();
815 vec.push(10).expect("push failed");
816 vec.push(20).expect("push failed");
817
818 vec[0] = 100;
819 vec[1] = 200;
820
821 assert_eq!(vec[0], 100);
822 assert_eq!(vec[1], 200);
823
824 fn double_first(vec: &mut ConstVec<i32, 5>) {
826 vec[0] *= 2;
827 }
828
829 double_first(&mut vec);
830 assert_eq!(vec[0], 200);
831 }
832
833 #[test]
834 #[should_panic(expected = "index out of bounds")]
835 #[cfg_attr(miri, ignore)]
836 fn test_index_out_of_bounds() {
837 let mut vec: ConstVec<i32, 5> = ConstVec::new();
838 vec.push(10).expect("push failed");
839
840 let _ = vec[5]; }
842
843 #[test]
844 #[should_panic(expected = "index out of bounds")]
845 #[cfg_attr(miri, ignore)]
846 fn test_index_mut_out_of_bounds() {
847 let mut vec: ConstVec<i32, 5> = ConstVec::new();
848 vec.push(10).expect("push failed");
849
850 vec[5] = 20; }
852
853 #[test]
854 fn test_empty_iter() {
855 let vec: ConstVec<i32, 5> = ConstVec::new();
856 let mut iter = vec.iter();
857
858 assert_eq!(iter.next(), None);
859 assert_eq!(iter.size_hint(), (0, Some(0)));
860 }
861
862 #[test]
863 fn test_iter_exact_size() {
864 let mut vec: ConstVec<i32, 5> = ConstVec::new();
865 vec.push(1).expect("push failed");
866 vec.push(2).expect("push failed");
867 vec.push(3).expect("push failed");
868
869 let iter = vec.iter();
870 assert_eq!(iter.len(), 3); let iter_mut = vec.iter_mut();
873 assert_eq!(iter_mut.len(), 3);
874 }
875
876 #[test]
877 fn test_rev_iter() {
878 let mut vec: ConstVec<i32, 5> = ConstVec::new();
879 vec.push(1).expect("push failed");
880 vec.push(2).expect("push failed");
881 vec.push(3).expect("push failed");
882
883 let collected: Vec<i32> = vec.iter().rev().copied().collect();
885 assert_eq!(collected, vec![3, 2, 1]);
886
887 for elem in vec.iter_mut().rev() {
889 *elem *= 10;
890 }
891 assert_eq!(vec.get(0), Some(&10));
892 assert_eq!(vec.get(1), Some(&20));
893 assert_eq!(vec.get(2), Some(&30));
894 }
895}