From adaf511221e26305167936e6ebb22f50aa900439 Mon Sep 17 00:00:00 2001 From: Danil Chapovalov Date: Mon, 9 May 2022 16:01:25 +0200 Subject: [PATCH] Extend UnitBase multiplication to support size_t Bug: None Change-Id: I8dcb85cdb2819df54d4cb0cae59b77d7d629123a Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/260941 Reviewed-by: Sebastian Jansson Commit-Queue: Danil Chapovalov Cr-Commit-Position: refs/heads/main@{#36828} --- api/units/time_delta_unittest.cc | 28 ++++++++++++++++++++-------- rtc_base/units/unit_base.h | 8 ++++++++ 2 files changed, 28 insertions(+), 8 deletions(-) diff --git a/api/units/time_delta_unittest.cc b/api/units/time_delta_unittest.cc index 3483d641bd..51a7aa233a 100644 --- a/api/units/time_delta_unittest.cc +++ b/api/units/time_delta_unittest.cc @@ -187,14 +187,6 @@ TEST(TimeDeltaTest, MathOperations) { EXPECT_EQ((delta_a + delta_b).ms(), kValueA + kValueB); EXPECT_EQ((delta_a - delta_b).ms(), kValueA - kValueB); - const int32_t kInt32Value = 123; - const double kFloatValue = 123.0; - EXPECT_EQ((TimeDelta::Micros(kValueA) * kValueB).us(), kValueA * kValueB); - EXPECT_EQ((TimeDelta::Micros(kValueA) * kInt32Value).us(), - kValueA * kInt32Value); - EXPECT_EQ((TimeDelta::Micros(kValueA) * kFloatValue).us(), - kValueA * kFloatValue); - EXPECT_EQ((delta_b / 10).ms(), kValueB / 10); EXPECT_EQ(delta_b / delta_a, static_cast(kValueB) / kValueA); @@ -208,6 +200,26 @@ TEST(TimeDeltaTest, MathOperations) { EXPECT_EQ(mutable_delta, TimeDelta::Millis(kValueA)); } +TEST(TimeDeltaTest, MultiplyByScalar) { + const TimeDelta kValue = TimeDelta::Micros(267); + const int64_t kInt64 = 450; + const int32_t kInt32 = 123; + const size_t kUnsignedInt = 125; + const double kFloat = 123.0; + + EXPECT_EQ((kValue * kInt64).us(), kValue.us() * kInt64); + EXPECT_EQ(kValue * kInt64, kInt64 * kValue); + + EXPECT_EQ((kValue * kInt32).us(), kValue.us() * kInt32); + EXPECT_EQ(kValue * kInt32, kInt32 * kValue); + + EXPECT_EQ((kValue * kUnsignedInt).us(), kValue.us() * int64_t{kUnsignedInt}); + EXPECT_EQ(kValue * kUnsignedInt, kUnsignedInt * kValue); + + EXPECT_DOUBLE_EQ((kValue * kFloat).us(), kValue.us() * kFloat); + EXPECT_EQ(kValue * kFloat, kFloat * kValue); +} + TEST(TimeDeltaTest, InfinityOperations) { const int64_t kValue = 267; const TimeDelta finite = TimeDelta::Millis(kValue); diff --git a/rtc_base/units/unit_base.h b/rtc_base/units/unit_base.h index 57cdd8c8b6..0cd6a61215 100644 --- a/rtc_base/units/unit_base.h +++ b/rtc_base/units/unit_base.h @@ -281,6 +281,9 @@ class RelativeUnit : public UnitBase { constexpr Unit_T operator*(int32_t scalar) const { return UnitBase::FromValue(this->ToValue() * scalar); } + constexpr Unit_T operator*(size_t scalar) const { + return UnitBase::FromValue(this->ToValue() * scalar); + } protected: using UnitBase::UnitBase; @@ -298,6 +301,11 @@ template inline constexpr Unit_T operator*(int32_t scalar, RelativeUnit other) { return other * scalar; } +template +inline constexpr Unit_T operator*(size_t scalar, RelativeUnit other) { + return other * scalar; +} + template inline constexpr Unit_T operator-(RelativeUnit other) { if (other.IsPlusInfinity())