@@ -648,3 +648,173 @@ impl_slice_eq! {
648
648
[ A : Allocator , const N : usize ] Vec <T , A >, [ U ; N ] ,
649
649
[ A : Allocator , const N : usize ] Vec <T , A >, & [ U ; N ] ,
650
650
}
651
+
652
+ impl < ' a , T , A > IntoIterator for & ' a Vec < T , A >
653
+ where
654
+ A : Allocator ,
655
+ {
656
+ type Item = & ' a T ;
657
+ type IntoIter = slice:: Iter < ' a , T > ;
658
+
659
+ fn into_iter ( self ) -> Self :: IntoIter {
660
+ self . iter ( )
661
+ }
662
+ }
663
+
664
+ impl < ' a , T , A : Allocator > IntoIterator for & ' a mut Vec < T , A >
665
+ where
666
+ A : Allocator ,
667
+ {
668
+ type Item = & ' a mut T ;
669
+ type IntoIter = slice:: IterMut < ' a , T > ;
670
+
671
+ fn into_iter ( self ) -> Self :: IntoIter {
672
+ self . iter_mut ( )
673
+ }
674
+ }
675
+
676
+ /// An [`Iterator`] implementation for [`Vec`] that moves elements out of a vector.
677
+ ///
678
+ /// This structure is created by the [`Vec::into_iter`] method on [`Vec`] (provided by the
679
+ /// [`IntoIterator`] trait).
680
+ ///
681
+ /// # Examples
682
+ ///
683
+ /// ```
684
+ /// let v = kernel::kvec![0, 1, 2]?;
685
+ /// let iter = v.into_iter();
686
+ ///
687
+ /// # Ok::<(), Error>(())
688
+ /// ```
689
+ pub struct IntoIter < T , A : Allocator > {
690
+ ptr : * mut T ,
691
+ buf : NonNull < T > ,
692
+ len : usize ,
693
+ layout : ArrayLayout < T > ,
694
+ _p : PhantomData < A > ,
695
+ }
696
+
697
+ impl < T , A > Iterator for IntoIter < T , A >
698
+ where
699
+ A : Allocator ,
700
+ {
701
+ type Item = T ;
702
+
703
+ /// # Examples
704
+ ///
705
+ /// ```
706
+ /// let v = kernel::kvec![1, 2, 3]?;
707
+ /// let mut it = v.into_iter();
708
+ ///
709
+ /// assert_eq!(it.next(), Some(1));
710
+ /// assert_eq!(it.next(), Some(2));
711
+ /// assert_eq!(it.next(), Some(3));
712
+ /// assert_eq!(it.next(), None);
713
+ ///
714
+ /// # Ok::<(), Error>(())
715
+ /// ```
716
+ fn next ( & mut self ) -> Option < T > {
717
+ if self . len == 0 {
718
+ return None ;
719
+ }
720
+
721
+ let current = self . ptr ;
722
+
723
+ // SAFETY: We can't overflow; decreasing `self.len` by one every time we advance `self.ptr`
724
+ // by one guarantees that.
725
+ unsafe { self . ptr = self . ptr . add ( 1 ) } ;
726
+
727
+ self . len -= 1 ;
728
+
729
+ // SAFETY: `current` is guaranteed to point at a valid element within the buffer.
730
+ Some ( unsafe { current. read ( ) } )
731
+ }
732
+
733
+ /// # Examples
734
+ ///
735
+ /// ```
736
+ /// let v: KVec<u32> = kernel::kvec![1, 2, 3]?;
737
+ /// let mut iter = v.into_iter();
738
+ /// let size = iter.size_hint().0;
739
+ ///
740
+ /// iter.next();
741
+ /// assert_eq!(iter.size_hint().0, size - 1);
742
+ ///
743
+ /// iter.next();
744
+ /// assert_eq!(iter.size_hint().0, size - 2);
745
+ ///
746
+ /// iter.next();
747
+ /// assert_eq!(iter.size_hint().0, size - 3);
748
+ ///
749
+ /// # Ok::<(), Error>(())
750
+ /// ```
751
+ fn size_hint ( & self ) -> ( usize , Option < usize > ) {
752
+ ( self . len , Some ( self . len ) )
753
+ }
754
+ }
755
+
756
+ impl < T , A > Drop for IntoIter < T , A >
757
+ where
758
+ A : Allocator ,
759
+ {
760
+ fn drop ( & mut self ) {
761
+ // SAFETY: `self.ptr` is guaranteed to be valid by the type invariant.
762
+ unsafe { ptr:: drop_in_place ( ptr:: slice_from_raw_parts_mut ( self . ptr , self . len ) ) } ;
763
+
764
+ // SAFETY:
765
+ // - `self.buf` was previously allocated with `A`.
766
+ // - `self.layout` matches the `ArrayLayout` of the preceeding allocation.
767
+ unsafe { A :: free ( self . buf . cast ( ) , self . layout . into ( ) ) } ;
768
+ }
769
+ }
770
+
771
+ impl < T , A > IntoIterator for Vec < T , A >
772
+ where
773
+ A : Allocator ,
774
+ {
775
+ type Item = T ;
776
+ type IntoIter = IntoIter < T , A > ;
777
+
778
+ /// Consumes the `Vec<T, A>` and creates an `Iterator`, which moves each value out of the
779
+ /// vector (from start to end).
780
+ ///
781
+ /// # Examples
782
+ ///
783
+ /// ```
784
+ /// let v = kernel::kvec![1, 2]?;
785
+ /// let mut v_iter = v.into_iter();
786
+ ///
787
+ /// let first_element: Option<u32> = v_iter.next();
788
+ ///
789
+ /// assert_eq!(first_element, Some(1));
790
+ /// assert_eq!(v_iter.next(), Some(2));
791
+ /// assert_eq!(v_iter.next(), None);
792
+ ///
793
+ /// # Ok::<(), Error>(())
794
+ /// ```
795
+ ///
796
+ /// ```
797
+ /// let v = kernel::kvec![];
798
+ /// let mut v_iter = v.into_iter();
799
+ ///
800
+ /// let first_element: Option<u32> = v_iter.next();
801
+ ///
802
+ /// assert_eq!(first_element, None);
803
+ ///
804
+ /// # Ok::<(), Error>(())
805
+ /// ```
806
+ #[ inline]
807
+ fn into_iter ( self ) -> Self :: IntoIter {
808
+ let buf = self . ptr ;
809
+ let layout = self . layout ;
810
+ let ( ptr, len, _) = self . into_raw_parts ( ) ;
811
+
812
+ IntoIter {
813
+ ptr,
814
+ buf,
815
+ len,
816
+ layout,
817
+ _p : PhantomData :: < A > ,
818
+ }
819
+ }
820
+ }
0 commit comments