5858//! [`as_slice`]: SoAVec::as_slice
5959//! [`as_mut_slice`]: SoAVec::as_mut_slice
6060
61+ mod iter;
6162mod macros;
6263mod raw_vec;
6364mod raw_vec_inner;
@@ -66,6 +67,7 @@ mod soable;
6667use core:: marker:: PhantomData ;
6768use std:: ptr:: NonNull ;
6869
70+ use iter:: { SoAIter , SoAIterMut } ;
6971use raw_vec:: RawSoAVec ;
7072use raw_vec_inner:: AllocError ;
7173pub use soable:: { SoATuple , SoAble } ;
@@ -1100,6 +1102,52 @@ impl<T: SoAble> SoAVec<T> {
11001102 Ok ( value)
11011103 }
11021104 }
1105+
1106+ /// Returns an iterator over the soavec.
1107+ ///
1108+ /// The iterator yields all items from start to end.
1109+ ///
1110+ /// # Examples
1111+ ///
1112+ /// ```
1113+ /// use soavec::soavec;
1114+ ///
1115+ /// let vec = soavec![(1, 2), (3, 4), (5, 6)].unwrap();
1116+ /// let mut iterator = vec.iter();
1117+ ///
1118+ /// assert_eq!(iterator.next(), Some((&1, &2)));
1119+ /// assert_eq!(iterator.next(), Some((&3, &4)));
1120+ /// assert_eq!(iterator.next(), Some((&5, &6)));
1121+ /// assert_eq!(iterator.next(), None);
1122+ /// ```
1123+ #[ inline]
1124+ pub fn iter ( & self ) -> SoAIter < ' _ , T > {
1125+ SoAIter :: new ( self . buf . as_ptr ( ) , self . capacity ( ) , self . len ( ) )
1126+ }
1127+
1128+ /// Returns an iterator that allows modifying each value.
1129+ ///
1130+ /// The iterator yields all items from start to end.
1131+ ///
1132+ /// # Examples
1133+ ///
1134+ /// ```
1135+ /// use soavec::soavec;
1136+ ///
1137+ /// let mut vec = soavec![(1, 2), (3, 4), (5, 6)].unwrap();
1138+ /// for (a, b) in vec.iter_mut() {
1139+ /// *a += 10;
1140+ /// }
1141+ /// assert_eq!(vec.get(0), Some((&11, &2)));
1142+ /// assert_eq!(vec.get(1), Some((&13, &4)));
1143+ /// assert_eq!(vec.get(2), Some((&15, &6)));
1144+ /// ```
1145+ #[ inline]
1146+ pub fn iter_mut ( & mut self ) -> SoAIterMut < ' _ , T > {
1147+ let len = self . len ( ) ;
1148+ let capacity = self . capacity ( ) ;
1149+ SoAIterMut :: new ( self . buf . as_mut_ptr ( ) , capacity, len)
1150+ }
11031151}
11041152
11051153impl < T : SoAble > Drop for SoAVec < T > {
@@ -2084,4 +2132,37 @@ mod tests {
20842132 assert_eq ! ( * * third. a, 168 ) ;
20852133 assert_eq ! ( third. b, & [ 6 ] ) ;
20862134 }
2135+
2136+ #[ test]
2137+ fn test_iter ( ) {
2138+ let mut vec = SoAVec :: < ( u32 , u32 ) > :: new ( ) ;
2139+
2140+ vec. push ( ( 1 , 10 ) ) . unwrap ( ) ;
2141+ vec. push ( ( 2 , 20 ) ) . unwrap ( ) ;
2142+ vec. push ( ( 3 , 30 ) ) . unwrap ( ) ;
2143+
2144+ let mut iter = vec. iter ( ) ;
2145+ assert_eq ! ( iter. next( ) , Some ( ( & 1 , & 10 ) ) ) ;
2146+ assert_eq ! ( iter. next( ) , Some ( ( & 2 , & 20 ) ) ) ;
2147+ assert_eq ! ( iter. next( ) , Some ( ( & 3 , & 30 ) ) ) ;
2148+ assert_eq ! ( iter. next( ) , None ) ;
2149+ }
2150+
2151+ #[ test]
2152+ fn test_iter_mut ( ) {
2153+ let mut vec = SoAVec :: < ( u32 , u32 ) > :: new ( ) ;
2154+
2155+ vec. push ( ( 1 , 10 ) ) . unwrap ( ) ;
2156+ vec. push ( ( 2 , 20 ) ) . unwrap ( ) ;
2157+ vec. push ( ( 3 , 30 ) ) . unwrap ( ) ;
2158+
2159+ for ( a, b) in vec. iter_mut ( ) {
2160+ * a += 100 ;
2161+ * b += 5 ;
2162+ }
2163+
2164+ assert_eq ! ( vec. get( 0 ) , Some ( ( & 101 , & 15 ) ) ) ;
2165+ assert_eq ! ( vec. get( 1 ) , Some ( ( & 102 , & 25 ) ) ) ;
2166+ assert_eq ! ( vec. get( 2 ) , Some ( ( & 103 , & 35 ) ) ) ;
2167+ }
20872168}
0 commit comments