Skip to main content

embed_constvec/
lib.rs

1//! A fixed-size inline vector with const generic capacity.
2//!
3//! # Features
4//! - It's smaller in size than `std::vec::Vec`.
5//! - push returns errors when the capacity is exceeded instead of reallocating.
6//! - No heap allocation after initial creation, better cache consistency.
7//! - If you want heap allocation, use `Box<ConstVec<T, N>>`.
8//!
9//! # Example
10//! ```rust
11//! use embed_constvec::ConstVec;
12//!
13//! let mut vec: ConstVec<i32, 3> = ConstVec::new();
14//!
15//! assert!(vec.push(1).is_ok());
16//! assert!(vec.push(2).is_ok());
17//! assert!(vec.push(3).is_ok());
18//!
19//! // Capacity is full, next push returns Err
20//! assert!(vec.push(4).is_err());
21//!
22//! assert_eq!(vec.len(), 3);
23//! assert_eq!(vec.capacity(), 3);
24//! ```
25
26use core::fmt;
27use core::mem::MaybeUninit;
28use core::ops::{Deref, DerefMut};
29use core::slice;
30
31/// A fixed-size **inline** vector with const generic capacity
32pub struct ConstVec<T, const N: usize> {
33    // Storage for elements, using MaybeUninit to handle uninitialized memory
34    data: [MaybeUninit<T>; N],
35    // Current number of elements in the vector
36    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    /// Creates a new empty `ConstVec`.
44    ///
45    /// # Example
46    /// ```rust
47    /// use embed_constvec::ConstVec;
48    ///
49    /// let vec: ConstVec<i32, 5> = ConstVec::new();
50    /// assert!(vec.is_empty());
51    /// assert_eq!(vec.capacity(), 5);
52    /// ```
53    #[inline(always)]
54    pub fn new() -> Self {
55        // Create an array of uninitialized values using from_fn
56        // This is safe because MaybeUninit<T> can hold uninitialized data
57        let data = core::array::from_fn(|_| MaybeUninit::uninit());
58
59        Self { data, len: 0 }
60    }
61
62    /// Returns the number of elements in the vector.
63    ///
64    /// # Example
65    /// ```rust
66    /// use embed_constvec::ConstVec;
67    ///
68    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
69    /// assert_eq!(vec.len(), 0);
70    ///
71    /// vec.push(1).unwrap();
72    /// assert_eq!(vec.len(), 1);
73    /// ```
74    #[inline(always)]
75    pub const fn len(&self) -> usize {
76        self.len
77    }
78
79    /// Returns `true` if the vector contains no elements.
80    ///
81    /// # Example
82    /// ```rust
83    /// use embed_constvec::ConstVec;
84    ///
85    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
86    /// assert!(vec.is_empty());
87    ///
88    /// vec.push(1).unwrap();
89    /// assert!(!vec.is_empty());
90    /// ```
91    #[inline(always)]
92    pub const fn is_empty(&self) -> bool {
93        self.len == 0
94    }
95
96    /// Returns the capacity of the vector.
97    ///
98    /// # Example
99    /// ```rust
100    /// use embed_constvec::ConstVec;
101    ///
102    /// let vec: ConstVec<i32, 5> = ConstVec::new();
103    /// assert_eq!(vec.capacity(), 5);
104    /// ```
105    #[inline(always)]
106    pub const fn capacity(&self) -> usize {
107        N
108    }
109
110    /// Returns `true` if the vector is at full capacity.
111    ///
112    /// # Example
113    /// ```rust
114    /// use embed_constvec::ConstVec;
115    ///
116    /// let mut vec: ConstVec<i32, 2> = ConstVec::new();
117    /// assert!(!vec.is_full());
118    ///
119    /// vec.push(1).unwrap();
120    /// vec.push(2).unwrap();
121    /// assert!(vec.is_full());
122    /// ```
123    #[inline(always)]
124    pub const fn is_full(&self) -> bool {
125        self.len == N
126    }
127
128    /// Appends an element to the back of the vector.
129    ///
130    /// Returns `Ok(())` if the element was successfully added, or `Err(item)`
131    /// if the vector is at full capacity.
132    ///
133    /// # Example
134    /// ```rust
135    /// use embed_constvec::ConstVec;
136    ///
137    /// let mut vec: ConstVec<i32, 2> = ConstVec::new();
138    ///
139    /// assert!(vec.push(1).is_ok());
140    /// assert!(vec.push(2).is_ok());
141    /// assert!(vec.push(3).is_err()); // Capacity exceeded
142    ///
143    /// assert_eq!(vec.len(), 2);
144    /// ```
145    #[inline]
146    pub fn push(&mut self, item: T) -> Result<(), T> {
147        if self.len < N {
148            // Safe because we're writing to an uninitialized slot and we've checked the bounds
149            self.data[self.len] = MaybeUninit::new(item);
150            self.len += 1;
151            Ok(())
152        } else {
153            Err(item)
154        }
155    }
156
157    /// Removes and returns the last element from the vector.
158    ///
159    /// Returns `Some(item)` if the vector is not empty, or `None` if it is empty.
160    ///
161    /// # Example
162    /// ```rust
163    /// use embed_constvec::ConstVec;
164    ///
165    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
166    /// vec.push(1).unwrap();
167    /// vec.push(2).unwrap();
168    ///
169    /// assert_eq!(vec.pop(), Some(2));
170    /// assert_eq!(vec.pop(), Some(1));
171    /// assert_eq!(vec.pop(), None);
172    /// ```
173    #[inline]
174    pub fn pop(&mut self) -> Option<T> {
175        if self.len > 0 {
176            self.len -= 1;
177            // Safe because we've checked that len > 0, so this slot is initialized
178            let item = unsafe { self.data[self.len].assume_init_read() };
179            Some(item)
180        } else {
181            None
182        }
183    }
184
185    /// Returns a reference to the element at the given index.
186    ///
187    /// Returns `None` if the index is out of bounds.
188    ///
189    /// # Example
190    /// ```rust
191    /// use embed_constvec::ConstVec;
192    ///
193    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
194    /// vec.push(10).unwrap();
195    /// vec.push(20).unwrap();
196    ///
197    /// assert_eq!(vec.get(0), Some(&10));
198    /// assert_eq!(vec.get(1), Some(&20));
199    /// assert_eq!(vec.get(2), None);
200    /// ```
201    #[inline]
202    pub fn get(&self, index: usize) -> Option<&T> {
203        if index < self.len {
204            // Safe because we've checked the bounds and we only initialize up to len
205            Some(unsafe { self.data[index].assume_init_ref() })
206        } else {
207            None
208        }
209    }
210
211    /// Returns a mutable reference to the element at the given index.
212    ///
213    /// Returns `None` if the index is out of bounds.
214    ///
215    /// # Example
216    /// ```rust
217    /// use embed_constvec::ConstVec;
218    ///
219    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
220    /// vec.push(10).unwrap();
221    ///
222    /// if let Some(elem) = vec.get_mut(0) {
223    ///     *elem = 30;
224    /// }
225    ///
226    /// assert_eq!(vec.get(0), Some(&30));
227    /// ```
228    #[inline]
229    pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
230        if index < self.len {
231            // Safe because we've checked the bounds and we only initialize up to len
232            Some(unsafe { self.data[index].assume_init_mut() })
233        } else {
234            None
235        }
236    }
237
238    /// Inserts an element at the specified index.
239    ///
240    /// If the index is greater than the length, returns `None`.
241    ///
242    /// If the vector is not full, the element is inserted and all elements
243    /// from the index onward are shifted right by one, and `None` is returned.
244    ///
245    /// If the vector is full, the element is inserted, all elements from the
246    /// index onward are shifted right by one, the last element is removed and
247    /// returned in `Some`.
248    ///
249    /// # Example
250    /// ```rust
251    /// use embed_constvec::ConstVec;
252    ///
253    /// let mut vec: ConstVec<i32, 4> = ConstVec::new();
254    /// vec.push(1).expect("push failed");
255    /// vec.push(2).expect("push failed");
256    /// vec.push(3).expect("push failed");
257    ///
258    /// // Insert at index 1 (not full)
259    /// assert_eq!(vec.insert(1, 10), None);
260    /// assert_eq!(vec.get(0), Some(&1));
261    /// assert_eq!(vec.get(1), Some(&10));
262    /// assert_eq!(vec.get(2), Some(&2));
263    /// assert_eq!(vec.get(3), Some(&3));
264    ///
265    /// // Insert when full - removes last element
266    /// let removed = vec.insert(2, 20);
267    /// assert_eq!(removed, Some(3));
268    /// assert_eq!(vec.get(0), Some(&1));
269    /// assert_eq!(vec.get(1), Some(&10));
270    /// assert_eq!(vec.get(2), Some(&20));
271    /// assert_eq!(vec.get(3), Some(&2));
272    /// ```
273    #[inline]
274    pub fn insert(&mut self, index: usize, item: T) -> Option<T> {
275        if index > self.len {
276            // Invalid index
277            return None;
278        }
279
280        if self.len < N {
281            // Not full, shift elements to the right
282            // Start from the end and move backwards
283            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            // Insert the new element
291            self.data[index] = MaybeUninit::new(item);
292            self.len += 1;
293            None
294        } else {
295            // Full, need to remove the last element
296            // Save the last element to return
297            let last_item = unsafe { self.data[N - 1].assume_init_read() };
298
299            // Shift elements from index to N-2 to the right
300            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            // Insert the new element
309            self.data[index] = MaybeUninit::new(item);
310
311            Some(last_item)
312        }
313    }
314
315    /// Returns an iterator over the elements of the vector.
316    ///
317    /// # Example
318    /// ```rust
319    /// use embed_constvec::ConstVec;
320    ///
321    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
322    /// vec.push(1).expect("push failed");
323    /// vec.push(2).expect("push failed");
324    /// vec.push(3).expect("push failed");
325    ///
326    /// let mut iter = vec.iter();
327    /// assert_eq!(iter.next(), Some(&1));
328    /// assert_eq!(iter.next(), Some(&2));
329    /// assert_eq!(iter.next(), Some(&3));
330    /// assert_eq!(iter.next(), None);
331    /// ```
332    #[inline]
333    pub fn iter(&self) -> slice::Iter<'_, T> {
334        self.deref().iter()
335    }
336
337    /// Returns a mutable iterator over the elements of the vector.
338    ///
339    /// # Example
340    /// ```rust
341    /// use embed_constvec::ConstVec;
342    ///
343    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
344    /// vec.push(1).expect("push failed");
345    /// vec.push(2).expect("push failed");
346    /// vec.push(3).expect("push failed");
347    ///
348    /// for elem in vec.iter_mut() {
349    ///     *elem *= 2;
350    /// }
351    ///
352    /// assert_eq!(vec.get(0), Some(&2));
353    /// assert_eq!(vec.get(1), Some(&4));
354    /// assert_eq!(vec.get(2), Some(&6));
355    /// ```
356    #[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            // Safe because we know these elements are initialized
413            let item = unsafe { self.data[i].assume_init_ref() };
414            // We know new_vec has enough capacity because N is the same
415            // This should never fail, but we use match to avoid Debug requirement
416            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            // Safe because we know these elements are initialized
432            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    /// Returns a reference to the element at the given index.
454    ///
455    /// # Panics
456    /// Panics if the index is out of bounds.
457    ///
458    /// # Example
459    /// ```rust
460    /// use embed_constvec::ConstVec;
461    ///
462    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
463    /// vec.push(10).expect("push failed");
464    /// vec.push(20).expect("push failed");
465    ///
466    /// assert_eq!(vec[0], 10);
467    /// assert_eq!(vec[1], 20);
468    /// ```
469    #[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    /// Returns a mutable reference to the element at the given index.
477    ///
478    /// # Panics
479    /// Panics if the index is out of bounds.
480    ///
481    /// # Example
482    /// ```rust
483    /// use embed_constvec::ConstVec;
484    ///
485    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
486    /// vec.push(10).expect("push failed");
487    /// vec.push(20).expect("push failed");
488    ///
489    /// vec[0] = 30;
490    /// assert_eq!(vec[0], 30);
491    /// ```
492    #[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        // Drop all initialized elements
501        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        // Try to push when full
534        assert_eq!(vec.push(4), Err(4));
535        assert_eq!(vec.len(), 3);
536
537        // Pop elements
538        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        // Can push again after popping
545        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        // Insert at index 1, not full
665        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        // Insert at beginning
674        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        // Insert at index 1 when full, should remove last element (4)
694        let removed = vec.insert(1, 10);
695        assert_eq!(removed, Some(4));
696        assert_eq!(vec.len(), 4); // Still full
697        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        // Insert at beginning when full, should remove last element (3)
703        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        // Insert at end (index == len)
719        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        // Insert at invalid index (greater than len)
733        assert_eq!(vec.insert(5, 10), None);
734        assert_eq!(vec.len(), 2); // Unchanged
735        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        // Insert into empty vector
744        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        // Check size_hint
763        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        // Double each element
777        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        // Check iterator works correctly
786        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        // Test with a function that uses indexing
805        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        // Test with a function that uses mutable indexing
825        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]; // Should panic
841    }
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; // Should panic
851    }
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); // ExactSizeIterator provides len()
871
872        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        // Test rev() on immutable iterator (slice's DoubleEndedIterator)
884        let collected: Vec<i32> = vec.iter().rev().copied().collect();
885        assert_eq!(collected, vec![3, 2, 1]);
886
887        // Test rev() on mutable iterator
888        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}