Skip to content

Commit c9e6bda

Browse files
committed
Revert the need for initial values with arithmetic iterators
1 parent 064e84e commit c9e6bda

File tree

13 files changed

+71
-40
lines changed

13 files changed

+71
-40
lines changed

src/libcollections/slice.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ impl Iterator<(uint, uint)> for ElementSwaps {
228228
#[inline]
229229
fn size_hint(&self) -> (uint, Option<uint>) {
230230
// For a vector of size n, there are exactly n! permutations.
231-
let n = range(2, self.sdir.len() + 1).product(1);
231+
let n = range(2, self.sdir.len() + 1).product();
232232
(n - self.swaps_made, Some(n - self.swaps_made))
233233
}
234234
}

src/libcollections/str.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ impl<S: Str> StrVector for [S] {
116116
}
117117

118118
// `len` calculation may overflow but push_str will check boundaries
119-
let len = self.iter().map(|s| s.as_slice().len()).sum(0);
119+
let len = self.iter().map(|s| s.as_slice().len()).sum();
120120

121121
let mut result = String::with_capacity(len);
122122

@@ -140,7 +140,7 @@ impl<S: Str> StrVector for [S] {
140140
// this is wrong without the guarantee that `self` is non-empty
141141
// `len` calculation may overflow but push_str but will check boundaries
142142
let len = sep.len() * (self.len() - 1)
143-
+ self.iter().map(|s| s.as_slice().len()).sum(0);
143+
+ self.iter().map(|s| s.as_slice().len()).sum();
144144
let mut result = String::with_capacity(len);
145145
let mut first = true;
146146

@@ -2151,7 +2151,7 @@ mod tests {
21512151
#[test]
21522152
fn test_str_container() {
21532153
fn sum_len(v: &[&str]) -> uint {
2154-
v.iter().map(|x| x.len()).sum(0)
2154+
v.iter().map(|x| x.len()).sum()
21552155
}
21562156

21572157
let s = String::from_str("01234");

src/libcore/iter.rs

Lines changed: 50 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ use cmp;
6363
use cmp::Ord;
6464
use mem;
6565
use num::{ToPrimitive, Int};
66-
use ops::{Add, Mul};
66+
use ops::Add;
6767
use option::{Option, Some, None};
6868
use uint;
6969
#[deprecated = "renamed to Extend"] pub use self::Extend as Extendable;
@@ -402,7 +402,7 @@ pub trait Iterator<A> {
402402
/// .inspect(|&x| println!("filtering {}", x))
403403
/// .filter(|&x| x % 2 == 0)
404404
/// .inspect(|&x| println!("{} made it through", x))
405-
/// .sum(0);
405+
/// .sum();
406406
/// println!("{}", sum);
407407
/// ```
408408
#[inline]
@@ -784,17 +784,33 @@ pub trait AdditiveIterator<A> {
784784
///
785785
/// let a = [1i, 2, 3, 4, 5];
786786
/// let mut it = a.iter().map(|&x| x);
787-
/// assert!(it.sum(0) == 15);
787+
/// assert!(it.sum() == 15);
788788
/// ```
789-
fn sum(&mut self, init: A) -> A;
789+
fn sum(&mut self) -> A;
790790
}
791791

792-
impl<A: Add<A, A>, T: Iterator<A>> AdditiveIterator<A> for T {
793-
#[inline]
794-
fn sum(&mut self, init: A) -> A {
795-
self.fold(init, |s, x| s + x)
796-
}
797-
}
792+
macro_rules! impl_additive {
793+
($A:ty, $init:expr) => {
794+
impl<T: Iterator<$A>> AdditiveIterator<$A> for T {
795+
#[inline]
796+
fn sum(&mut self) -> $A {
797+
self.fold($init, |acc, x| acc + x)
798+
}
799+
}
800+
};
801+
}
802+
impl_additive!(i8, 0)
803+
impl_additive!(i16, 0)
804+
impl_additive!(i32, 0)
805+
impl_additive!(i64, 0)
806+
impl_additive!(int, 0)
807+
impl_additive!(u8, 0)
808+
impl_additive!(u16, 0)
809+
impl_additive!(u32, 0)
810+
impl_additive!(u64, 0)
811+
impl_additive!(uint, 0)
812+
impl_additive!(f32, 0.0)
813+
impl_additive!(f64, 0.0)
798814

799815
/// A trait for iterators over elements which can be multiplied together.
800816
pub trait MultiplicativeIterator<A> {
@@ -806,21 +822,37 @@ pub trait MultiplicativeIterator<A> {
806822
/// use std::iter::{count, MultiplicativeIterator};
807823
///
808824
/// fn factorial(n: uint) -> uint {
809-
/// count(1u, 1).take_while(|&i| i <= n).product(1)
825+
/// count(1u, 1).take_while(|&i| i <= n).product()
810826
/// }
811827
/// assert!(factorial(0) == 1);
812828
/// assert!(factorial(1) == 1);
813829
/// assert!(factorial(5) == 120);
814830
/// ```
815-
fn product(&mut self, init: A) -> A;
831+
fn product(&mut self) -> A;
816832
}
817833

818-
impl<A: Mul<A, A>, T: Iterator<A>> MultiplicativeIterator<A> for T {
819-
#[inline]
820-
fn product(&mut self, init: A) -> A {
821-
self.fold(init, |p, x| p * x)
822-
}
823-
}
834+
macro_rules! impl_multiplicative {
835+
($A:ty, $init:expr) => {
836+
impl<T: Iterator<$A>> MultiplicativeIterator<$A> for T {
837+
#[inline]
838+
fn product(&mut self) -> $A {
839+
self.fold($init, |acc, x| acc * x)
840+
}
841+
}
842+
};
843+
}
844+
impl_multiplicative!(i8, 1)
845+
impl_multiplicative!(i16, 1)
846+
impl_multiplicative!(i32, 1)
847+
impl_multiplicative!(i64, 1)
848+
impl_multiplicative!(int, 1)
849+
impl_multiplicative!(u8, 1)
850+
impl_multiplicative!(u16, 1)
851+
impl_multiplicative!(u32, 1)
852+
impl_multiplicative!(u64, 1)
853+
impl_multiplicative!(uint, 1)
854+
impl_multiplicative!(f32, 1.0)
855+
impl_multiplicative!(f64, 1.0)
824856

825857
/// A trait for iterators over elements which can be compared to one another.
826858
pub trait OrdIterator<A> {

src/libcoretest/iter.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -294,17 +294,17 @@ fn test_iterator_len() {
294294
#[test]
295295
fn test_iterator_sum() {
296296
let v: &[_] = &[0i, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
297-
assert_eq!(v[0..4].iter().map(|&x| x).sum(0), 6);
298-
assert_eq!(v.iter().map(|&x| x).sum(0), 55);
299-
assert_eq!(v[0..0].iter().map(|&x| x).sum(0), 0);
297+
assert_eq!(v[0..4].iter().map(|&x| x).sum(), 6);
298+
assert_eq!(v.iter().map(|&x| x).sum(), 55);
299+
assert_eq!(v[0..0].iter().map(|&x| x).sum(), 0);
300300
}
301301

302302
#[test]
303303
fn test_iterator_product() {
304304
let v: &[_] = &[0i, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
305-
assert_eq!(v[0..4].iter().map(|&x| x).product(1), 0);
306-
assert_eq!(v[1..5].iter().map(|&x| x).product(1), 24);
307-
assert_eq!(v[0..0].iter().map(|&x| x).product(1), 1);
305+
assert_eq!(v[0..4].iter().map(|&x| x).product(), 0);
306+
assert_eq!(v[1..5].iter().map(|&x| x).product(), 24);
307+
assert_eq!(v[0..0].iter().map(|&x| x).product(), 1);
308308
}
309309

310310
#[test]

src/librustc/middle/check_match.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,7 @@ impl<'a> fmt::Show for Matrix<'a> {
7070
pretty_printed_matrix.iter().map(|row| row[col].len()).max().unwrap_or(0u)
7171
}).collect();
7272

73-
let total_width = column_widths.iter().map(|n| *n).sum(0) + column_count * 3 + 1;
73+
let total_width = column_widths.iter().map(|n| *n).sum() + column_count * 3 + 1;
7474
let br = String::from_char(total_width, '+');
7575
try!(write!(f, "{}\n", br));
7676
for row in pretty_printed_matrix.into_iter() {

src/librustc/middle/trans/_match.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -756,7 +756,7 @@ fn pick_column_to_specialize(def_map: &DefMap, m: &[Match]) -> Option<uint> {
756756
let total_score = m.iter()
757757
.map(|row| row.pats[col])
758758
.map(|pat| pat_score(def_map, pat))
759-
.sum(0);
759+
.sum();
760760

761761
// Irrefutable columns always go first, they'd only be duplicated in the branches.
762762
if total_score == 0 {

src/librustc/middle/typeck/astconv.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1194,7 +1194,7 @@ fn ty_of_method_or_bare_fn<'tcx, AC: AstConv<'tcx>>(
11941194
lifetimes_for_params.push((input_pat, accumulator));
11951195
}
11961196

1197-
if lifetimes_for_params.iter().map(|&(_, ref x)| x.len()).sum(0) == 1 {
1197+
if lifetimes_for_params.iter().map(|&(_, ref x)| x.len()).sum() == 1 {
11981198
implied_output_region =
11991199
Some(lifetimes_for_params.iter()
12001200
.filter_map(|&(_, ref x)|

src/librustdoc/stability_summary.rs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
1616
use std::ops::Add;
1717
use std::num::Zero;
18-
use std::iter::AdditiveIterator;
1918

2019
use syntax::attr::{Deprecated, Experimental, Unstable, Stable, Frozen, Locked};
2120
use syntax::ast::Public;
@@ -152,14 +151,14 @@ fn summarize_item(item: &Item) -> (Counts, Option<ModuleSummary>) {
152151
let subcounts = subitems.iter().filter(|i| visible(*i))
153152
.map(summarize_item)
154153
.map(|s| s.val0())
155-
.sum(Counts::zero());
154+
.fold(Counts::zero(), |acc, x| acc + x);
156155
(item_counts + subcounts, None)
157156
}
158157
// `pub` automatically
159158
EnumItem(Enum { variants: ref subitems, .. }) => {
160159
let subcounts = subitems.iter().map(summarize_item)
161160
.map(|s| s.val0())
162-
.sum(Counts::zero());
161+
.fold(Counts::zero(), |acc, x| acc + x);
163162
(item_counts + subcounts, None)
164163
}
165164
TraitItem(Trait {
@@ -177,7 +176,7 @@ fn summarize_item(item: &Item) -> (Counts, Option<ModuleSummary>) {
177176
.map(extract_item)
178177
.map(summarize_item)
179178
.map(|s| s.val0())
180-
.sum(Counts::zero());
179+
.fold(Counts::zero(), |acc, x| acc + x);
181180
(item_counts + subcounts, None)
182181
}
183182
ModuleItem(Module { ref items, .. }) => {

src/libstd/path/posix.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -356,7 +356,7 @@ impl Path {
356356
Some(vec![SEP_BYTE])
357357
} else {
358358
let n = if is_abs { comps.len() } else { comps.len() - 1} +
359-
comps.iter().map(|v| v.len()).sum(0);
359+
comps.iter().map(|v| v.len()).sum();
360360
let mut v = Vec::with_capacity(n);
361361
let mut it = comps.into_iter();
362362
if !is_abs {

src/libstd/path/windows.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -781,7 +781,7 @@ impl Path {
781781
let prefix_ = s.slice_to(prefix_len(prefix));
782782
let n = prefix_.len() +
783783
if is_abs { comps.len() } else { comps.len() - 1} +
784-
comps.iter().map(|v| v.len()).sum(0);
784+
comps.iter().map(|v| v.len()).sum();
785785
let mut s = String::with_capacity(n);
786786
match prefix {
787787
Some(DiskPrefix) => {

src/libunicode/u_str.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ impl UnicodeStrPrelude for str {
153153

154154
#[inline]
155155
fn width(&self, is_cjk: bool) -> uint {
156-
self.chars().map(|c| c.width(is_cjk).unwrap_or(0)).sum(0)
156+
self.chars().map(|c| c.width(is_cjk).unwrap_or(0)).sum()
157157
}
158158

159159
#[inline]

src/test/bench/shootout-spectralnorm.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ fn A(i: uint, j: uint) -> f64 {
105105
}
106106

107107
fn dot(v: &[f64], u: &[f64]) -> f64 {
108-
v.iter().zip(u.iter()).map(|(a, b)| *a * *b).sum(0.0)
108+
v.iter().zip(u.iter()).map(|(a, b)| *a * *b).sum()
109109
}
110110

111111
// Executes a closure in parallel over the given mutable slice. The closure `f`

src/test/run-pass/issue-15673.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,5 +11,5 @@
1111
use std::iter::AdditiveIterator;
1212
fn main() {
1313
let x: [u64, ..3] = [1, 2, 3];
14-
assert_eq!(6, range(0, 3).map(|i| x[i]).sum(0));
14+
assert_eq!(6, range(0, 3).map(|i| x[i]).sum());
1515
}

0 commit comments

Comments
 (0)