Skip to content

Commit d7a5750

Browse files
committed
add docs, test
1 parent 246b844 commit d7a5750

File tree

2 files changed

+44
-3
lines changed

2 files changed

+44
-3
lines changed

library/core/src/iter/traits/accum.rs

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,8 +99,9 @@ macro_rules! integer_sum_product {
9999
}
100100

101101
macro_rules! saturating_integer_sum_product {
102-
(@impls $zero:expr, $one:expr, #[$attr:meta], $($a:ty)*) => ($(
102+
(@impls $zero:expr, $one:expr, $doc:expr, #[$attr:meta], $($a:ty)*) => ($(
103103
#[$attr]
104+
#[doc = $doc]
104105
impl Sum for $a {
105106
fn sum<I: Iterator<Item=Self>>(iter: I) -> Self {
106107
iter.fold(
@@ -112,6 +113,7 @@ macro_rules! saturating_integer_sum_product {
112113
}
113114

114115
#[$attr]
116+
#[doc = $doc]
115117
impl Product for $a {
116118
fn product<I: Iterator<Item=Self>>(iter: I) -> Self {
117119
iter.fold(
@@ -123,6 +125,7 @@ macro_rules! saturating_integer_sum_product {
123125
}
124126

125127
#[$attr]
128+
#[doc = $doc]
126129
impl<'a> Sum<&'a $a> for $a {
127130
fn sum<I: Iterator<Item=&'a Self>>(iter: I) -> Self {
128131
iter.fold(
@@ -134,6 +137,7 @@ macro_rules! saturating_integer_sum_product {
134137
}
135138

136139
#[$attr]
140+
#[doc = $doc]
137141
impl<'a> Product<&'a $a> for $a {
138142
fn product<I: Iterator<Item=&'a Self>>(iter: I) -> Self {
139143
iter.fold(
@@ -145,8 +149,9 @@ macro_rules! saturating_integer_sum_product {
145149
}
146150
)*);
147151
($($a:ty)*) => (
148-
integer_sum_product!(@impls Saturating(0), Saturating(1),
149-
#[stable(feature = "saturating_iter_arith", since = "1.14.0")],
152+
saturating_integer_sum_product!(@impls Saturating(0), Saturating(1),
153+
"The short-circuiting behavior of this implementation is unspecified. If you care about short-circuiting, use [`Iterator::fold`] directly.",
154+
#[stable(feature = "saturating_iter_arith", since = "CURRENT_RUSTC_VERSION")],
150155
$(Saturating<$a>)*);
151156
);
152157
}

library/coretests/tests/iter/traits/accum.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
use core::iter::*;
2+
use std::num::Saturating;
23

34
#[test]
45
fn test_iterator_sum() {
@@ -64,3 +65,38 @@ fn test_iterator_product_option() {
6465
let v: &[Option<i32>] = &[Some(1), None, Some(3), Some(4)];
6566
assert_eq!(v.iter().cloned().product::<Option<i32>>(), None);
6667
}
68+
69+
#[test]
70+
fn test_saturating_sum_product() {
71+
let v = (1u32..=10).map(|i| Saturating(i));
72+
assert_eq!(v.sum::<Saturating<u32>>(), Saturating(55));
73+
let v = (1u32..=10).map(|i| Saturating(i));
74+
assert_eq!(v.product::<Saturating<u32>>(), Saturating(3628800));
75+
let v = [Saturating(usize::MAX), Saturating(2)];
76+
assert_eq!(v.iter().copied().sum::<Saturating<usize>>(), Saturating(usize::MAX));
77+
assert_eq!(v.iter().copied().product::<Saturating<usize>>(), Saturating(usize::MAX));
78+
79+
let mut cnt = 0;
80+
let v = 250..=u8::MAX;
81+
assert_eq!(
82+
v.map(|i| {
83+
cnt += 1;
84+
Saturating(i)
85+
})
86+
.sum::<Saturating<u8>>(),
87+
Saturating(u8::MAX)
88+
);
89+
assert_eq!(cnt, 6); // no short-circuiting
90+
91+
let mut cnt = 0;
92+
let v = (250..=u8::MAX).chain(0..5);
93+
assert_eq!(
94+
v.map(|i| {
95+
cnt += 1;
96+
Saturating(i)
97+
})
98+
.product::<Saturating<u8>>(),
99+
Saturating(0)
100+
);
101+
assert_eq!(cnt, 11); // no short-circuiting
102+
}

0 commit comments

Comments
 (0)