@@ -1405,7 +1405,12 @@ impl<T> Iterator for Values<T> {
14051405 type Item = T ;
14061406
14071407 fn next ( & mut self ) -> Option < Self :: Item > {
1408- self . iter . next ( )
1408+ if let Some ( next) = self . iter . next ( ) {
1409+ self . len -= 1 ;
1410+ Some ( next)
1411+ } else {
1412+ None
1413+ }
14091414 }
14101415 fn size_hint ( & self ) -> ( usize , Option < usize > ) {
14111416 ( self . len , Some ( self . len ) )
@@ -1414,7 +1419,12 @@ impl<T> Iterator for Values<T> {
14141419
14151420impl < T > DoubleEndedIterator for Values < T > {
14161421 fn next_back ( & mut self ) -> Option < Self :: Item > {
1417- self . iter . next_back ( )
1422+ if let Some ( next) = self . iter . next_back ( ) {
1423+ self . len -= 1 ;
1424+ Some ( next)
1425+ } else {
1426+ None
1427+ }
14181428 }
14191429}
14201430
@@ -1463,7 +1473,12 @@ impl<'a, T: 'a> Iterator for ValuesRef<'a, T> {
14631473 type Item = & ' a T ;
14641474
14651475 fn next ( & mut self ) -> Option < Self :: Item > {
1466- self . iter . next ( )
1476+ if let Some ( next) = self . iter . next ( ) {
1477+ self . len -= 1 ;
1478+ Some ( next)
1479+ } else {
1480+ None
1481+ }
14671482 }
14681483 fn size_hint ( & self ) -> ( usize , Option < usize > ) {
14691484 ( self . len , Some ( self . len ) )
@@ -1472,7 +1487,12 @@ impl<'a, T: 'a> Iterator for ValuesRef<'a, T> {
14721487
14731488impl < ' a , T : ' a > DoubleEndedIterator for ValuesRef < ' a , T > {
14741489 fn next_back ( & mut self ) -> Option < Self :: Item > {
1475- self . iter . next_back ( )
1490+ if let Some ( next) = self . iter . next_back ( ) {
1491+ self . len -= 1 ;
1492+ Some ( next)
1493+ } else {
1494+ None
1495+ }
14761496 }
14771497}
14781498
@@ -1526,7 +1546,12 @@ impl<'a> Iterator for RawValues<'a> {
15261546 type Item = & ' a OsStr ;
15271547
15281548 fn next ( & mut self ) -> Option < & ' a OsStr > {
1529- self . iter . next ( )
1549+ if let Some ( next) = self . iter . next ( ) {
1550+ self . len -= 1 ;
1551+ Some ( next)
1552+ } else {
1553+ None
1554+ }
15301555 }
15311556 fn size_hint ( & self ) -> ( usize , Option < usize > ) {
15321557 ( self . len , Some ( self . len ) )
@@ -1535,7 +1560,12 @@ impl<'a> Iterator for RawValues<'a> {
15351560
15361561impl < ' a > DoubleEndedIterator for RawValues < ' a > {
15371562 fn next_back ( & mut self ) -> Option < & ' a OsStr > {
1538- self . iter . next_back ( )
1563+ if let Some ( next) = self . iter . next_back ( ) {
1564+ self . len -= 1 ;
1565+ Some ( next)
1566+ } else {
1567+ None
1568+ }
15391569 }
15401570}
15411571
@@ -1570,7 +1600,12 @@ impl<'a> Iterator for GroupedValues<'a> {
15701600 type Item = Vec < & ' a str > ;
15711601
15721602 fn next ( & mut self ) -> Option < Self :: Item > {
1573- self . iter . next ( )
1603+ if let Some ( next) = self . iter . next ( ) {
1604+ self . len -= 1 ;
1605+ Some ( next)
1606+ } else {
1607+ None
1608+ }
15741609 }
15751610 fn size_hint ( & self ) -> ( usize , Option < usize > ) {
15761611 ( self . len , Some ( self . len ) )
@@ -1580,7 +1615,12 @@ impl<'a> Iterator for GroupedValues<'a> {
15801615#[ allow( deprecated) ]
15811616impl < ' a > DoubleEndedIterator for GroupedValues < ' a > {
15821617 fn next_back ( & mut self ) -> Option < Self :: Item > {
1583- self . iter . next_back ( )
1618+ if let Some ( next) = self . iter . next_back ( ) {
1619+ self . len -= 1 ;
1620+ Some ( next)
1621+ } else {
1622+ None
1623+ }
15841624 }
15851625}
15861626
@@ -1830,7 +1870,12 @@ impl<'a> Iterator for Indices<'a> {
18301870 type Item = usize ;
18311871
18321872 fn next ( & mut self ) -> Option < usize > {
1833- self . iter . next ( )
1873+ if let Some ( next) = self . iter . next ( ) {
1874+ self . len -= 1 ;
1875+ Some ( next)
1876+ } else {
1877+ None
1878+ }
18341879 }
18351880 fn size_hint ( & self ) -> ( usize , Option < usize > ) {
18361881 ( self . len , Some ( self . len ) )
@@ -1839,7 +1884,12 @@ impl<'a> Iterator for Indices<'a> {
18391884
18401885impl < ' a > DoubleEndedIterator for Indices < ' a > {
18411886 fn next_back ( & mut self ) -> Option < usize > {
1842- self . iter . next_back ( )
1887+ if let Some ( next) = self . iter . next_back ( ) {
1888+ self . len -= 1 ;
1889+ Some ( next)
1890+ } else {
1891+ None
1892+ }
18431893 }
18441894}
18451895
@@ -1948,4 +1998,37 @@ mod tests {
19481998 . len ( ) ;
19491999 assert_eq ! ( l, 1 ) ;
19502000 }
2001+
2002+ #[ test]
2003+ fn rev_iter ( ) {
2004+ let mut matches = crate :: Command :: new ( "myprog" )
2005+ . arg ( crate :: Arg :: new ( "a" ) . short ( 'a' ) . action ( ArgAction :: Append ) )
2006+ . arg ( crate :: Arg :: new ( "b" ) . short ( 'b' ) . action ( ArgAction :: Append ) )
2007+ . try_get_matches_from ( vec ! [ "myprog" , "-a1" , "-b1" , "-b3" ] )
2008+ . unwrap ( ) ;
2009+
2010+ let a_index = matches
2011+ . indices_of ( "a" )
2012+ . expect ( "missing aopt indices" )
2013+ . collect :: < Vec < _ > > ( ) ;
2014+ dbg ! ( & a_index) ;
2015+ let a_value = matches
2016+ . remove_many :: < String > ( "a" )
2017+ . expect ( "missing aopt values" ) ;
2018+ dbg ! ( & a_value) ;
2019+ let a = a_index. into_iter ( ) . zip ( a_value) . rev ( ) . collect :: < Vec < _ > > ( ) ;
2020+ dbg ! ( a) ;
2021+
2022+ let b_index = matches
2023+ . indices_of ( "b" )
2024+ . expect ( "missing aopt indices" )
2025+ . collect :: < Vec < _ > > ( ) ;
2026+ dbg ! ( & b_index) ;
2027+ let b_value = matches
2028+ . remove_many :: < String > ( "b" )
2029+ . expect ( "missing aopt values" ) ;
2030+ dbg ! ( & b_value) ;
2031+ let b = b_index. into_iter ( ) . zip ( b_value) . rev ( ) . collect :: < Vec < _ > > ( ) ;
2032+ dbg ! ( b) ;
2033+ }
19512034}
0 commit comments