Skip to main content

embed_collections/
const_vec.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//!
8//! # Example
9//! ```rust
10//! use embed_collections::const_vec::ConstVec;
11//!
12//! let mut vec: ConstVec<i32, 3> = ConstVec::new();
13//!
14//! assert!(vec.push(1).is_ok());
15//! assert!(vec.push(2).is_ok());
16//! assert!(vec.push(3).is_ok());
17//!
18//! // Capacity is full, next push returns Err
19//! assert!(vec.push(4).is_err());
20//!
21//! assert_eq!(vec.len(), 3);
22//! assert_eq!(vec.capacity(), 3);
23//! ```
24
25use core::fmt;
26use core::mem::MaybeUninit;
27use core::ops::{Deref, DerefMut};
28use core::slice;
29
30/// A fixed-size **inline** vector with const generic capacity
31pub struct ConstVec<T, const N: usize> {
32    // Storage for elements, using MaybeUninit to handle uninitialized memory
33    data: [MaybeUninit<T>; N],
34    // Current number of elements in the vector
35    len: usize,
36}
37
38unsafe impl<T: Send, const N: usize> Send for ConstVec<T, N> {}
39unsafe impl<T: Send, const N: usize> Sync for ConstVec<T, N> {}
40
41impl<T, const N: usize> ConstVec<T, N> {
42    /// Creates a new empty `ConstVec`.
43    ///
44    /// # Example
45    /// ```rust
46    /// use embed_collections::const_vec::ConstVec;
47    ///
48    /// let vec: ConstVec<i32, 5> = ConstVec::new();
49    /// assert!(vec.is_empty());
50    /// assert_eq!(vec.capacity(), 5);
51    /// ```
52    #[inline(always)]
53    pub fn new() -> Self {
54        // Create an array of uninitialized values using from_fn
55        // This is safe because MaybeUninit<T> can hold uninitialized data
56        let data = core::array::from_fn(|_| MaybeUninit::uninit());
57
58        Self { data, len: 0 }
59    }
60
61    /// Returns the number of elements in the vector.
62    ///
63    /// # Example
64    /// ```rust
65    /// use embed_collections::const_vec::ConstVec;
66    ///
67    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
68    /// assert_eq!(vec.len(), 0);
69    ///
70    /// vec.push(1).unwrap();
71    /// assert_eq!(vec.len(), 1);
72    /// ```
73    #[inline(always)]
74    pub const fn len(&self) -> usize {
75        self.len
76    }
77
78    /// Returns `true` if the vector contains no elements.
79    ///
80    /// # Example
81    /// ```rust
82    /// use embed_collections::const_vec::ConstVec;
83    ///
84    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
85    /// assert!(vec.is_empty());
86    ///
87    /// vec.push(1).unwrap();
88    /// assert!(!vec.is_empty());
89    /// ```
90    #[inline(always)]
91    pub const fn is_empty(&self) -> bool {
92        self.len == 0
93    }
94
95    /// Returns the capacity of the vector.
96    ///
97    /// # Example
98    /// ```rust
99    /// use embed_collections::const_vec::ConstVec;
100    ///
101    /// let vec: ConstVec<i32, 5> = ConstVec::new();
102    /// assert_eq!(vec.capacity(), 5);
103    /// ```
104    #[inline(always)]
105    pub const fn capacity(&self) -> usize {
106        N
107    }
108
109    /// Returns `true` if the vector is at full capacity.
110    ///
111    /// # Example
112    /// ```rust
113    /// use embed_collections::const_vec::ConstVec;
114    ///
115    /// let mut vec: ConstVec<i32, 2> = ConstVec::new();
116    /// assert!(!vec.is_full());
117    ///
118    /// vec.push(1).unwrap();
119    /// vec.push(2).unwrap();
120    /// assert!(vec.is_full());
121    /// ```
122    #[inline(always)]
123    pub const fn is_full(&self) -> bool {
124        self.len == N
125    }
126
127    /// Appends an element to the back of the vector.
128    ///
129    /// Returns `Ok(())` if the element was successfully added, or `Err(item)`
130    /// if the vector is at full capacity.
131    ///
132    /// # Example
133    /// ```rust
134    /// use embed_collections::const_vec::ConstVec;
135    ///
136    /// let mut vec: ConstVec<i32, 2> = ConstVec::new();
137    ///
138    /// assert!(vec.push(1).is_ok());
139    /// assert!(vec.push(2).is_ok());
140    /// assert!(vec.push(3).is_err()); // Capacity exceeded
141    ///
142    /// assert_eq!(vec.len(), 2);
143    /// ```
144    #[inline]
145    pub fn push(&mut self, item: T) -> Result<(), T> {
146        if self.len < N {
147            // Safe because we're writing to an uninitialized slot and we've checked the bounds
148            self.data[self.len] = MaybeUninit::new(item);
149            self.len += 1;
150            Ok(())
151        } else {
152            Err(item)
153        }
154    }
155
156    /// Removes and returns the last element from the vector.
157    ///
158    /// Returns `Some(item)` if the vector is not empty, or `None` if it is empty.
159    ///
160    /// # Example
161    /// ```rust
162    /// use embed_collections::const_vec::ConstVec;
163    ///
164    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
165    /// vec.push(1).unwrap();
166    /// vec.push(2).unwrap();
167    ///
168    /// assert_eq!(vec.pop(), Some(2));
169    /// assert_eq!(vec.pop(), Some(1));
170    /// assert_eq!(vec.pop(), None);
171    /// ```
172    #[inline]
173    pub fn pop(&mut self) -> Option<T> {
174        if self.len > 0 {
175            self.len -= 1;
176            // Safe because we've checked that len > 0, so this slot is initialized
177            let item = unsafe { self.data[self.len].assume_init_read() };
178            Some(item)
179        } else {
180            None
181        }
182    }
183
184    /// Returns a reference to the element at the given index.
185    ///
186    /// Returns `None` if the index is out of bounds.
187    ///
188    /// # Example
189    /// ```rust
190    /// use embed_collections::const_vec::ConstVec;
191    ///
192    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
193    /// vec.push(10).unwrap();
194    /// vec.push(20).unwrap();
195    ///
196    /// assert_eq!(vec.get(0), Some(&10));
197    /// assert_eq!(vec.get(1), Some(&20));
198    /// assert_eq!(vec.get(2), None);
199    /// ```
200    #[inline]
201    pub fn get(&self, index: usize) -> Option<&T> {
202        if index < self.len {
203            // Safe because we've checked the bounds and we only initialize up to len
204            Some(unsafe { self.data[index].assume_init_ref() })
205        } else {
206            None
207        }
208    }
209
210    /// Returns a mutable reference to the element at the given index.
211    ///
212    /// Returns `None` if the index is out of bounds.
213    ///
214    /// # Example
215    /// ```rust
216    /// use embed_collections::const_vec::ConstVec;
217    ///
218    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
219    /// vec.push(10).unwrap();
220    ///
221    /// if let Some(elem) = vec.get_mut(0) {
222    ///     *elem = 30;
223    /// }
224    ///
225    /// assert_eq!(vec.get(0), Some(&30));
226    /// ```
227    #[inline]
228    pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
229        if index < self.len {
230            // Safe because we've checked the bounds and we only initialize up to len
231            Some(unsafe { self.data[index].assume_init_mut() })
232        } else {
233            None
234        }
235    }
236
237    /// Inserts an element at the specified index.
238    ///
239    /// If the index is greater than the length, returns `None`.
240    ///
241    /// If the vector is not full, the element is inserted and all elements
242    /// from the index onward are shifted right by one, and `None` is returned.
243    ///
244    /// If the vector is full, the element is inserted, all elements from the
245    /// index onward are shifted right by one, the last element is removed and
246    /// returned in `Some`.
247    ///
248    /// # Example
249    /// ```rust
250    /// use embed_collections::const_vec::ConstVec;
251    ///
252    /// let mut vec: ConstVec<i32, 4> = ConstVec::new();
253    /// vec.push(1).expect("push failed");
254    /// vec.push(2).expect("push failed");
255    /// vec.push(3).expect("push failed");
256    ///
257    /// // Insert at index 1 (not full)
258    /// assert_eq!(vec.insert(1, 10), None);
259    /// assert_eq!(vec.get(0), Some(&1));
260    /// assert_eq!(vec.get(1), Some(&10));
261    /// assert_eq!(vec.get(2), Some(&2));
262    /// assert_eq!(vec.get(3), Some(&3));
263    ///
264    /// // Insert when full - removes last element
265    /// let removed = vec.insert(2, 20);
266    /// assert_eq!(removed, Some(3));
267    /// assert_eq!(vec.get(0), Some(&1));
268    /// assert_eq!(vec.get(1), Some(&10));
269    /// assert_eq!(vec.get(2), Some(&20));
270    /// assert_eq!(vec.get(3), Some(&2));
271    /// ```
272    #[inline]
273    pub fn insert(&mut self, index: usize, item: T) -> Option<T> {
274        if index > self.len {
275            // Invalid index
276            return None;
277        }
278
279        if self.len < N {
280            // Not full, shift elements to the right
281            // Start from the end and move backwards
282            for i in (index..self.len).rev() {
283                unsafe {
284                    let src = self.data[i].as_ptr();
285                    let dst = self.data[i + 1].as_mut_ptr();
286                    core::ptr::copy_nonoverlapping(src, dst, 1);
287                }
288            }
289            // Insert the new element
290            self.data[index] = MaybeUninit::new(item);
291            self.len += 1;
292            None
293        } else {
294            // Full, need to remove the last element
295            // Save the last element to return
296            let last_item = unsafe { self.data[N - 1].assume_init_read() };
297
298            // Shift elements from index to N-2 to the right
299            for i in (index..N - 1).rev() {
300                unsafe {
301                    let src = self.data[i].as_ptr();
302                    let dst = self.data[i + 1].as_mut_ptr();
303                    core::ptr::copy_nonoverlapping(src, dst, 1);
304                }
305            }
306
307            // Insert the new element
308            self.data[index] = MaybeUninit::new(item);
309
310            Some(last_item)
311        }
312    }
313
314    /// Returns an iterator over the elements of the vector.
315    ///
316    /// # Example
317    /// ```rust
318    /// use embed_collections::const_vec::ConstVec;
319    ///
320    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
321    /// vec.push(1).expect("push failed");
322    /// vec.push(2).expect("push failed");
323    /// vec.push(3).expect("push failed");
324    ///
325    /// let mut iter = vec.iter();
326    /// assert_eq!(iter.next(), Some(&1));
327    /// assert_eq!(iter.next(), Some(&2));
328    /// assert_eq!(iter.next(), Some(&3));
329    /// assert_eq!(iter.next(), None);
330    /// ```
331    #[inline]
332    pub fn iter(&self) -> slice::Iter<'_, T> {
333        self.deref().iter()
334    }
335
336    /// Returns a mutable iterator over the elements of the vector.
337    ///
338    /// # Example
339    /// ```rust
340    /// use embed_collections::const_vec::ConstVec;
341    ///
342    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
343    /// vec.push(1).expect("push failed");
344    /// vec.push(2).expect("push failed");
345    /// vec.push(3).expect("push failed");
346    ///
347    /// for elem in vec.iter_mut() {
348    ///     *elem *= 2;
349    /// }
350    ///
351    /// assert_eq!(vec.get(0), Some(&2));
352    /// assert_eq!(vec.get(1), Some(&4));
353    /// assert_eq!(vec.get(2), Some(&6));
354    /// ```
355    #[inline]
356    pub fn iter_mut(&mut self) -> slice::IterMut<'_, T> {
357        self.deref_mut().iter_mut()
358    }
359}
360
361impl<T, const N: usize> Deref for ConstVec<T, N> {
362    type Target = [T];
363
364    #[inline]
365    fn deref(&self) -> &Self::Target {
366        unsafe { core::slice::from_raw_parts::<T>(self.data.as_ptr() as *const T, self.len) }
367    }
368}
369
370impl<T, const N: usize> DerefMut for ConstVec<T, N> {
371    #[inline]
372    fn deref_mut(&mut self) -> &mut Self::Target {
373        unsafe { core::slice::from_raw_parts_mut::<T>(self.data.as_mut_ptr() as *mut T, self.len) }
374    }
375}
376
377impl<'a, T, const N: usize> IntoIterator for &'a ConstVec<T, N> {
378    type Item = &'a T;
379    type IntoIter = slice::Iter<'a, T>;
380
381    #[inline]
382    fn into_iter(self) -> Self::IntoIter {
383        self.iter()
384    }
385}
386
387impl<'a, T, const N: usize> IntoIterator for &'a mut ConstVec<T, N> {
388    type Item = &'a mut T;
389    type IntoIter = slice::IterMut<'a, T>;
390
391    #[inline]
392    fn into_iter(self) -> Self::IntoIter {
393        self.iter_mut()
394    }
395}
396
397impl<T: fmt::Debug, const N: usize> fmt::Debug for ConstVec<T, N> {
398    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
399        f.debug_struct("ConstVec")
400            .field("len", &self.len)
401            .field("capacity", &N)
402            .field("data", &&self.data[..self.len])
403            .finish()
404    }
405}
406
407impl<T: Clone, const N: usize> Clone for ConstVec<T, N> {
408    fn clone(&self) -> Self {
409        let mut new_vec = Self::new();
410        for i in 0..self.len {
411            // Safe because we know these elements are initialized
412            let item = unsafe { self.data[i].assume_init_ref() };
413            // We know new_vec has enough capacity because N is the same
414            // This should never fail, but we use match to avoid Debug requirement
415            match new_vec.push(item.clone()) {
416                Ok(()) => {}
417                Err(_) => panic!("ConstVec clone failed: capacity exceeded"),
418            }
419        }
420        new_vec
421    }
422}
423
424impl<T: PartialEq, const N: usize> PartialEq for ConstVec<T, N> {
425    fn eq(&self, other: &Self) -> bool {
426        if self.len != other.len {
427            return false;
428        }
429        for i in 0..self.len {
430            // Safe because we know these elements are initialized
431            let a = unsafe { self.data[i].assume_init_ref() };
432            let b = unsafe { other.data[i].assume_init_ref() };
433            if a != b {
434                return false;
435            }
436        }
437        true
438    }
439}
440
441impl<T: Eq, const N: usize> Eq for ConstVec<T, N> {}
442
443impl<T, const N: usize> Default for ConstVec<T, N> {
444    fn default() -> Self {
445        Self::new()
446    }
447}
448
449impl<T, const N: usize> core::ops::Index<usize> for ConstVec<T, N> {
450    type Output = T;
451
452    /// Returns a reference to the element at the given index.
453    ///
454    /// # Panics
455    /// Panics if the index is out of bounds.
456    ///
457    /// # Example
458    /// ```rust
459    /// use embed_collections::const_vec::ConstVec;
460    ///
461    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
462    /// vec.push(10).expect("push failed");
463    /// vec.push(20).expect("push failed");
464    ///
465    /// assert_eq!(vec[0], 10);
466    /// assert_eq!(vec[1], 20);
467    /// ```
468    #[inline]
469    fn index(&self, index: usize) -> &Self::Output {
470        self.get(index).expect("index out of bounds")
471    }
472}
473
474impl<T, const N: usize> core::ops::IndexMut<usize> for ConstVec<T, N> {
475    /// Returns a mutable reference to the element at the given index.
476    ///
477    /// # Panics
478    /// Panics if the index is out of bounds.
479    ///
480    /// # Example
481    /// ```rust
482    /// use embed_collections::const_vec::ConstVec;
483    ///
484    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
485    /// vec.push(10).expect("push failed");
486    /// vec.push(20).expect("push failed");
487    ///
488    /// vec[0] = 30;
489    /// assert_eq!(vec[0], 30);
490    /// ```
491    #[inline]
492    fn index_mut(&mut self, index: usize) -> &mut Self::Output {
493        self.get_mut(index).expect("index out of bounds")
494    }
495}
496
497impl<T, const N: usize> Drop for ConstVec<T, N> {
498    fn drop(&mut self) {
499        // Drop all initialized elements
500        for i in 0..self.len {
501            unsafe {
502                self.data[i].assume_init_drop();
503            }
504        }
505    }
506}
507
508#[cfg(test)]
509mod tests {
510    use super::*;
511
512    #[test]
513    fn test_new() {
514        let vec: ConstVec<i32, 5> = ConstVec::new();
515        assert!(vec.is_empty());
516        assert_eq!(vec.len(), 0);
517        assert_eq!(vec.capacity(), 5);
518        assert!(!vec.is_full());
519    }
520
521    #[test]
522    fn test_push_pop() {
523        let mut vec: ConstVec<i32, 3> = ConstVec::new();
524
525        assert!(vec.push(1).is_ok());
526        assert!(vec.push(2).is_ok());
527        assert!(vec.push(3).is_ok());
528        assert!(vec.is_full());
529        assert_eq!(vec.len(), 3);
530
531        // Try to push when full
532        assert_eq!(vec.push(4), Err(4));
533        assert_eq!(vec.len(), 3);
534
535        // Pop elements
536        assert_eq!(vec.pop(), Some(3));
537        assert_eq!(vec.pop(), Some(2));
538        assert_eq!(vec.pop(), Some(1));
539        assert_eq!(vec.pop(), None);
540        assert!(vec.is_empty());
541
542        // Can push again after popping
543        assert!(vec.push(10).is_ok());
544        assert_eq!(vec.pop(), Some(10));
545    }
546
547    #[test]
548    fn test_get() {
549        let mut vec: ConstVec<i32, 5> = ConstVec::new();
550
551        vec.push(10).expect("push failed");
552        vec.push(20).expect("push failed");
553        vec.push(30).expect("push failed");
554
555        assert_eq!(vec.get(0), Some(&10));
556        assert_eq!(vec.get(1), Some(&20));
557        assert_eq!(vec.get(2), Some(&30));
558        assert_eq!(vec.get(3), None);
559        assert_eq!(vec.get(100), None);
560    }
561
562    #[test]
563    fn test_get_mut() {
564        let mut vec: ConstVec<i32, 5> = ConstVec::new();
565
566        vec.push(10).expect("push failed");
567        vec.push(20).expect("push failed");
568
569        if let Some(elem) = vec.get_mut(0) {
570            *elem = 100;
571        }
572
573        assert_eq!(vec.get(0), Some(&100));
574        assert_eq!(vec.get(1), Some(&20));
575    }
576
577    #[test]
578    fn test_is_full() {
579        let mut vec: ConstVec<i32, 2> = ConstVec::new();
580
581        assert!(!vec.is_full());
582        vec.push(1).expect("push failed");
583        assert!(!vec.is_full());
584        vec.push(2).expect("push failed");
585        assert!(vec.is_full());
586
587        vec.pop();
588        assert!(!vec.is_full());
589    }
590
591    #[test]
592    fn test_clone() {
593        let mut vec: ConstVec<i32, 5> = ConstVec::new();
594        vec.push(1).expect("push failed");
595        vec.push(2).expect("push failed");
596        vec.push(3).expect("push failed");
597
598        let cloned = vec.clone();
599        assert_eq!(cloned.len(), 3);
600        assert_eq!(cloned.get(0), Some(&1));
601        assert_eq!(cloned.get(1), Some(&2));
602        assert_eq!(cloned.get(2), Some(&3));
603    }
604
605    #[test]
606    fn test_eq() {
607        let mut vec1: ConstVec<i32, 5> = ConstVec::new();
608        vec1.push(1).expect("push failed");
609        vec1.push(2).expect("push failed");
610
611        let mut vec2: ConstVec<i32, 5> = ConstVec::new();
612        vec2.push(1).expect("push failed");
613        vec2.push(2).expect("push failed");
614
615        let mut vec3: ConstVec<i32, 5> = ConstVec::new();
616        vec3.push(1).expect("push failed");
617        vec3.push(3).expect("push failed");
618
619        assert_eq!(vec1, vec2);
620        assert_ne!(vec1, vec3);
621    }
622
623    #[test]
624    fn test_debug() {
625        let mut vec: ConstVec<i32, 5> = ConstVec::new();
626        vec.push(1).expect("push failed");
627        vec.push(2).expect("push failed");
628
629        let debug_str = format!("{:?}", vec);
630        assert!(debug_str.contains("ConstVec"));
631        assert!(debug_str.contains("len"));
632        assert!(debug_str.contains("capacity"));
633    }
634
635    #[test]
636    fn test_default() {
637        let vec: ConstVec<i32, 5> = ConstVec::default();
638        assert!(vec.is_empty());
639        assert_eq!(vec.capacity(), 5);
640    }
641
642    #[test]
643    fn test_drop() {
644        use crate::test::{CounterI32, alive_count, reset_alive_count};
645
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}