Skip to content

Commit 1bde6e3

Browse files
aturonalexcrichton
authored andcommitted
Rename Iterator::len to count
This commit carries out the request from issue #14678: > The method `Iterator::len()` is surprising, as all the other uses of > `len()` do not consume the value. `len()` would make more sense to be > called `count()`, but that would collide with the current > `Iterator::count(|T| -> bool) -> unit` method. That method, however, is > a bit redundant, and can be easily replaced with > `iter.filter(|x| x < 5).count()`. > After this change, we could then define the `len()` method > on `iter::ExactSize`. Closes #14678. [breaking-change]
1 parent 1bc2992 commit 1bde6e3

File tree

21 files changed

+78
-83
lines changed

21 files changed

+78
-83
lines changed

src/compiletest/runtest.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -1545,7 +1545,7 @@ fn disassemble_extract(config: &Config, _props: &TestProps,
15451545
fn count_extracted_lines(p: &Path) -> uint {
15461546
let x = File::open(&p.with_extension("ll")).read_to_end().unwrap();
15471547
let x = str::from_utf8(x.as_slice()).unwrap();
1548-
x.lines().len()
1548+
x.lines().count()
15491549
}
15501550

15511551

src/libcollections/bitv.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -241,17 +241,17 @@ enum Op {Union, Intersect, Assign, Difference}
241241
/// bv.set(5, true);
242242
/// bv.set(7, true);
243243
/// println!("{}", bv.to_str());
244-
/// println!("total bits set to true: {}", bv.iter().count(|x| x));
244+
/// println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
245245
///
246246
/// // flip all values in bitvector, producing non-primes less than 10
247247
/// bv.negate();
248248
/// println!("{}", bv.to_str());
249-
/// println!("total bits set to true: {}", bv.iter().count(|x| x));
249+
/// println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
250250
///
251251
/// // reset bitvector to empty
252252
/// bv.clear();
253253
/// println!("{}", bv.to_str());
254-
/// println!("total bits set to true: {}", bv.iter().count(|x| x));
254+
/// println!("total bits set to true: {}", bv.iter().filter(|x| *x).count());
255255
/// ```
256256
#[deriving(Clone)]
257257
pub struct Bitv {
@@ -461,7 +461,7 @@ impl Bitv {
461461
/// bv.set(5, true);
462462
/// bv.set(8, true);
463463
/// // Count bits set to 1; result should be 5
464-
/// println!("{}", bv.iter().count(|x| x));
464+
/// println!("{}", bv.iter().filter(|x| *x).count());
465465
/// ```
466466
#[inline]
467467
pub fn iter<'a>(&'a self) -> Bits<'a> {

src/libcollections/dlist.rs

+4-4
Original file line numberDiff line numberDiff line change
@@ -1131,31 +1131,31 @@ mod tests {
11311131
let v = &[0, ..128];
11321132
let m: DList<int> = v.iter().map(|&x|x).collect();
11331133
b.iter(|| {
1134-
assert!(m.iter().len() == 128);
1134+
assert!(m.iter().count() == 128);
11351135
})
11361136
}
11371137
#[bench]
11381138
fn bench_iter_mut(b: &mut test::Bencher) {
11391139
let v = &[0, ..128];
11401140
let mut m: DList<int> = v.iter().map(|&x|x).collect();
11411141
b.iter(|| {
1142-
assert!(m.mut_iter().len() == 128);
1142+
assert!(m.mut_iter().count() == 128);
11431143
})
11441144
}
11451145
#[bench]
11461146
fn bench_iter_rev(b: &mut test::Bencher) {
11471147
let v = &[0, ..128];
11481148
let m: DList<int> = v.iter().map(|&x|x).collect();
11491149
b.iter(|| {
1150-
assert!(m.iter().rev().len() == 128);
1150+
assert!(m.iter().rev().count() == 128);
11511151
})
11521152
}
11531153
#[bench]
11541154
fn bench_iter_mut_rev(b: &mut test::Bencher) {
11551155
let v = &[0, ..128];
11561156
let mut m: DList<int> = v.iter().map(|&x|x).collect();
11571157
b.iter(|| {
1158-
assert!(m.mut_iter().rev().len() == 128);
1158+
assert!(m.mut_iter().rev().count() == 128);
11591159
})
11601160
}
11611161
}

src/libcollections/slice.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -2155,7 +2155,7 @@ mod tests {
21552155
#[test]
21562156
fn test_mut_splitator() {
21572157
let mut xs = [0,1,0,2,3,0,0,4,5,0];
2158-
assert_eq!(xs.mut_split(|x| *x == 0).len(), 6);
2158+
assert_eq!(xs.mut_split(|x| *x == 0).count(), 6);
21592159
for slice in xs.mut_split(|x| *x == 0) {
21602160
slice.reverse();
21612161
}

src/libcollections/smallintmap.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ pub struct SmallIntMap<T> {
3131
impl<V> Container for SmallIntMap<V> {
3232
/// Return the number of elements in the map
3333
fn len(&self) -> uint {
34-
self.v.iter().count(|elt| elt.is_some())
34+
self.v.iter().filter(|elt| elt.is_some()).count()
3535
}
3636

3737
/// Return true if there are no elements in the map

src/libcollections/str.rs

+17-17
Original file line numberDiff line numberDiff line change
@@ -2181,7 +2181,7 @@ mod bench {
21812181
let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
21822182
let len = s.char_len();
21832183

2184-
b.iter(|| assert_eq!(s.chars().len(), len));
2184+
b.iter(|| assert_eq!(s.chars().count(), len));
21852185
}
21862186

21872187
#[bench]
@@ -2194,38 +2194,38 @@ mod bench {
21942194
Mary had a little lamb, Little lamb";
21952195
let len = s.char_len();
21962196

2197-
b.iter(|| assert_eq!(s.chars().len(), len));
2197+
b.iter(|| assert_eq!(s.chars().count(), len));
21982198
}
21992199

22002200
#[bench]
22012201
fn char_iterator_rev(b: &mut Bencher) {
22022202
let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
22032203
let len = s.char_len();
22042204

2205-
b.iter(|| assert_eq!(s.chars().rev().len(), len));
2205+
b.iter(|| assert_eq!(s.chars().rev().count(), len));
22062206
}
22072207

22082208
#[bench]
22092209
fn char_indicesator(b: &mut Bencher) {
22102210
let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
22112211
let len = s.char_len();
22122212

2213-
b.iter(|| assert_eq!(s.char_indices().len(), len));
2213+
b.iter(|| assert_eq!(s.char_indices().count(), len));
22142214
}
22152215

22162216
#[bench]
22172217
fn char_indicesator_rev(b: &mut Bencher) {
22182218
let s = "ศไทย中华Việt Nam; Mary had a little lamb, Little lamb";
22192219
let len = s.char_len();
22202220

2221-
b.iter(|| assert_eq!(s.char_indices().rev().len(), len));
2221+
b.iter(|| assert_eq!(s.char_indices().rev().count(), len));
22222222
}
22232223

22242224
#[bench]
22252225
fn split_unicode_ascii(b: &mut Bencher) {
22262226
let s = "ประเทศไทย中华Việt Namประเทศไทย中华Việt Nam";
22272227

2228-
b.iter(|| assert_eq!(s.split('V').len(), 3));
2228+
b.iter(|| assert_eq!(s.split('V').count(), 3));
22292229
}
22302230

22312231
#[bench]
@@ -2240,16 +2240,16 @@ mod bench {
22402240
}
22412241
let s = "ประเทศไทย中华Việt Namประเทศไทย中华Việt Nam";
22422242

2243-
b.iter(|| assert_eq!(s.split(NotAscii('V')).len(), 3));
2243+
b.iter(|| assert_eq!(s.split(NotAscii('V')).count(), 3));
22442244
}
22452245

22462246

22472247
#[bench]
22482248
fn split_ascii(b: &mut Bencher) {
22492249
let s = "Mary had a little lamb, Little lamb, little-lamb.";
2250-
let len = s.split(' ').len();
2250+
let len = s.split(' ').count();
22512251

2252-
b.iter(|| assert_eq!(s.split(' ').len(), len));
2252+
b.iter(|| assert_eq!(s.split(' ').count(), len));
22532253
}
22542254

22552255
#[bench]
@@ -2264,34 +2264,34 @@ mod bench {
22642264
fn only_ascii(&self) -> bool { false }
22652265
}
22662266
let s = "Mary had a little lamb, Little lamb, little-lamb.";
2267-
let len = s.split(' ').len();
2267+
let len = s.split(' ').count();
22682268

2269-
b.iter(|| assert_eq!(s.split(NotAscii(' ')).len(), len));
2269+
b.iter(|| assert_eq!(s.split(NotAscii(' ')).count(), len));
22702270
}
22712271

22722272
#[bench]
22732273
fn split_extern_fn(b: &mut Bencher) {
22742274
let s = "Mary had a little lamb, Little lamb, little-lamb.";
2275-
let len = s.split(' ').len();
2275+
let len = s.split(' ').count();
22762276
fn pred(c: char) -> bool { c == ' ' }
22772277

2278-
b.iter(|| assert_eq!(s.split(pred).len(), len));
2278+
b.iter(|| assert_eq!(s.split(pred).count(), len));
22792279
}
22802280

22812281
#[bench]
22822282
fn split_closure(b: &mut Bencher) {
22832283
let s = "Mary had a little lamb, Little lamb, little-lamb.";
2284-
let len = s.split(' ').len();
2284+
let len = s.split(' ').count();
22852285

2286-
b.iter(|| assert_eq!(s.split(|c: char| c == ' ').len(), len));
2286+
b.iter(|| assert_eq!(s.split(|c: char| c == ' ').count(), len));
22872287
}
22882288

22892289
#[bench]
22902290
fn split_slice(b: &mut Bencher) {
22912291
let s = "Mary had a little lamb, Little lamb, little-lamb.";
2292-
let len = s.split(' ').len();
2292+
let len = s.split(' ').count();
22932293

2294-
b.iter(|| assert_eq!(s.split(&[' ']).len(), len));
2294+
b.iter(|| assert_eq!(s.split(&[' ']).count(), len));
22952295
}
22962296

22972297
#[bench]

src/libcollections/vec.rs

+7-7
Original file line numberDiff line numberDiff line change
@@ -1772,23 +1772,23 @@ mod tests {
17721772
assert_eq!(v.pop(), Some(()));
17731773
assert_eq!(v.pop(), None);
17741774

1775-
assert_eq!(v.iter().len(), 0);
1775+
assert_eq!(v.iter().count(), 0);
17761776
v.push(());
1777-
assert_eq!(v.iter().len(), 1);
1777+
assert_eq!(v.iter().count(), 1);
17781778
v.push(());
1779-
assert_eq!(v.iter().len(), 2);
1779+
assert_eq!(v.iter().count(), 2);
17801780

17811781
for &() in v.iter() {}
17821782

1783-
assert_eq!(v.mut_iter().len(), 2);
1783+
assert_eq!(v.mut_iter().count(), 2);
17841784
v.push(());
1785-
assert_eq!(v.mut_iter().len(), 3);
1785+
assert_eq!(v.mut_iter().count(), 3);
17861786
v.push(());
1787-
assert_eq!(v.mut_iter().len(), 4);
1787+
assert_eq!(v.mut_iter().count(), 4);
17881788

17891789
for &() in v.mut_iter() {}
17901790
unsafe { v.set_len(0); }
1791-
assert_eq!(v.mut_iter().len(), 0);
1791+
assert_eq!(v.mut_iter().count(), 0);
17921792
}
17931793

17941794
#[test]

src/libcore/iter.rs

+23-25
Original file line numberDiff line numberDiff line change
@@ -529,11 +529,11 @@ pub trait Iterator<A> {
529529
/// ```rust
530530
/// let a = [1, 2, 3, 4, 5];
531531
/// let mut it = a.iter();
532-
/// assert!(it.len() == 5);
533-
/// assert!(it.len() == 0);
532+
/// assert!(it.count() == 5);
533+
/// assert!(it.count() == 0);
534534
/// ```
535535
#[inline]
536-
fn len(&mut self) -> uint {
536+
fn count(&mut self) -> uint {
537537
self.fold(0, |cnt, _x| cnt + 1)
538538
}
539539

@@ -591,16 +591,6 @@ pub trait Iterator<A> {
591591
None
592592
}
593593

594-
/// Count the number of elements satisfying the specified predicate
595-
#[inline]
596-
fn count(&mut self, predicate: |A| -> bool) -> uint {
597-
let mut i = 0;
598-
for x in *self {
599-
if predicate(x) { i += 1 }
600-
}
601-
i
602-
}
603-
604594
/// Return the element that gives the maximum value from the
605595
/// specified function.
606596
///
@@ -738,6 +728,14 @@ pub trait ExactSize<A> : DoubleEndedIterator<A> {
738728
}
739729
None
740730
}
731+
732+
#[inline]
733+
/// Return the exact length of the iterator.
734+
fn len(&self) -> uint {
735+
let (lower, upper) = self.size_hint();
736+
assert!(upper == Some(lower));
737+
lower
738+
}
741739
}
742740

743741
// All adaptors that preserve the size of the wrapped iterator are fine
@@ -2594,9 +2592,9 @@ mod tests {
25942592
#[test]
25952593
fn test_iterator_len() {
25962594
let v = &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
2597-
assert_eq!(v.slice(0, 4).iter().len(), 4);
2598-
assert_eq!(v.slice(0, 10).iter().len(), 10);
2599-
assert_eq!(v.slice(0, 0).iter().len(), 0);
2595+
assert_eq!(v.slice(0, 4).iter().count(), 4);
2596+
assert_eq!(v.slice(0, 10).iter().count(), 10);
2597+
assert_eq!(v.slice(0, 0).iter().count(), 0);
26002598
}
26012599

26022600
#[test]
@@ -2712,9 +2710,9 @@ mod tests {
27122710
#[test]
27132711
fn test_count() {
27142712
let xs = &[1, 2, 2, 1, 5, 9, 0, 2];
2715-
assert_eq!(xs.iter().count(|x| *x == 2), 3);
2716-
assert_eq!(xs.iter().count(|x| *x == 5), 1);
2717-
assert_eq!(xs.iter().count(|x| *x == 95), 0);
2713+
assert_eq!(xs.iter().filter(|x| **x == 2).count(), 3);
2714+
assert_eq!(xs.iter().filter(|x| **x == 5).count(), 1);
2715+
assert_eq!(xs.iter().filter(|x| **x == 95).count(), 0);
27182716
}
27192717

27202718
#[test]
@@ -3044,10 +3042,10 @@ mod tests {
30443042
assert!(range(-10i, -1).collect::<Vec<int>>() ==
30453043
vec![-10, -9, -8, -7, -6, -5, -4, -3, -2]);
30463044
assert!(range(0i, 5).rev().collect::<Vec<int>>() == vec![4, 3, 2, 1, 0]);
3047-
assert_eq!(range(200, -5).len(), 0);
3048-
assert_eq!(range(200, -5).rev().len(), 0);
3049-
assert_eq!(range(200, 200).len(), 0);
3050-
assert_eq!(range(200, 200).rev().len(), 0);
3045+
assert_eq!(range(200, -5).count(), 0);
3046+
assert_eq!(range(200, -5).rev().count(), 0);
3047+
assert_eq!(range(200, 200).count(), 0);
3048+
assert_eq!(range(200, 200).rev().count(), 0);
30513049

30523050
assert_eq!(range(0i, 100).size_hint(), (100, Some(100)));
30533051
// this test is only meaningful when sizeof uint < sizeof u64
@@ -3062,8 +3060,8 @@ mod tests {
30623060
vec![0i, 1, 2, 3, 4, 5]);
30633061
assert!(range_inclusive(0i, 5).rev().collect::<Vec<int>>() ==
30643062
vec![5i, 4, 3, 2, 1, 0]);
3065-
assert_eq!(range_inclusive(200, -5).len(), 0);
3066-
assert_eq!(range_inclusive(200, -5).rev().len(), 0);
3063+
assert_eq!(range_inclusive(200, -5).count(), 0);
3064+
assert_eq!(range_inclusive(200, -5).rev().count(), 0);
30673065
assert!(range_inclusive(200, 200).collect::<Vec<int>>() == vec![200]);
30683066
assert!(range_inclusive(200, 200).rev().collect::<Vec<int>>() == vec![200]);
30693067
}

src/libcore/slice.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -252,7 +252,7 @@ pub mod traits {
252252
use super::*;
253253

254254
use cmp::{PartialEq, PartialOrd, Eq, Ord, Ordering, Equiv};
255-
use iter::{order, Iterator};
255+
use iter::order;
256256
use container::Container;
257257

258258
impl<'a,T:PartialEq> PartialEq for &'a [T] {
@@ -1141,7 +1141,6 @@ impl<'a, T:Clone> MutableCloneableVector<T> for &'a mut [T] {
11411141
/// Unsafe operations
11421142
pub mod raw {
11431143
use mem::transmute;
1144-
use iter::Iterator;
11451144
use ptr::RawPtr;
11461145
use raw::Slice;
11471146
use option::{None, Option, Some};

src/libcore/str.rs

+1-2
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,6 @@ static TAG_CONT_U8: u8 = 128u8;
867867
pub mod raw {
868868
use mem;
869869
use container::Container;
870-
use iter::Iterator;
871870
use ptr::RawPtr;
872871
use raw::Slice;
873872
use slice::{ImmutableVector};
@@ -1725,7 +1724,7 @@ impl<'a> StrSlice<'a> for &'a str {
17251724
fn is_alphanumeric(&self) -> bool { self.chars().all(char::is_alphanumeric) }
17261725

17271726
#[inline]
1728-
fn char_len(&self) -> uint { self.chars().len() }
1727+
fn char_len(&self) -> uint { self.chars().count() }
17291728

17301729
#[inline]
17311730
fn slice(&self, begin: uint, end: uint) -> &'a str {

src/librustc/metadata/encoder.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -351,7 +351,7 @@ fn encode_enum_variant_info(ecx: &EncodeContext,
351351
fn encode_path<PI: Iterator<PathElem> + Clone>(ebml_w: &mut Encoder,
352352
mut path: PI) {
353353
ebml_w.start_tag(tag_path);
354-
ebml_w.wr_tagged_u32(tag_path_len, path.clone().len() as u32);
354+
ebml_w.wr_tagged_u32(tag_path_len, path.clone().count() as u32);
355355
for pe in path {
356356
let tag = match pe {
357357
ast_map::PathMod(_) => tag_path_elem_mod,

src/librustc/middle/entry.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ fn find_item(item: &Item, ctxt: &mut EntryContext) {
8282
ItemFn(..) => {
8383
if item.ident.name == ctxt.main_name {
8484
ctxt.ast_map.with_path(item.id, |mut path| {
85-
if path.len() == 1 {
85+
if path.count() == 1 {
8686
// This is a top-level function so can be 'main'
8787
if ctxt.main_fn.is_none() {
8888
ctxt.main_fn = Some((item.id, item.span));

0 commit comments

Comments
 (0)