1use core::fmt;
27use core::mem::MaybeUninit;
28use core::ops::{Deref, DerefMut};
29use core::slice;
30
31pub struct ConstVec<T, const N: usize> {
33 data: [MaybeUninit<T>; N],
35 len: usize,
37}
38
39unsafe impl<T: Send, const N: usize> Send for ConstVec<T, N> {}
40unsafe impl<T: Send, const N: usize> Sync for ConstVec<T, N> {}
41
42impl<T, const N: usize> ConstVec<T, N> {
43 #[inline(always)]
54 pub fn new() -> Self {
55 let data = core::array::from_fn(|_| MaybeUninit::uninit());
58
59 Self { data, len: 0 }
60 }
61
62 #[inline(always)]
75 pub const fn len(&self) -> usize {
76 self.len
77 }
78
79 #[inline(always)]
92 pub const fn is_empty(&self) -> bool {
93 self.len == 0
94 }
95
96 #[inline(always)]
106 pub const fn capacity(&self) -> usize {
107 N
108 }
109
110 #[inline(always)]
124 pub const fn is_full(&self) -> bool {
125 self.len == N
126 }
127
128 #[inline]
146 pub fn push(&mut self, item: T) -> Result<(), T> {
147 if self.len < N {
148 self.data[self.len] = MaybeUninit::new(item);
150 self.len += 1;
151 Ok(())
152 } else {
153 Err(item)
154 }
155 }
156
157 #[inline]
174 pub fn pop(&mut self) -> Option<T> {
175 if self.len > 0 {
176 self.len -= 1;
177 let item = unsafe { self.data[self.len].assume_init_read() };
179 Some(item)
180 } else {
181 None
182 }
183 }
184
185 #[inline]
202 pub fn get(&self, index: usize) -> Option<&T> {
203 if index < self.len {
204 Some(unsafe { self.data[index].assume_init_ref() })
206 } else {
207 None
208 }
209 }
210
211 #[inline]
229 pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
230 if index < self.len {
231 Some(unsafe { self.data[index].assume_init_mut() })
233 } else {
234 None
235 }
236 }
237
238 #[inline]
274 pub fn insert(&mut self, index: usize, item: T) -> Option<T> {
275 if index > self.len {
276 return None;
278 }
279
280 if self.len < N {
281 for i in (index..self.len).rev() {
284 unsafe {
285 let src = self.data[i].as_ptr();
286 let dst = self.data[i + 1].as_mut_ptr();
287 core::ptr::copy_nonoverlapping(src, dst, 1);
288 }
289 }
290 self.data[index] = MaybeUninit::new(item);
292 self.len += 1;
293 None
294 } else {
295 let last_item = unsafe { self.data[N - 1].assume_init_read() };
298
299 for i in (index..N - 1).rev() {
301 unsafe {
302 let src = self.data[i].as_ptr();
303 let dst = self.data[i + 1].as_mut_ptr();
304 core::ptr::copy_nonoverlapping(src, dst, 1);
305 }
306 }
307
308 self.data[index] = MaybeUninit::new(item);
310
311 Some(last_item)
312 }
313 }
314
315 #[inline]
333 pub fn iter(&self) -> slice::Iter<'_, T> {
334 self.deref().iter()
335 }
336
337 #[inline]
357 pub fn iter_mut(&mut self) -> slice::IterMut<'_, T> {
358 self.deref_mut().iter_mut()
359 }
360}
361
362impl<T, const N: usize> Deref for ConstVec<T, N> {
363 type Target = [T];
364
365 #[inline]
366 fn deref(&self) -> &Self::Target {
367 unsafe { core::slice::from_raw_parts::<T>(self.data.as_ptr() as *const T, self.len) }
368 }
369}
370
371impl<T, const N: usize> DerefMut for ConstVec<T, N> {
372 #[inline]
373 fn deref_mut(&mut self) -> &mut Self::Target {
374 unsafe { core::slice::from_raw_parts_mut::<T>(self.data.as_mut_ptr() as *mut T, self.len) }
375 }
376}
377
378impl<'a, T, const N: usize> IntoIterator for &'a ConstVec<T, N> {
379 type Item = &'a T;
380 type IntoIter = slice::Iter<'a, T>;
381
382 #[inline]
383 fn into_iter(self) -> Self::IntoIter {
384 self.iter()
385 }
386}
387
388impl<'a, T, const N: usize> IntoIterator for &'a mut ConstVec<T, N> {
389 type Item = &'a mut T;
390 type IntoIter = slice::IterMut<'a, T>;
391
392 #[inline]
393 fn into_iter(self) -> Self::IntoIter {
394 self.iter_mut()
395 }
396}
397
398impl<T: fmt::Debug, const N: usize> fmt::Debug for ConstVec<T, N> {
399 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
400 f.debug_struct("ConstVec")
401 .field("len", &self.len)
402 .field("capacity", &N)
403 .field("data", &&self.data[..self.len])
404 .finish()
405 }
406}
407
408impl<T: Clone, const N: usize> Clone for ConstVec<T, N> {
409 fn clone(&self) -> Self {
410 let mut new_vec = Self::new();
411 for i in 0..self.len {
412 let item = unsafe { self.data[i].assume_init_ref() };
414 match new_vec.push(item.clone()) {
417 Ok(()) => {}
418 Err(_) => panic!("ConstVec clone failed: capacity exceeded"),
419 }
420 }
421 new_vec
422 }
423}
424
425impl<T: PartialEq, const N: usize> PartialEq for ConstVec<T, N> {
426 fn eq(&self, other: &Self) -> bool {
427 if self.len != other.len {
428 return false;
429 }
430 for i in 0..self.len {
431 let a = unsafe { self.data[i].assume_init_ref() };
433 let b = unsafe { other.data[i].assume_init_ref() };
434 if a != b {
435 return false;
436 }
437 }
438 true
439 }
440}
441
442impl<T: Eq, const N: usize> Eq for ConstVec<T, N> {}
443
444impl<T, const N: usize> Default for ConstVec<T, N> {
445 fn default() -> Self {
446 Self::new()
447 }
448}
449
450impl<T, const N: usize> core::ops::Index<usize> for ConstVec<T, N> {
451 type Output = T;
452
453 #[inline]
470 fn index(&self, index: usize) -> &Self::Output {
471 self.get(index).expect("index out of bounds")
472 }
473}
474
475impl<T, const N: usize> core::ops::IndexMut<usize> for ConstVec<T, N> {
476 #[inline]
493 fn index_mut(&mut self, index: usize) -> &mut Self::Output {
494 self.get_mut(index).expect("index out of bounds")
495 }
496}
497
498impl<T, const N: usize> Drop for ConstVec<T, N> {
499 fn drop(&mut self) {
500 for i in 0..self.len {
502 unsafe {
503 self.data[i].assume_init_drop();
504 }
505 }
506 }
507}
508
509#[cfg(test)]
510mod tests {
511 use super::*;
512 use embed_collections_test::{CounterI32, alive_count, reset_alive_count};
513
514 #[test]
515 fn test_new() {
516 let vec: ConstVec<i32, 5> = ConstVec::new();
517 assert!(vec.is_empty());
518 assert_eq!(vec.len(), 0);
519 assert_eq!(vec.capacity(), 5);
520 assert!(!vec.is_full());
521 }
522
523 #[test]
524 fn test_push_pop() {
525 let mut vec: ConstVec<i32, 3> = ConstVec::new();
526
527 assert!(vec.push(1).is_ok());
528 assert!(vec.push(2).is_ok());
529 assert!(vec.push(3).is_ok());
530 assert!(vec.is_full());
531 assert_eq!(vec.len(), 3);
532
533 assert_eq!(vec.push(4), Err(4));
535 assert_eq!(vec.len(), 3);
536
537 assert_eq!(vec.pop(), Some(3));
539 assert_eq!(vec.pop(), Some(2));
540 assert_eq!(vec.pop(), Some(1));
541 assert_eq!(vec.pop(), None);
542 assert!(vec.is_empty());
543
544 assert!(vec.push(10).is_ok());
546 assert_eq!(vec.pop(), Some(10));
547 }
548
549 #[test]
550 fn test_get() {
551 let mut vec: ConstVec<i32, 5> = ConstVec::new();
552
553 vec.push(10).expect("push failed");
554 vec.push(20).expect("push failed");
555 vec.push(30).expect("push failed");
556
557 assert_eq!(vec.get(0), Some(&10));
558 assert_eq!(vec.get(1), Some(&20));
559 assert_eq!(vec.get(2), Some(&30));
560 assert_eq!(vec.get(3), None);
561 assert_eq!(vec.get(100), None);
562 }
563
564 #[test]
565 fn test_get_mut() {
566 let mut vec: ConstVec<i32, 5> = ConstVec::new();
567
568 vec.push(10).expect("push failed");
569 vec.push(20).expect("push failed");
570
571 if let Some(elem) = vec.get_mut(0) {
572 *elem = 100;
573 }
574
575 assert_eq!(vec.get(0), Some(&100));
576 assert_eq!(vec.get(1), Some(&20));
577 }
578
579 #[test]
580 fn test_is_full() {
581 let mut vec: ConstVec<i32, 2> = ConstVec::new();
582
583 assert!(!vec.is_full());
584 vec.push(1).expect("push failed");
585 assert!(!vec.is_full());
586 vec.push(2).expect("push failed");
587 assert!(vec.is_full());
588
589 vec.pop();
590 assert!(!vec.is_full());
591 }
592
593 #[test]
594 fn test_clone() {
595 let mut vec: ConstVec<i32, 5> = ConstVec::new();
596 vec.push(1).expect("push failed");
597 vec.push(2).expect("push failed");
598 vec.push(3).expect("push failed");
599
600 let cloned = vec.clone();
601 assert_eq!(cloned.len(), 3);
602 assert_eq!(cloned.get(0), Some(&1));
603 assert_eq!(cloned.get(1), Some(&2));
604 assert_eq!(cloned.get(2), Some(&3));
605 }
606
607 #[test]
608 fn test_eq() {
609 let mut vec1: ConstVec<i32, 5> = ConstVec::new();
610 vec1.push(1).expect("push failed");
611 vec1.push(2).expect("push failed");
612
613 let mut vec2: ConstVec<i32, 5> = ConstVec::new();
614 vec2.push(1).expect("push failed");
615 vec2.push(2).expect("push failed");
616
617 let mut vec3: ConstVec<i32, 5> = ConstVec::new();
618 vec3.push(1).expect("push failed");
619 vec3.push(3).expect("push failed");
620
621 assert_eq!(vec1, vec2);
622 assert_ne!(vec1, vec3);
623 }
624
625 #[test]
626 fn test_debug() {
627 let mut vec: ConstVec<i32, 5> = ConstVec::new();
628 vec.push(1).expect("push failed");
629 vec.push(2).expect("push failed");
630
631 let debug_str = format!("{:?}", vec);
632 assert!(debug_str.contains("ConstVec"));
633 assert!(debug_str.contains("len"));
634 assert!(debug_str.contains("capacity"));
635 }
636
637 #[test]
638 fn test_default() {
639 let vec: ConstVec<i32, 5> = ConstVec::default();
640 assert!(vec.is_empty());
641 assert_eq!(vec.capacity(), 5);
642 }
643
644 #[test]
645 fn test_drop() {
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}