2020//! Internally, values are stored in a single continuous allocation row-first, alongside the length
2121//! of the row.
2222
23- #![ feature( int_roundings) ]
23+ #![ feature( core_intrinsics , int_roundings) ]
2424use std:: fmt:: Debug ;
25+ use std:: intrinsics:: unlikely;
2526use std:: ops:: { Index , IndexMut } ;
2627use std:: usize;
2728
@@ -84,16 +85,11 @@ impl<T> Array2<T> {
8485 /// passed an empty vector or if the rows are a different size.
8586 #[ inline]
8687 pub fn try_from_rows ( rows : Vec < Vec < T > > ) -> Result < Self > {
87- #[ cold]
88- fn not_equal ( x : usize , y : usize ) -> bool {
89- x != y
90- }
91-
9288 let row_size = rows. first ( ) . ok_or ( Error :: Empty ) ?. len ( ) ;
9389 let mut elems = Vec :: with_capacity ( row_size * rows. len ( ) ) ;
9490
9591 for ( row_index, row) in rows. into_iter ( ) . enumerate ( ) {
96- if not_equal ( row. len ( ) , row_size) {
92+ if unlikely ( row. len ( ) != row_size) {
9793 return Err ( Error :: InconsistentRowSize {
9894 row_index,
9995 row_size,
@@ -203,7 +199,9 @@ impl<T> Array2<T> {
203199 /// );
204200 /// ```
205201 #[ inline]
206- pub fn rows ( & self ) -> impl ExactSizeIterator < Item = & [ T ] > + DoubleEndedIterator + ' _ {
202+ pub fn rows (
203+ & self ,
204+ ) -> impl Iterator < Item = & [ T ] > + ExactSizeIterator + DoubleEndedIterator + ' _ {
207205 self . cells . chunks ( self . row_size )
208206 }
209207
@@ -222,7 +220,7 @@ impl<T> Array2<T> {
222220 /// )
223221 /// ```
224222 #[ inline]
225- pub fn entries ( & self ) -> impl ExactSizeIterator < Item = ( ( usize , usize ) , & T ) > + ' _ {
223+ pub fn entries ( & self ) -> impl Iterator < Item = ( ( usize , usize ) , & T ) > + ExactSizeIterator + ' _ {
226224 self . cells . iter ( ) . enumerate ( ) . map ( move |( i, v) | {
227225 let row = i. div_floor ( self . row_size ) ;
228226 let col = i % self . row_size ;
@@ -245,7 +243,9 @@ impl<T> Array2<T> {
245243 /// assert_eq!(my_array2, Array2::from_rows(vec![vec![1, 3], vec![4, 6]]))
246244 /// ```
247245 #[ inline]
248- pub fn entries_mut ( & mut self ) -> impl ExactSizeIterator < Item = ( ( usize , usize ) , & mut T ) > + ' _ {
246+ pub fn entries_mut (
247+ & mut self ,
248+ ) -> impl Iterator < Item = ( ( usize , usize ) , & mut T ) > + ExactSizeIterator + ' _ {
249249 let row_size = self . row_size ;
250250 self . cells . iter_mut ( ) . enumerate ( ) . map ( move |( i, v) | {
251251 let row = i. div_floor ( row_size) ;
@@ -270,7 +270,7 @@ impl<T> Array2<T> {
270270 /// )
271271 /// ```
272272 #[ inline]
273- pub fn into_entries ( self ) -> impl ExactSizeIterator < Item = ( ( usize , usize ) , T ) > {
273+ pub fn into_entries ( self ) -> impl Iterator < Item = ( ( usize , usize ) , T ) > + ExactSizeIterator {
274274 self . cells
275275 . into_vec ( )
276276 . into_iter ( )
0 commit comments