@@ -260,6 +260,7 @@ impl ArgMatches {
260
260
}
261
261
let v = Values {
262
262
iter : arg. vals_flatten ( ) . map ( to_str_slice) ,
263
+ len : arg. num_vals ( ) ,
263
264
} ;
264
265
Some ( v)
265
266
}
@@ -274,6 +275,7 @@ impl ArgMatches {
274
275
iter : arg
275
276
. vals ( )
276
277
. map ( |g| g. iter ( ) . map ( |x| x. to_str ( ) . expect ( INVALID_UTF8 ) ) . collect ( ) ) ,
278
+ len : arg. vals ( ) . len ( ) ,
277
279
} ;
278
280
Some ( v)
279
281
}
@@ -376,6 +378,7 @@ impl ArgMatches {
376
378
}
377
379
let v = OsValues {
378
380
iter : arg. vals_flatten ( ) . map ( to_str_slice) ,
381
+ len : arg. num_vals ( ) ,
379
382
} ;
380
383
Some ( v)
381
384
}
@@ -863,6 +866,7 @@ impl ArgMatches {
863
866
let arg = self . get_arg ( & Id :: from ( id) ) ?;
864
867
let i = Indices {
865
868
iter : arg. indices ( ) ,
869
+ len : arg. num_vals ( ) ,
866
870
} ;
867
871
Some ( i)
868
872
}
@@ -1080,6 +1084,7 @@ pub(crate) struct SubCommand {
1080
1084
pub struct Values < ' a > {
1081
1085
#[ allow( clippy:: type_complexity) ]
1082
1086
iter : Map < Flatten < Iter < ' a , Vec < OsString > > > , for <' r > fn ( & ' r OsString ) -> & ' r str > ,
1087
+ len : usize ,
1083
1088
}
1084
1089
1085
1090
impl < ' a > Iterator for Values < ' a > {
@@ -1089,7 +1094,7 @@ impl<'a> Iterator for Values<'a> {
1089
1094
self . iter . next ( )
1090
1095
}
1091
1096
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1092
- self . iter . size_hint ( )
1097
+ ( self . len , Some ( self . len ) )
1093
1098
}
1094
1099
}
1095
1100
@@ -1107,6 +1112,7 @@ impl<'a> Default for Values<'a> {
1107
1112
static EMPTY : [ Vec < OsString > ; 0 ] = [ ] ;
1108
1113
Values {
1109
1114
iter : EMPTY [ ..] . iter ( ) . flatten ( ) . map ( |_| unreachable ! ( ) ) ,
1115
+ len : 0 ,
1110
1116
}
1111
1117
}
1112
1118
}
@@ -1116,6 +1122,7 @@ impl<'a> Default for Values<'a> {
1116
1122
pub struct GroupedValues < ' a > {
1117
1123
#[ allow( clippy:: type_complexity) ]
1118
1124
iter : Map < Iter < ' a , Vec < OsString > > , fn ( & Vec < OsString > ) -> Vec < & str > > ,
1125
+ len : usize ,
1119
1126
}
1120
1127
1121
1128
impl < ' a > Iterator for GroupedValues < ' a > {
@@ -1125,7 +1132,7 @@ impl<'a> Iterator for GroupedValues<'a> {
1125
1132
self . iter . next ( )
1126
1133
}
1127
1134
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1128
- self . iter . size_hint ( )
1135
+ ( self . len , Some ( self . len ) )
1129
1136
}
1130
1137
}
1131
1138
@@ -1143,6 +1150,7 @@ impl<'a> Default for GroupedValues<'a> {
1143
1150
static EMPTY : [ Vec < OsString > ; 0 ] = [ ] ;
1144
1151
GroupedValues {
1145
1152
iter : EMPTY [ ..] . iter ( ) . map ( |_| unreachable ! ( ) ) ,
1153
+ len : 0 ,
1146
1154
}
1147
1155
}
1148
1156
}
@@ -1171,6 +1179,7 @@ impl<'a> Default for GroupedValues<'a> {
1171
1179
pub struct OsValues < ' a > {
1172
1180
#[ allow( clippy:: type_complexity) ]
1173
1181
iter : Map < Flatten < Iter < ' a , Vec < OsString > > > , fn ( & OsString ) -> & OsStr > ,
1182
+ len : usize ,
1174
1183
}
1175
1184
1176
1185
impl < ' a > Iterator for OsValues < ' a > {
@@ -1180,7 +1189,7 @@ impl<'a> Iterator for OsValues<'a> {
1180
1189
self . iter . next ( )
1181
1190
}
1182
1191
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1183
- self . iter . size_hint ( )
1192
+ ( self . len , Some ( self . len ) )
1184
1193
}
1185
1194
}
1186
1195
@@ -1198,6 +1207,7 @@ impl Default for OsValues<'_> {
1198
1207
static EMPTY : [ Vec < OsString > ; 0 ] = [ ] ;
1199
1208
OsValues {
1200
1209
iter : EMPTY [ ..] . iter ( ) . flatten ( ) . map ( |_| unreachable ! ( ) ) ,
1210
+ len : 0 ,
1201
1211
}
1202
1212
}
1203
1213
}
@@ -1226,6 +1236,7 @@ impl Default for OsValues<'_> {
1226
1236
#[ allow( missing_debug_implementations) ]
1227
1237
pub struct Indices < ' a > {
1228
1238
iter : Cloned < Iter < ' a , usize > > ,
1239
+ len : usize ,
1229
1240
}
1230
1241
1231
1242
impl < ' a > Iterator for Indices < ' a > {
@@ -1235,7 +1246,7 @@ impl<'a> Iterator for Indices<'a> {
1235
1246
self . iter . next ( )
1236
1247
}
1237
1248
fn size_hint ( & self ) -> ( usize , Option < usize > ) {
1238
- self . iter . size_hint ( )
1249
+ ( self . len , Some ( self . len ) )
1239
1250
}
1240
1251
}
1241
1252
@@ -1254,6 +1265,7 @@ impl<'a> Default for Indices<'a> {
1254
1265
// This is never called because the iterator is empty:
1255
1266
Indices {
1256
1267
iter : EMPTY [ ..] . iter ( ) . cloned ( ) ,
1268
+ len : 0 ,
1257
1269
}
1258
1270
}
1259
1271
}
@@ -1320,4 +1332,56 @@ mod tests {
1320
1332
let mut indices = matches. indices_of ( "" ) . unwrap_or_default ( ) ;
1321
1333
assert_eq ! ( indices. next( ) , None ) ;
1322
1334
}
1335
+
1336
+ #[ test]
1337
+ fn values_exact_size ( ) {
1338
+ let l = crate :: App :: new ( "test" )
1339
+ . arg (
1340
+ crate :: Arg :: new ( "POTATO" )
1341
+ . takes_value ( true )
1342
+ . multiple_values ( true )
1343
+ . required ( true ) ,
1344
+ )
1345
+ . try_get_matches_from ( [ "test" , "one" ] )
1346
+ . unwrap ( )
1347
+ . values_of ( "POTATO" )
1348
+ . expect ( "present" )
1349
+ . len ( ) ;
1350
+ assert_eq ! ( l, 1 ) ;
1351
+ }
1352
+
1353
+ #[ test]
1354
+ fn os_values_exact_size ( ) {
1355
+ let l = crate :: App :: new ( "test" )
1356
+ . arg (
1357
+ crate :: Arg :: new ( "POTATO" )
1358
+ . takes_value ( true )
1359
+ . multiple_values ( true )
1360
+ . allow_invalid_utf8 ( true )
1361
+ . required ( true ) ,
1362
+ )
1363
+ . try_get_matches_from ( [ "test" , "one" ] )
1364
+ . unwrap ( )
1365
+ . values_of_os ( "POTATO" )
1366
+ . expect ( "present" )
1367
+ . len ( ) ;
1368
+ assert_eq ! ( l, 1 ) ;
1369
+ }
1370
+
1371
+ #[ test]
1372
+ fn indices_exact_size ( ) {
1373
+ let l = crate :: App :: new ( "test" )
1374
+ . arg (
1375
+ crate :: Arg :: new ( "POTATO" )
1376
+ . takes_value ( true )
1377
+ . multiple_values ( true )
1378
+ . required ( true ) ,
1379
+ )
1380
+ . try_get_matches_from ( [ "test" , "one" ] )
1381
+ . unwrap ( )
1382
+ . indices_of ( "POTATO" )
1383
+ . expect ( "present" )
1384
+ . len ( ) ;
1385
+ assert_eq ! ( l, 1 ) ;
1386
+ }
1323
1387
}
0 commit comments