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[0].as_ptr(), self.len) }
365    }
366}
367
368impl<T, const N: usize> DerefMut for ConstVec<T, N> {
369    fn deref_mut(&mut self) -> &mut Self::Target {
370        unsafe { core::slice::from_raw_parts_mut::<T>(self.data[0].as_mut_ptr(), self.len) }
371    }
372}
373
374impl<T: fmt::Debug, const N: usize> fmt::Debug for ConstVec<T, N> {
375    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
376        f.debug_struct("ConstVec")
377            .field("len", &self.len)
378            .field("capacity", &N)
379            .field("data", &&self.data[..self.len])
380            .finish()
381    }
382}
383
384impl<T: Clone, const N: usize> Clone for ConstVec<T, N> {
385    fn clone(&self) -> Self {
386        let mut new_vec = Self::new();
387        for i in 0..self.len {
388            // 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
474#[cfg(test)]
475mod tests {
476    use super::*;
477
478    #[test]
479    fn test_new() {
480        let vec: ConstVec<i32, 5> = ConstVec::new();
481        assert!(vec.is_empty());
482        assert_eq!(vec.len(), 0);
483        assert_eq!(vec.capacity(), 5);
484        assert!(!vec.is_full());
485    }
486
487    #[test]
488    fn test_push_pop() {
489        let mut vec: ConstVec<i32, 3> = ConstVec::new();
490
491        assert!(vec.push(1).is_ok());
492        assert!(vec.push(2).is_ok());
493        assert!(vec.push(3).is_ok());
494        assert!(vec.is_full());
495        assert_eq!(vec.len(), 3);
496
497        // Try to push when full
498        assert_eq!(vec.push(4), Err(4));
499        assert_eq!(vec.len(), 3);
500
501        // Pop elements
502        assert_eq!(vec.pop(), Some(3));
503        assert_eq!(vec.pop(), Some(2));
504        assert_eq!(vec.pop(), Some(1));
505        assert_eq!(vec.pop(), None);
506        assert!(vec.is_empty());
507
508        // Can push again after popping
509        assert!(vec.push(10).is_ok());
510        assert_eq!(vec.pop(), Some(10));
511    }
512
513    #[test]
514    fn test_get() {
515        let mut vec: ConstVec<i32, 5> = ConstVec::new();
516
517        vec.push(10).expect("push failed");
518        vec.push(20).expect("push failed");
519        vec.push(30).expect("push failed");
520
521        assert_eq!(vec.get(0), Some(&10));
522        assert_eq!(vec.get(1), Some(&20));
523        assert_eq!(vec.get(2), Some(&30));
524        assert_eq!(vec.get(3), None);
525        assert_eq!(vec.get(100), None);
526    }
527
528    #[test]
529    fn test_get_mut() {
530        let mut vec: ConstVec<i32, 5> = ConstVec::new();
531
532        vec.push(10).expect("push failed");
533        vec.push(20).expect("push failed");
534
535        if let Some(elem) = vec.get_mut(0) {
536            *elem = 100;
537        }
538
539        assert_eq!(vec.get(0), Some(&100));
540        assert_eq!(vec.get(1), Some(&20));
541    }
542
543    #[test]
544    fn test_is_full() {
545        let mut vec: ConstVec<i32, 2> = ConstVec::new();
546
547        assert!(!vec.is_full());
548        vec.push(1).expect("push failed");
549        assert!(!vec.is_full());
550        vec.push(2).expect("push failed");
551        assert!(vec.is_full());
552
553        vec.pop();
554        assert!(!vec.is_full());
555    }
556
557    #[test]
558    fn test_clone() {
559        let mut vec: ConstVec<i32, 5> = ConstVec::new();
560        vec.push(1).expect("push failed");
561        vec.push(2).expect("push failed");
562        vec.push(3).expect("push failed");
563
564        let cloned = vec.clone();
565        assert_eq!(cloned.len(), 3);
566        assert_eq!(cloned.get(0), Some(&1));
567        assert_eq!(cloned.get(1), Some(&2));
568        assert_eq!(cloned.get(2), Some(&3));
569    }
570
571    #[test]
572    fn test_eq() {
573        let mut vec1: ConstVec<i32, 5> = ConstVec::new();
574        vec1.push(1).expect("push failed");
575        vec1.push(2).expect("push failed");
576
577        let mut vec2: ConstVec<i32, 5> = ConstVec::new();
578        vec2.push(1).expect("push failed");
579        vec2.push(2).expect("push failed");
580
581        let mut vec3: ConstVec<i32, 5> = ConstVec::new();
582        vec3.push(1).expect("push failed");
583        vec3.push(3).expect("push failed");
584
585        assert_eq!(vec1, vec2);
586        assert_ne!(vec1, vec3);
587    }
588
589    #[test]
590    fn test_debug() {
591        let mut vec: ConstVec<i32, 5> = ConstVec::new();
592        vec.push(1).expect("push failed");
593        vec.push(2).expect("push failed");
594
595        let debug_str = format!("{:?}", vec);
596        assert!(debug_str.contains("ConstVec"));
597        assert!(debug_str.contains("len"));
598        assert!(debug_str.contains("capacity"));
599    }
600
601    #[test]
602    fn test_default() {
603        let vec: ConstVec<i32, 5> = ConstVec::default();
604        assert!(vec.is_empty());
605        assert_eq!(vec.capacity(), 5);
606    }
607
608    #[test]
609    fn test_drop() {
610        use std::cell::Cell;
611
612        #[derive(Debug)]
613        struct DropCounter<'a> {
614            count: &'a Cell<i32>,
615        }
616
617        impl<'a> Drop for DropCounter<'a> {
618            fn drop(&mut self) {
619                self.count.set(self.count.get() + 1);
620            }
621        }
622
623        let count = Cell::new(0);
624        {
625            let mut vec: ConstVec<DropCounter, 3> = ConstVec::new();
626            vec.push(DropCounter { count: &count }).expect("push failed");
627            vec.push(DropCounter { count: &count }).expect("push failed");
628            vec.push(DropCounter { count: &count }).expect("push failed");
629            assert_eq!(count.get(), 0);
630        }
631        assert_eq!(count.get(), 3);
632    }
633
634    #[test]
635    fn test_insert_not_full() {
636        let mut vec: ConstVec<i32, 5> = ConstVec::new();
637        vec.push(1).expect("push failed");
638        vec.push(2).expect("push failed");
639        vec.push(3).expect("push failed");
640
641        // Insert at index 1, not full
642        assert_eq!(vec.insert(1, 10), None);
643        assert_eq!(vec.len(), 4);
644        assert_eq!(vec.get(0), Some(&1));
645        assert_eq!(vec.get(1), Some(&10));
646        assert_eq!(vec.get(2), Some(&2));
647        assert_eq!(vec.get(3), Some(&3));
648        assert_eq!(vec.get(4), None);
649
650        // Insert at beginning
651        assert_eq!(vec.insert(0, 20), None);
652        assert_eq!(vec.len(), 5);
653        assert_eq!(vec.get(0), Some(&20));
654        assert_eq!(vec.get(1), Some(&1));
655        assert_eq!(vec.get(2), Some(&10));
656        assert_eq!(vec.get(3), Some(&2));
657        assert_eq!(vec.get(4), Some(&3));
658        assert!(vec.is_full());
659    }
660
661    #[test]
662    fn test_insert_full() {
663        let mut vec: ConstVec<i32, 4> = ConstVec::new();
664        vec.push(1).expect("push failed");
665        vec.push(2).expect("push failed");
666        vec.push(3).expect("push failed");
667        vec.push(4).expect("push failed");
668        assert!(vec.is_full());
669
670        // Insert at index 1 when full, should remove last element (4)
671        let removed = vec.insert(1, 10);
672        assert_eq!(removed, Some(4));
673        assert_eq!(vec.len(), 4); // Still full
674        assert_eq!(vec.get(0), Some(&1));
675        assert_eq!(vec.get(1), Some(&10));
676        assert_eq!(vec.get(2), Some(&2));
677        assert_eq!(vec.get(3), Some(&3));
678
679        // Insert at beginning when full, should remove last element (3)
680        let removed = vec.insert(0, 20);
681        assert_eq!(removed, Some(3));
682        assert_eq!(vec.len(), 4);
683        assert_eq!(vec.get(0), Some(&20));
684        assert_eq!(vec.get(1), Some(&1));
685        assert_eq!(vec.get(2), Some(&10));
686        assert_eq!(vec.get(3), Some(&2));
687    }
688
689    #[test]
690    fn test_insert_at_end() {
691        let mut vec: ConstVec<i32, 4> = ConstVec::new();
692        vec.push(1).expect("push failed");
693        vec.push(2).expect("push failed");
694
695        // Insert at end (index == len)
696        assert_eq!(vec.insert(2, 10), None);
697        assert_eq!(vec.len(), 3);
698        assert_eq!(vec.get(0), Some(&1));
699        assert_eq!(vec.get(1), Some(&2));
700        assert_eq!(vec.get(2), Some(&10));
701    }
702
703    #[test]
704    fn test_insert_invalid_index() {
705        let mut vec: ConstVec<i32, 4> = ConstVec::new();
706        vec.push(1).expect("push failed");
707        vec.push(2).expect("push failed");
708
709        // Insert at invalid index (greater than len)
710        assert_eq!(vec.insert(5, 10), None);
711        assert_eq!(vec.len(), 2); // Unchanged
712        assert_eq!(vec.get(0), Some(&1));
713        assert_eq!(vec.get(1), Some(&2));
714    }
715
716    #[test]
717    fn test_insert_empty() {
718        let mut vec: ConstVec<i32, 4> = ConstVec::new();
719
720        // Insert into empty vector
721        assert_eq!(vec.insert(0, 10), None);
722        assert_eq!(vec.len(), 1);
723        assert_eq!(vec.get(0), Some(&10));
724    }
725
726    #[test]
727    fn test_iter() {
728        let mut vec: ConstVec<i32, 5> = ConstVec::new();
729        vec.push(1).expect("push failed");
730        vec.push(2).expect("push failed");
731        vec.push(3).expect("push failed");
732
733        let mut iter = vec.iter();
734        assert_eq!(iter.next(), Some(&1));
735        assert_eq!(iter.next(), Some(&2));
736        assert_eq!(iter.next(), Some(&3));
737        assert_eq!(iter.next(), None);
738
739        // Check size_hint
740        let mut iter2 = vec.iter();
741        assert_eq!(iter2.size_hint(), (3, Some(3)));
742        iter2.next();
743        assert_eq!(iter2.size_hint(), (2, Some(2)));
744    }
745
746    #[test]
747    fn test_iter_mut() {
748        let mut vec: ConstVec<i32, 5> = ConstVec::new();
749        vec.push(1).expect("push failed");
750        vec.push(2).expect("push failed");
751        vec.push(3).expect("push failed");
752
753        // Double each element
754        for elem in vec.iter_mut() {
755            *elem *= 2;
756        }
757
758        assert_eq!(vec.get(0), Some(&2));
759        assert_eq!(vec.get(1), Some(&4));
760        assert_eq!(vec.get(2), Some(&6));
761
762        // Check iterator works correctly
763        let mut iter = vec.iter_mut();
764        assert_eq!(iter.next(), Some(&mut 2));
765        assert_eq!(iter.next(), Some(&mut 4));
766        assert_eq!(iter.next(), Some(&mut 6));
767        assert_eq!(iter.next(), None);
768    }
769
770    #[test]
771    fn test_index() {
772        let mut vec: ConstVec<i32, 5> = ConstVec::new();
773        vec.push(10).expect("push failed");
774        vec.push(20).expect("push failed");
775        vec.push(30).expect("push failed");
776
777        assert_eq!(vec[0], 10);
778        assert_eq!(vec[1], 20);
779        assert_eq!(vec[2], 30);
780
781        // Test with a function that uses indexing
782        fn get_element(vec: &ConstVec<i32, 5>, index: usize) -> i32 {
783            vec[index]
784        }
785
786        assert_eq!(get_element(&vec, 1), 20);
787    }
788
789    #[test]
790    fn test_index_mut() {
791        let mut vec: ConstVec<i32, 5> = ConstVec::new();
792        vec.push(10).expect("push failed");
793        vec.push(20).expect("push failed");
794
795        vec[0] = 100;
796        vec[1] = 200;
797
798        assert_eq!(vec[0], 100);
799        assert_eq!(vec[1], 200);
800
801        // Test with a function that uses mutable indexing
802        fn double_first(vec: &mut ConstVec<i32, 5>) {
803            vec[0] *= 2;
804        }
805
806        double_first(&mut vec);
807        assert_eq!(vec[0], 200);
808    }
809
810    #[test]
811    #[should_panic(expected = "index out of bounds")]
812    fn test_index_out_of_bounds() {
813        let mut vec: ConstVec<i32, 5> = ConstVec::new();
814        vec.push(10).expect("push failed");
815
816        let _ = vec[5]; // Should panic
817    }
818
819    #[test]
820    #[should_panic(expected = "index out of bounds")]
821    fn test_index_mut_out_of_bounds() {
822        let mut vec: ConstVec<i32, 5> = ConstVec::new();
823        vec.push(10).expect("push failed");
824
825        vec[5] = 20; // Should panic
826    }
827
828    #[test]
829    fn test_empty_iter() {
830        let vec: ConstVec<i32, 5> = ConstVec::new();
831        let mut iter = vec.iter();
832
833        assert_eq!(iter.next(), None);
834        assert_eq!(iter.size_hint(), (0, Some(0)));
835    }
836
837    #[test]
838    fn test_iter_exact_size() {
839        let mut vec: ConstVec<i32, 5> = ConstVec::new();
840        vec.push(1).expect("push failed");
841        vec.push(2).expect("push failed");
842        vec.push(3).expect("push failed");
843
844        let iter = vec.iter();
845        assert_eq!(iter.len(), 3); // ExactSizeIterator provides len()
846
847        let iter_mut = vec.iter_mut();
848        assert_eq!(iter_mut.len(), 3);
849    }
850}
851
852impl<T, const N: usize> Drop for ConstVec<T, N> {
853    fn drop(&mut self) {
854        // Drop all initialized elements
855        for i in 0..self.len {
856            unsafe {
857                self.data[i].assume_init_drop();
858            }
859        }
860    }
861}