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[0].as_ptr(), 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[0].as_mut_ptr(), 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
474#[cfg(test)]
475mod tests {
476 use super::*;
477
478 #[test]
479 fn test_new() {
480 let vec: ConstVec<i32, 5> = ConstVec::new();
481 assert!(vec.is_empty());
482 assert_eq!(vec.len(), 0);
483 assert_eq!(vec.capacity(), 5);
484 assert!(!vec.is_full());
485 }
486
487 #[test]
488 fn test_push_pop() {
489 let mut vec: ConstVec<i32, 3> = ConstVec::new();
490
491 assert!(vec.push(1).is_ok());
492 assert!(vec.push(2).is_ok());
493 assert!(vec.push(3).is_ok());
494 assert!(vec.is_full());
495 assert_eq!(vec.len(), 3);
496
497 assert_eq!(vec.push(4), Err(4));
499 assert_eq!(vec.len(), 3);
500
501 assert_eq!(vec.pop(), Some(3));
503 assert_eq!(vec.pop(), Some(2));
504 assert_eq!(vec.pop(), Some(1));
505 assert_eq!(vec.pop(), None);
506 assert!(vec.is_empty());
507
508 assert!(vec.push(10).is_ok());
510 assert_eq!(vec.pop(), Some(10));
511 }
512
513 #[test]
514 fn test_get() {
515 let mut vec: ConstVec<i32, 5> = ConstVec::new();
516
517 vec.push(10).expect("push failed");
518 vec.push(20).expect("push failed");
519 vec.push(30).expect("push failed");
520
521 assert_eq!(vec.get(0), Some(&10));
522 assert_eq!(vec.get(1), Some(&20));
523 assert_eq!(vec.get(2), Some(&30));
524 assert_eq!(vec.get(3), None);
525 assert_eq!(vec.get(100), None);
526 }
527
528 #[test]
529 fn test_get_mut() {
530 let mut vec: ConstVec<i32, 5> = ConstVec::new();
531
532 vec.push(10).expect("push failed");
533 vec.push(20).expect("push failed");
534
535 if let Some(elem) = vec.get_mut(0) {
536 *elem = 100;
537 }
538
539 assert_eq!(vec.get(0), Some(&100));
540 assert_eq!(vec.get(1), Some(&20));
541 }
542
543 #[test]
544 fn test_is_full() {
545 let mut vec: ConstVec<i32, 2> = ConstVec::new();
546
547 assert!(!vec.is_full());
548 vec.push(1).expect("push failed");
549 assert!(!vec.is_full());
550 vec.push(2).expect("push failed");
551 assert!(vec.is_full());
552
553 vec.pop();
554 assert!(!vec.is_full());
555 }
556
557 #[test]
558 fn test_clone() {
559 let mut vec: ConstVec<i32, 5> = ConstVec::new();
560 vec.push(1).expect("push failed");
561 vec.push(2).expect("push failed");
562 vec.push(3).expect("push failed");
563
564 let cloned = vec.clone();
565 assert_eq!(cloned.len(), 3);
566 assert_eq!(cloned.get(0), Some(&1));
567 assert_eq!(cloned.get(1), Some(&2));
568 assert_eq!(cloned.get(2), Some(&3));
569 }
570
571 #[test]
572 fn test_eq() {
573 let mut vec1: ConstVec<i32, 5> = ConstVec::new();
574 vec1.push(1).expect("push failed");
575 vec1.push(2).expect("push failed");
576
577 let mut vec2: ConstVec<i32, 5> = ConstVec::new();
578 vec2.push(1).expect("push failed");
579 vec2.push(2).expect("push failed");
580
581 let mut vec3: ConstVec<i32, 5> = ConstVec::new();
582 vec3.push(1).expect("push failed");
583 vec3.push(3).expect("push failed");
584
585 assert_eq!(vec1, vec2);
586 assert_ne!(vec1, vec3);
587 }
588
589 #[test]
590 fn test_debug() {
591 let mut vec: ConstVec<i32, 5> = ConstVec::new();
592 vec.push(1).expect("push failed");
593 vec.push(2).expect("push failed");
594
595 let debug_str = format!("{:?}", vec);
596 assert!(debug_str.contains("ConstVec"));
597 assert!(debug_str.contains("len"));
598 assert!(debug_str.contains("capacity"));
599 }
600
601 #[test]
602 fn test_default() {
603 let vec: ConstVec<i32, 5> = ConstVec::default();
604 assert!(vec.is_empty());
605 assert_eq!(vec.capacity(), 5);
606 }
607
608 #[test]
609 fn test_drop() {
610 use std::cell::Cell;
611
612 #[derive(Debug)]
613 struct DropCounter<'a> {
614 count: &'a Cell<i32>,
615 }
616
617 impl<'a> Drop for DropCounter<'a> {
618 fn drop(&mut self) {
619 self.count.set(self.count.get() + 1);
620 }
621 }
622
623 let count = Cell::new(0);
624 {
625 let mut vec: ConstVec<DropCounter, 3> = ConstVec::new();
626 vec.push(DropCounter { count: &count }).expect("push failed");
627 vec.push(DropCounter { count: &count }).expect("push failed");
628 vec.push(DropCounter { count: &count }).expect("push failed");
629 assert_eq!(count.get(), 0);
630 }
631 assert_eq!(count.get(), 3);
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 fn test_index_out_of_bounds() {
813 let mut vec: ConstVec<i32, 5> = ConstVec::new();
814 vec.push(10).expect("push failed");
815
816 let _ = vec[5]; }
818
819 #[test]
820 #[should_panic(expected = "index out of bounds")]
821 fn test_index_mut_out_of_bounds() {
822 let mut vec: ConstVec<i32, 5> = ConstVec::new();
823 vec.push(10).expect("push failed");
824
825 vec[5] = 20; }
827
828 #[test]
829 fn test_empty_iter() {
830 let vec: ConstVec<i32, 5> = ConstVec::new();
831 let mut iter = vec.iter();
832
833 assert_eq!(iter.next(), None);
834 assert_eq!(iter.size_hint(), (0, Some(0)));
835 }
836
837 #[test]
838 fn test_iter_exact_size() {
839 let mut vec: ConstVec<i32, 5> = ConstVec::new();
840 vec.push(1).expect("push failed");
841 vec.push(2).expect("push failed");
842 vec.push(3).expect("push failed");
843
844 let iter = vec.iter();
845 assert_eq!(iter.len(), 3); let iter_mut = vec.iter_mut();
848 assert_eq!(iter_mut.len(), 3);
849 }
850}
851
852impl<T, const N: usize> Drop for ConstVec<T, N> {
853 fn drop(&mut self) {
854 for i in 0..self.len {
856 unsafe {
857 self.data[i].assume_init_drop();
858 }
859 }
860 }
861}