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 std::cell::Cell;
622
623 #[derive(Debug)]
624 struct DropCounter<'a> {
625 count: &'a Cell<i32>,
626 }
627
628 impl<'a> Drop for DropCounter<'a> {
629 fn drop(&mut self) {
630 self.count.set(self.count.get() + 1);
631 }
632 }
633
634 let count = Cell::new(0);
635 {
636 let mut vec: ConstVec<DropCounter, 3> = ConstVec::new();
637 vec.push(DropCounter { count: &count }).expect("push failed");
638 vec.push(DropCounter { count: &count }).expect("push failed");
639 vec.push(DropCounter { count: &count }).expect("push failed");
640 assert_eq!(count.get(), 0);
641 }
642 assert_eq!(count.get(), 3);
643 }
644
645 #[test]
646 fn test_insert_not_full() {
647 let mut vec: ConstVec<i32, 5> = ConstVec::new();
648 vec.push(1).expect("push failed");
649 vec.push(2).expect("push failed");
650 vec.push(3).expect("push failed");
651
652 assert_eq!(vec.insert(1, 10), None);
654 assert_eq!(vec.len(), 4);
655 assert_eq!(vec.get(0), Some(&1));
656 assert_eq!(vec.get(1), Some(&10));
657 assert_eq!(vec.get(2), Some(&2));
658 assert_eq!(vec.get(3), Some(&3));
659 assert_eq!(vec.get(4), None);
660
661 assert_eq!(vec.insert(0, 20), None);
663 assert_eq!(vec.len(), 5);
664 assert_eq!(vec.get(0), Some(&20));
665 assert_eq!(vec.get(1), Some(&1));
666 assert_eq!(vec.get(2), Some(&10));
667 assert_eq!(vec.get(3), Some(&2));
668 assert_eq!(vec.get(4), Some(&3));
669 assert!(vec.is_full());
670 }
671
672 #[test]
673 fn test_insert_full() {
674 let mut vec: ConstVec<i32, 4> = ConstVec::new();
675 vec.push(1).expect("push failed");
676 vec.push(2).expect("push failed");
677 vec.push(3).expect("push failed");
678 vec.push(4).expect("push failed");
679 assert!(vec.is_full());
680
681 let removed = vec.insert(1, 10);
683 assert_eq!(removed, Some(4));
684 assert_eq!(vec.len(), 4); assert_eq!(vec.get(0), Some(&1));
686 assert_eq!(vec.get(1), Some(&10));
687 assert_eq!(vec.get(2), Some(&2));
688 assert_eq!(vec.get(3), Some(&3));
689
690 let removed = vec.insert(0, 20);
692 assert_eq!(removed, Some(3));
693 assert_eq!(vec.len(), 4);
694 assert_eq!(vec.get(0), Some(&20));
695 assert_eq!(vec.get(1), Some(&1));
696 assert_eq!(vec.get(2), Some(&10));
697 assert_eq!(vec.get(3), Some(&2));
698 }
699
700 #[test]
701 fn test_insert_at_end() {
702 let mut vec: ConstVec<i32, 4> = ConstVec::new();
703 vec.push(1).expect("push failed");
704 vec.push(2).expect("push failed");
705
706 assert_eq!(vec.insert(2, 10), None);
708 assert_eq!(vec.len(), 3);
709 assert_eq!(vec.get(0), Some(&1));
710 assert_eq!(vec.get(1), Some(&2));
711 assert_eq!(vec.get(2), Some(&10));
712 }
713
714 #[test]
715 fn test_insert_invalid_index() {
716 let mut vec: ConstVec<i32, 4> = ConstVec::new();
717 vec.push(1).expect("push failed");
718 vec.push(2).expect("push failed");
719
720 assert_eq!(vec.insert(5, 10), None);
722 assert_eq!(vec.len(), 2); assert_eq!(vec.get(0), Some(&1));
724 assert_eq!(vec.get(1), Some(&2));
725 }
726
727 #[test]
728 fn test_insert_empty() {
729 let mut vec: ConstVec<i32, 4> = ConstVec::new();
730
731 assert_eq!(vec.insert(0, 10), None);
733 assert_eq!(vec.len(), 1);
734 assert_eq!(vec.get(0), Some(&10));
735 }
736
737 #[test]
738 fn test_iter() {
739 let mut vec: ConstVec<i32, 5> = ConstVec::new();
740 vec.push(1).expect("push failed");
741 vec.push(2).expect("push failed");
742 vec.push(3).expect("push failed");
743
744 let mut iter = vec.iter();
745 assert_eq!(iter.next(), Some(&1));
746 assert_eq!(iter.next(), Some(&2));
747 assert_eq!(iter.next(), Some(&3));
748 assert_eq!(iter.next(), None);
749
750 let mut iter2 = vec.iter();
752 assert_eq!(iter2.size_hint(), (3, Some(3)));
753 iter2.next();
754 assert_eq!(iter2.size_hint(), (2, Some(2)));
755 }
756
757 #[test]
758 fn test_iter_mut() {
759 let mut vec: ConstVec<i32, 5> = ConstVec::new();
760 vec.push(1).expect("push failed");
761 vec.push(2).expect("push failed");
762 vec.push(3).expect("push failed");
763
764 for elem in vec.iter_mut() {
766 *elem *= 2;
767 }
768
769 assert_eq!(vec.get(0), Some(&2));
770 assert_eq!(vec.get(1), Some(&4));
771 assert_eq!(vec.get(2), Some(&6));
772
773 let mut iter = vec.iter_mut();
775 assert_eq!(iter.next(), Some(&mut 2));
776 assert_eq!(iter.next(), Some(&mut 4));
777 assert_eq!(iter.next(), Some(&mut 6));
778 assert_eq!(iter.next(), None);
779 }
780
781 #[test]
782 fn test_index() {
783 let mut vec: ConstVec<i32, 5> = ConstVec::new();
784 vec.push(10).expect("push failed");
785 vec.push(20).expect("push failed");
786 vec.push(30).expect("push failed");
787
788 assert_eq!(vec[0], 10);
789 assert_eq!(vec[1], 20);
790 assert_eq!(vec[2], 30);
791
792 fn get_element(vec: &ConstVec<i32, 5>, index: usize) -> i32 {
794 vec[index]
795 }
796
797 assert_eq!(get_element(&vec, 1), 20);
798 }
799
800 #[test]
801 fn test_index_mut() {
802 let mut vec: ConstVec<i32, 5> = ConstVec::new();
803 vec.push(10).expect("push failed");
804 vec.push(20).expect("push failed");
805
806 vec[0] = 100;
807 vec[1] = 200;
808
809 assert_eq!(vec[0], 100);
810 assert_eq!(vec[1], 200);
811
812 fn double_first(vec: &mut ConstVec<i32, 5>) {
814 vec[0] *= 2;
815 }
816
817 double_first(&mut vec);
818 assert_eq!(vec[0], 200);
819 }
820
821 #[test]
822 #[should_panic(expected = "index out of bounds")]
823 #[cfg_attr(miri, ignore)]
824 fn test_index_out_of_bounds() {
825 let mut vec: ConstVec<i32, 5> = ConstVec::new();
826 vec.push(10).expect("push failed");
827
828 let _ = vec[5]; }
830
831 #[test]
832 #[should_panic(expected = "index out of bounds")]
833 #[cfg_attr(miri, ignore)]
834 fn test_index_mut_out_of_bounds() {
835 let mut vec: ConstVec<i32, 5> = ConstVec::new();
836 vec.push(10).expect("push failed");
837
838 vec[5] = 20; }
840
841 #[test]
842 fn test_empty_iter() {
843 let vec: ConstVec<i32, 5> = ConstVec::new();
844 let mut iter = vec.iter();
845
846 assert_eq!(iter.next(), None);
847 assert_eq!(iter.size_hint(), (0, Some(0)));
848 }
849
850 #[test]
851 fn test_iter_exact_size() {
852 let mut vec: ConstVec<i32, 5> = ConstVec::new();
853 vec.push(1).expect("push failed");
854 vec.push(2).expect("push failed");
855 vec.push(3).expect("push failed");
856
857 let iter = vec.iter();
858 assert_eq!(iter.len(), 3); let iter_mut = vec.iter_mut();
861 assert_eq!(iter_mut.len(), 3);
862 }
863
864 #[test]
865 fn test_rev_iter() {
866 let mut vec: ConstVec<i32, 5> = ConstVec::new();
867 vec.push(1).expect("push failed");
868 vec.push(2).expect("push failed");
869 vec.push(3).expect("push failed");
870
871 let collected: Vec<i32> = vec.iter().rev().copied().collect();
873 assert_eq!(collected, vec![3, 2, 1]);
874
875 for elem in vec.iter_mut().rev() {
877 *elem *= 10;
878 }
879 assert_eq!(vec.get(0), Some(&10));
880 assert_eq!(vec.get(1), Some(&20));
881 assert_eq!(vec.get(2), Some(&30));
882 }
883}