diff --git a/rtc_base/numerics/sample_counter.cc b/rtc_base/numerics/sample_counter.cc index 16a8e25098..78e35fdb5b 100644 --- a/rtc_base/numerics/sample_counter.cc +++ b/rtc_base/numerics/sample_counter.cc @@ -31,6 +31,9 @@ void SampleCounter::Add(int sample) { if (!max_ || sample > *max_) { max_ = sample; } + if (!min_ || sample < *min_) { + min_ = sample; + } } void SampleCounter::Add(const SampleCounter& other) { @@ -45,6 +48,8 @@ void SampleCounter::Add(const SampleCounter& other) { num_samples_ += other.num_samples_; if (other.max_ && (!max_ || *max_ < *other.max_)) max_ = other.max_; + if (other.min_ && (!min_ || *min_ > *other.min_)) + min_ = other.min_; } absl::optional SampleCounter::Avg(int64_t min_required_samples) const { @@ -58,6 +63,10 @@ absl::optional SampleCounter::Max() const { return max_; } +absl::optional SampleCounter::Min() const { + return min_; +} + absl::optional SampleCounter::Sum(int64_t min_required_samples) const { RTC_DCHECK_GT(min_required_samples, 0); if (num_samples_ < min_required_samples) diff --git a/rtc_base/numerics/sample_counter.h b/rtc_base/numerics/sample_counter.h index 717a1afbcf..2b41f95fc0 100644 --- a/rtc_base/numerics/sample_counter.h +++ b/rtc_base/numerics/sample_counter.h @@ -26,6 +26,7 @@ class SampleCounter { void Add(int sample); absl::optional Avg(int64_t min_required_samples) const; absl::optional Max() const; + absl::optional Min() const; absl::optional Sum(int64_t min_required_samples) const; int64_t NumSamples() const; void Reset(); @@ -37,6 +38,7 @@ class SampleCounter { int64_t sum_ = 0; int64_t num_samples_ = 0; absl::optional max_; + absl::optional min_; }; class SampleCounterWithVariance : public SampleCounter { diff --git a/rtc_base/numerics/sample_counter_unittest.cc b/rtc_base/numerics/sample_counter_unittest.cc index 14b0573de9..ffc8b89f6f 100644 --- a/rtc_base/numerics/sample_counter_unittest.cc +++ b/rtc_base/numerics/sample_counter_unittest.cc @@ -24,6 +24,7 @@ TEST(SampleCounterTest, ProcessesNoSamples) { SampleCounter counter; EXPECT_THAT(counter.Avg(kMinSamples), Eq(absl::nullopt)); EXPECT_THAT(counter.Max(), Eq(absl::nullopt)); + EXPECT_THAT(counter.Min(), Eq(absl::nullopt)); } TEST(SampleCounterTest, NotEnoughSamples) { @@ -35,6 +36,7 @@ TEST(SampleCounterTest, NotEnoughSamples) { EXPECT_THAT(counter.Avg(kMinSamples), Eq(absl::nullopt)); EXPECT_THAT(counter.Sum(kMinSamples), Eq(absl::nullopt)); EXPECT_THAT(counter.Max(), Eq(5)); + EXPECT_THAT(counter.Min(), Eq(1)); } TEST(SampleCounterTest, EnoughSamples) { @@ -46,6 +48,7 @@ TEST(SampleCounterTest, EnoughSamples) { EXPECT_THAT(counter.Avg(kMinSamples), Eq(3)); EXPECT_THAT(counter.Sum(kMinSamples), Eq(15)); EXPECT_THAT(counter.Max(), Eq(5)); + EXPECT_THAT(counter.Min(), Eq(1)); } TEST(SampleCounterTest, ComputesVariance) { @@ -74,6 +77,7 @@ TEST(SampleCounterTest, AggregatesTwoCounters) { counter1.Add(counter2); EXPECT_THAT(counter1.Avg(kMinSamples), Eq(3)); EXPECT_THAT(counter1.Max(), Eq(5)); + EXPECT_THAT(counter1.Min(), Eq(1)); EXPECT_THAT(counter1.Variance(kMinSamples), Eq(2)); }