From 8ab87e41a19c4bf9ccb8300a29f707ee07c9ad33 Mon Sep 17 00:00:00 2001 From: philipel Date: Mon, 19 Jul 2021 15:40:17 +0200 Subject: [PATCH] Add UnwrapForward and UnwrapBackwards to SeqNumUnwrapper. Bug: webrtc:12979 Change-Id: I4c3b3f5e1ff70ae528cfd73a34baafc75cccf481 Reviewed-on: https://webrtc-review.googlesource.com/c/src/+/226462 Reviewed-by: Mirko Bonadei Commit-Queue: Philip Eliasson Cr-Commit-Position: refs/heads/master@{#34505} --- rtc_base/numerics/sequence_number_util.h | 22 +++++++++++++++ .../numerics/sequence_number_util_unittest.cc | 28 +++++++++++++++++++ 2 files changed, 50 insertions(+) diff --git a/rtc_base/numerics/sequence_number_util.h b/rtc_base/numerics/sequence_number_util.h index 96a4974ec5..5b4ad10e94 100644 --- a/rtc_base/numerics/sequence_number_util.h +++ b/rtc_base/numerics/sequence_number_util.h @@ -109,6 +109,28 @@ class SeqNumUnwrapper { return last_unwrapped_; } + int64_t UnwrapForward(T value) { + if (!last_value_) { + last_unwrapped_ = {value}; + } else { + last_unwrapped_ += ForwardDiff(*last_value_, value); + } + + last_value_ = value; + return last_unwrapped_; + } + + int64_t UnwrapBackwards(T value) { + if (!last_value_) { + last_unwrapped_ = {value}; + } else { + last_unwrapped_ -= ReverseDiff(*last_value_, value); + } + + last_value_ = value; + return last_unwrapped_; + } + private: int64_t last_unwrapped_ = 0; absl::optional last_value_; diff --git a/rtc_base/numerics/sequence_number_util_unittest.cc b/rtc_base/numerics/sequence_number_util_unittest.cc index d7fa0b1467..c353c921fa 100644 --- a/rtc_base/numerics/sequence_number_util_unittest.cc +++ b/rtc_base/numerics/sequence_number_util_unittest.cc @@ -303,4 +303,32 @@ TEST(SeqNumUnwrapper, ManyBackwardWraps) { } } +TEST(SeqNumUnwrapper, UnwrapForward) { + SeqNumUnwrapper unwrapper; + EXPECT_EQ(255, unwrapper.Unwrap(255)); + EXPECT_EQ(256, unwrapper.UnwrapForward(0)); + EXPECT_EQ(511, unwrapper.UnwrapForward(255)); +} + +TEST(SeqNumUnwrapper, UnwrapForwardWithDivisor) { + SeqNumUnwrapper unwrapper; + EXPECT_EQ(30, unwrapper.UnwrapForward(30)); + EXPECT_EQ(36, unwrapper.UnwrapForward(3)); + EXPECT_EQ(63, unwrapper.UnwrapForward(30)); +} + +TEST(SeqNumUnwrapper, UnwrapBackwards) { + SeqNumUnwrapper unwrapper; + EXPECT_EQ(0, unwrapper.UnwrapBackwards(0)); + EXPECT_EQ(-2, unwrapper.UnwrapBackwards(254)); + EXPECT_EQ(-256, unwrapper.UnwrapBackwards(0)); +} + +TEST(SeqNumUnwrapper, UnwrapBackwardsWithDivisor) { + SeqNumUnwrapper unwrapper; + EXPECT_EQ(0, unwrapper.Unwrap(0)); + EXPECT_EQ(-2, unwrapper.UnwrapBackwards(31)); + EXPECT_EQ(-33, unwrapper.UnwrapBackwards(0)); +} + } // namespace webrtc