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