From c4fd23cdda1fb6b8f1ac5f3105c864c22c3ce704 Mon Sep 17 00:00:00 2001 From: danilchap Date: Mon, 17 Oct 2016 07:16:54 -0700 Subject: [PATCH] Add rtc::Optional::reset BUG=None Review-Url: https://codereview.webrtc.org/2426473004 Cr-Commit-Position: refs/heads/master@{#14651} --- webrtc/base/optional.h | 21 +++++++++++++-------- webrtc/base/optional_unittest.cc | 23 +++++++++++++++++++++++ 2 files changed, 36 insertions(+), 8 deletions(-) diff --git a/webrtc/base/optional.h b/webrtc/base/optional.h index b047fabc42..1bcfd1a8c2 100644 --- a/webrtc/base/optional.h +++ b/webrtc/base/optional.h @@ -132,10 +132,8 @@ class Optional final { new (&value_) T(m.value_); // T's copy constructor. has_value_ = true; } - } else if (has_value_) { - value_.~T(); - has_value_ = false; - PoisonValue(); + } else { + reset(); } return *this; } @@ -152,10 +150,8 @@ class Optional final { new (&value_) T(std::move(m.value_)); // T's move constructor. has_value_ = true; } - } else if (has_value_) { - value_.~T(); - has_value_ = false; - PoisonValue(); + } else { + reset(); } return *this; } @@ -188,6 +184,15 @@ class Optional final { } } + // Destroy any contained value. Has no effect if we have no value. + void reset() { + if (!has_value_) + return; + value_.~T(); + has_value_ = false; + PoisonValue(); + } + // Conversion to bool to test if we have a value. explicit operator bool() const { return has_value_; } diff --git a/webrtc/base/optional_unittest.cc b/webrtc/base/optional_unittest.cc index b51701f6b2..056e9113df 100644 --- a/webrtc/base/optional_unittest.cc +++ b/webrtc/base/optional_unittest.cc @@ -369,6 +369,29 @@ TEST(OptionalTest, TestMoveAssignToFullFromT) { *log); } +TEST(OptionalTest, TestResetEmpty) { + auto log = Logger::Setup(); + { + Optional x; + x.reset(); + } + EXPECT_EQ(V(), *log); +} + +TEST(OptionalTest, TestResetFull) { + auto log = Logger::Setup(); + { + Optional x(Logger(17)); + log->push_back("---"); + x.reset(); + log->push_back("---"); + } + EXPECT_EQ( + V("0:17. explicit constructor", "1:17. move constructor (from 0:17)", + "0:17. destructor", "---", "1:17. destructor", "---"), + *log); +} + TEST(OptionalTest, TestDereference) { auto log = Logger::Setup(); {