@@ -1405,7 +1405,12 @@ impl<T> Iterator for Values<T> {
1405
1405
type Item = T ;
1406
1406
1407
1407
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
+ }
1409
1414
}
1410
1415
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1411
1416
( self . len , Some ( self . len ) )
@@ -1414,7 +1419,12 @@ impl<T> Iterator for Values<T> {
1414
1419
1415
1420
impl < T > DoubleEndedIterator for Values < T > {
1416
1421
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
+ }
1418
1428
}
1419
1429
}
1420
1430
@@ -1463,7 +1473,12 @@ impl<'a, T: 'a> Iterator for ValuesRef<'a, T> {
1463
1473
type Item = & ' a T ;
1464
1474
1465
1475
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
+ }
1467
1482
}
1468
1483
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1469
1484
( self . len , Some ( self . len ) )
@@ -1472,7 +1487,12 @@ impl<'a, T: 'a> Iterator for ValuesRef<'a, T> {
1472
1487
1473
1488
impl < ' a , T : ' a > DoubleEndedIterator for ValuesRef < ' a , T > {
1474
1489
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
+ }
1476
1496
}
1477
1497
}
1478
1498
@@ -1526,7 +1546,12 @@ impl<'a> Iterator for RawValues<'a> {
1526
1546
type Item = & ' a OsStr ;
1527
1547
1528
1548
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
+ }
1530
1555
}
1531
1556
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1532
1557
( self . len , Some ( self . len ) )
@@ -1535,7 +1560,12 @@ impl<'a> Iterator for RawValues<'a> {
1535
1560
1536
1561
impl < ' a > DoubleEndedIterator for RawValues < ' a > {
1537
1562
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
+ }
1539
1569
}
1540
1570
}
1541
1571
@@ -1570,7 +1600,12 @@ impl<'a> Iterator for GroupedValues<'a> {
1570
1600
type Item = Vec < & ' a str > ;
1571
1601
1572
1602
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
+ }
1574
1609
}
1575
1610
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1576
1611
( self . len , Some ( self . len ) )
@@ -1580,7 +1615,12 @@ impl<'a> Iterator for GroupedValues<'a> {
1580
1615
#[ allow( deprecated) ]
1581
1616
impl < ' a > DoubleEndedIterator for GroupedValues < ' a > {
1582
1617
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
+ }
1584
1624
}
1585
1625
}
1586
1626
@@ -1830,7 +1870,12 @@ impl<'a> Iterator for Indices<'a> {
1830
1870
type Item = usize ;
1831
1871
1832
1872
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
+ }
1834
1879
}
1835
1880
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1836
1881
( self . len , Some ( self . len ) )
@@ -1839,7 +1884,12 @@ impl<'a> Iterator for Indices<'a> {
1839
1884
1840
1885
impl < ' a > DoubleEndedIterator for Indices < ' a > {
1841
1886
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
+ }
1843
1893
}
1844
1894
}
1845
1895
@@ -1948,4 +1998,37 @@ mod tests {
1948
1998
. len ( ) ;
1949
1999
assert_eq ! ( l, 1 ) ;
1950
2000
}
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
+ }
1951
2034
}
0 commit comments