Add Sum
and Product
impls for Wrapping
This commit is contained in:
parent
f69cd1b30e
commit
df0e5a97fb
@ -8,6 +8,7 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
use ops::{Mul, Add};
|
||||
use num::Wrapping;
|
||||
|
||||
/// Conversion from an `Iterator`.
|
||||
///
|
||||
@ -584,35 +585,39 @@ pub trait Product<A = Self>: Sized {
|
||||
|
||||
// NB: explicitly use Add and Mul here to inherit overflow checks
|
||||
macro_rules! integer_sum_product {
|
||||
($($a:ident)*) => ($(
|
||||
(@impls $zero:expr, $one:expr, $($a:ty)*) => ($(
|
||||
#[stable(feature = "iter_arith_traits", since = "1.12.0")]
|
||||
impl Sum for $a {
|
||||
fn sum<I: Iterator<Item=$a>>(iter: I) -> $a {
|
||||
iter.fold(0, Add::add)
|
||||
iter.fold($zero, Add::add)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "iter_arith_traits", since = "1.12.0")]
|
||||
impl Product for $a {
|
||||
fn product<I: Iterator<Item=$a>>(iter: I) -> $a {
|
||||
iter.fold(1, Mul::mul)
|
||||
iter.fold($one, Mul::mul)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "iter_arith_traits", since = "1.12.0")]
|
||||
impl<'a> Sum<&'a $a> for $a {
|
||||
fn sum<I: Iterator<Item=&'a $a>>(iter: I) -> $a {
|
||||
iter.cloned().fold(0, Add::add)
|
||||
iter.fold($zero, Add::add)
|
||||
}
|
||||
}
|
||||
|
||||
#[stable(feature = "iter_arith_traits", since = "1.12.0")]
|
||||
impl<'a> Product<&'a $a> for $a {
|
||||
fn product<I: Iterator<Item=&'a $a>>(iter: I) -> $a {
|
||||
iter.cloned().fold(1, Mul::mul)
|
||||
iter.fold($one, Mul::mul)
|
||||
}
|
||||
}
|
||||
)*)
|
||||
)*);
|
||||
($($a:ty)*) => (
|
||||
integer_sum_product!(@impls 0, 1, $($a)+);
|
||||
integer_sum_product!(@impls Wrapping(0), Wrapping(1), $(Wrapping<$a>)+);
|
||||
);
|
||||
}
|
||||
|
||||
macro_rules! float_sum_product {
|
||||
|
Loading…
x
Reference in New Issue
Block a user