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};
28
29/// A fixed-size **inline** vector with const generic capacity
30pub struct ConstVec<T, const N: usize> {
31    // Storage for elements, using MaybeUninit to handle uninitialized memory
32    data: [MaybeUninit<T>; N],
33    // Current number of elements in the vector
34    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    /// Creates a new empty `ConstVec`.
42    ///
43    /// # Example
44    /// ```rust
45    /// use embed_collections::const_vec::ConstVec;
46    ///
47    /// let vec: ConstVec<i32, 5> = ConstVec::new();
48    /// assert!(vec.is_empty());
49    /// assert_eq!(vec.capacity(), 5);
50    /// ```
51    #[inline(always)]
52    pub fn new() -> Self {
53        // Create an array of uninitialized values using from_fn
54        // This is safe because MaybeUninit<T> can hold uninitialized data
55        let data = core::array::from_fn(|_| MaybeUninit::uninit());
56
57        Self { data, len: 0 }
58    }
59
60    /// Returns the number of elements in the vector.
61    ///
62    /// # Example
63    /// ```rust
64    /// use embed_collections::const_vec::ConstVec;
65    ///
66    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
67    /// assert_eq!(vec.len(), 0);
68    ///
69    /// vec.push(1).unwrap();
70    /// assert_eq!(vec.len(), 1);
71    /// ```
72    #[inline(always)]
73    pub const fn len(&self) -> usize {
74        self.len
75    }
76
77    /// Returns `true` if the vector contains no elements.
78    ///
79    /// # Example
80    /// ```rust
81    /// use embed_collections::const_vec::ConstVec;
82    ///
83    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
84    /// assert!(vec.is_empty());
85    ///
86    /// vec.push(1).unwrap();
87    /// assert!(!vec.is_empty());
88    /// ```
89    #[inline(always)]
90    pub const fn is_empty(&self) -> bool {
91        self.len == 0
92    }
93
94    /// Returns the capacity of the vector.
95    ///
96    /// # Example
97    /// ```rust
98    /// use embed_collections::const_vec::ConstVec;
99    ///
100    /// let vec: ConstVec<i32, 5> = ConstVec::new();
101    /// assert_eq!(vec.capacity(), 5);
102    /// ```
103    #[inline(always)]
104    pub const fn capacity(&self) -> usize {
105        N
106    }
107
108    /// Returns `true` if the vector is at full capacity.
109    ///
110    /// # Example
111    /// ```rust
112    /// use embed_collections::const_vec::ConstVec;
113    ///
114    /// let mut vec: ConstVec<i32, 2> = ConstVec::new();
115    /// assert!(!vec.is_full());
116    ///
117    /// vec.push(1).unwrap();
118    /// vec.push(2).unwrap();
119    /// assert!(vec.is_full());
120    /// ```
121    #[inline(always)]
122    pub const fn is_full(&self) -> bool {
123        self.len == N
124    }
125
126    /// Appends an element to the back of the vector.
127    ///
128    /// Returns `Ok(())` if the element was successfully added, or `Err(item)`
129    /// if the vector is at full capacity.
130    ///
131    /// # Example
132    /// ```rust
133    /// use embed_collections::const_vec::ConstVec;
134    ///
135    /// let mut vec: ConstVec<i32, 2> = ConstVec::new();
136    ///
137    /// assert!(vec.push(1).is_ok());
138    /// assert!(vec.push(2).is_ok());
139    /// assert!(vec.push(3).is_err()); // Capacity exceeded
140    ///
141    /// assert_eq!(vec.len(), 2);
142    /// ```
143    #[inline]
144    pub fn push(&mut self, item: T) -> Result<(), T> {
145        if self.len < N {
146            // Safe because we're writing to an uninitialized slot and we've checked the bounds
147            self.data[self.len] = MaybeUninit::new(item);
148            self.len += 1;
149            Ok(())
150        } else {
151            Err(item)
152        }
153    }
154
155    /// Removes and returns the last element from the vector.
156    ///
157    /// Returns `Some(item)` if the vector is not empty, or `None` if it is empty.
158    ///
159    /// # Example
160    /// ```rust
161    /// use embed_collections::const_vec::ConstVec;
162    ///
163    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
164    /// vec.push(1).unwrap();
165    /// vec.push(2).unwrap();
166    ///
167    /// assert_eq!(vec.pop(), Some(2));
168    /// assert_eq!(vec.pop(), Some(1));
169    /// assert_eq!(vec.pop(), None);
170    /// ```
171    #[inline]
172    pub fn pop(&mut self) -> Option<T> {
173        if self.len > 0 {
174            self.len -= 1;
175            // Safe because we've checked that len > 0, so this slot is initialized
176            let item = unsafe { self.data[self.len].assume_init_read() };
177            Some(item)
178        } else {
179            None
180        }
181    }
182
183    /// Returns a reference to the element at the given index.
184    ///
185    /// Returns `None` if the index is out of bounds.
186    ///
187    /// # Example
188    /// ```rust
189    /// use embed_collections::const_vec::ConstVec;
190    ///
191    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
192    /// vec.push(10).unwrap();
193    /// vec.push(20).unwrap();
194    ///
195    /// assert_eq!(vec.get(0), Some(&10));
196    /// assert_eq!(vec.get(1), Some(&20));
197    /// assert_eq!(vec.get(2), None);
198    /// ```
199    #[inline]
200    pub fn get(&self, index: usize) -> Option<&T> {
201        if index < self.len {
202            // Safe because we've checked the bounds and we only initialize up to len
203            Some(unsafe { self.data[index].assume_init_ref() })
204        } else {
205            None
206        }
207    }
208
209    /// Returns a mutable reference to the element at the given index.
210    ///
211    /// Returns `None` if the index is out of bounds.
212    ///
213    /// # Example
214    /// ```rust
215    /// use embed_collections::const_vec::ConstVec;
216    ///
217    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
218    /// vec.push(10).unwrap();
219    ///
220    /// if let Some(elem) = vec.get_mut(0) {
221    ///     *elem = 30;
222    /// }
223    ///
224    /// assert_eq!(vec.get(0), Some(&30));
225    /// ```
226    #[inline]
227    pub fn get_mut(&mut self, index: usize) -> Option<&mut T> {
228        if index < self.len {
229            // Safe because we've checked the bounds and we only initialize up to len
230            Some(unsafe { self.data[index].assume_init_mut() })
231        } else {
232            None
233        }
234    }
235
236    /// Inserts an element at the specified index.
237    ///
238    /// If the index is greater than the length, returns `None`.
239    ///
240    /// If the vector is not full, the element is inserted and all elements
241    /// from the index onward are shifted right by one, and `None` is returned.
242    ///
243    /// If the vector is full, the element is inserted, all elements from the
244    /// index onward are shifted right by one, the last element is removed and
245    /// returned in `Some`.
246    ///
247    /// # Example
248    /// ```rust
249    /// use embed_collections::const_vec::ConstVec;
250    ///
251    /// let mut vec: ConstVec<i32, 4> = ConstVec::new();
252    /// vec.push(1).expect("push failed");
253    /// vec.push(2).expect("push failed");
254    /// vec.push(3).expect("push failed");
255    ///
256    /// // Insert at index 1 (not full)
257    /// assert_eq!(vec.insert(1, 10), None);
258    /// assert_eq!(vec.get(0), Some(&1));
259    /// assert_eq!(vec.get(1), Some(&10));
260    /// assert_eq!(vec.get(2), Some(&2));
261    /// assert_eq!(vec.get(3), Some(&3));
262    ///
263    /// // Insert when full - removes last element
264    /// let removed = vec.insert(2, 20);
265    /// assert_eq!(removed, Some(3));
266    /// assert_eq!(vec.get(0), Some(&1));
267    /// assert_eq!(vec.get(1), Some(&10));
268    /// assert_eq!(vec.get(2), Some(&20));
269    /// assert_eq!(vec.get(3), Some(&2));
270    /// ```
271    #[inline]
272    pub fn insert(&mut self, index: usize, item: T) -> Option<T> {
273        if index > self.len {
274            // Invalid index
275            return None;
276        }
277
278        if self.len < N {
279            // Not full, shift elements to the right
280            // Start from the end and move backwards
281            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            // Insert the new element
289            self.data[index] = MaybeUninit::new(item);
290            self.len += 1;
291            None
292        } else {
293            // Full, need to remove the last element
294            // Save the last element to return
295            let last_item = unsafe { self.data[N - 1].assume_init_read() };
296
297            // Shift elements from index to N-2 to the right
298            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            // Insert the new element
307            self.data[index] = MaybeUninit::new(item);
308
309            Some(last_item)
310        }
311    }
312
313    /// Returns an iterator over the elements of the vector.
314    ///
315    /// # Example
316    /// ```rust
317    /// use embed_collections::const_vec::ConstVec;
318    ///
319    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
320    /// vec.push(1).expect("push failed");
321    /// vec.push(2).expect("push failed");
322    /// vec.push(3).expect("push failed");
323    ///
324    /// let mut iter = vec.iter();
325    /// assert_eq!(iter.next(), Some(&1));
326    /// assert_eq!(iter.next(), Some(&2));
327    /// assert_eq!(iter.next(), Some(&3));
328    /// assert_eq!(iter.next(), None);
329    /// ```
330    #[inline]
331    pub fn iter(&self) -> core::slice::Iter<'_, T> {
332        self.deref().iter()
333    }
334
335    /// Returns a mutable iterator over the elements of the vector.
336    ///
337    /// # Example
338    /// ```rust
339    /// use embed_collections::const_vec::ConstVec;
340    ///
341    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
342    /// vec.push(1).expect("push failed");
343    /// vec.push(2).expect("push failed");
344    /// vec.push(3).expect("push failed");
345    ///
346    /// for elem in vec.iter_mut() {
347    ///     *elem *= 2;
348    /// }
349    ///
350    /// assert_eq!(vec.get(0), Some(&2));
351    /// assert_eq!(vec.get(1), Some(&4));
352    /// assert_eq!(vec.get(2), Some(&6));
353    /// ```
354    #[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            // Safe because we know these elements are initialized
389            let item = unsafe { self.data[i].assume_init_ref() };
390            // We know new_vec has enough capacity because N is the same
391            // This should never fail, but we use match to avoid Debug requirement
392            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            // Safe because we know these elements are initialized
408            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    /// Returns a reference to the element at the given index.
430    ///
431    /// # Panics
432    /// Panics if the index is out of bounds.
433    ///
434    /// # Example
435    /// ```rust
436    /// use embed_collections::const_vec::ConstVec;
437    ///
438    /// let mut vec: ConstVec<i32, 5> = ConstVec::new();
439    /// vec.push(10).expect("push failed");
440    /// vec.push(20).expect("push failed");
441    ///
442    /// assert_eq!(vec[0], 10);
443    /// assert_eq!(vec[1], 20);
444    /// ```
445    #[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    /// Returns a mutable 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    /// vec[0] = 30;
466    /// assert_eq!(vec[0], 30);
467    /// ```
468    #[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        // Drop all initialized elements
477        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        // Try to push when full
509        assert_eq!(vec.push(4), Err(4));
510        assert_eq!(vec.len(), 3);
511
512        // Pop elements
513        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        // Can push again after popping
520        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        // Insert at index 1, not full
653        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        // Insert at beginning
662        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        // Insert at index 1 when full, should remove last element (4)
682        let removed = vec.insert(1, 10);
683        assert_eq!(removed, Some(4));
684        assert_eq!(vec.len(), 4); // Still full
685        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        // Insert at beginning when full, should remove last element (3)
691        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        // Insert at end (index == len)
707        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        // Insert at invalid index (greater than len)
721        assert_eq!(vec.insert(5, 10), None);
722        assert_eq!(vec.len(), 2); // Unchanged
723        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        // Insert into empty vector
732        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        // Check size_hint
751        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        // Double each element
765        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        // Check iterator works correctly
774        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        // Test with a function that uses indexing
793        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        // Test with a function that uses mutable indexing
813        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]; // Should panic
829    }
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; // Should panic
839    }
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); // ExactSizeIterator provides len()
859
860        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        // Test rev() on immutable iterator (slice's DoubleEndedIterator)
872        let collected: Vec<i32> = vec.iter().rev().copied().collect();
873        assert_eq!(collected, vec![3, 2, 1]);
874
875        // Test rev() on mutable iterator
876        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}