- Revision
- 224762
- Author
- [email protected]
- Date
- 2017-11-13 11:19:30 -0800 (Mon, 13 Nov 2017)
Log Message
std::expected: fix and test move
https://bugs.webkit.org/show_bug.cgi?id=179617
Reviewed by Alex Christensen.
Source/WTF:
Non-copyable move types should be able to be in an expected
properly.
* wtf/Expected.h:
(WTF::Expected::value const):
(WTF::Expected::error):
(WTF::Expected::error const):
Tools:
Test that unique_ptr can be moved around properly, both has a
value and an error (and in a <void, unique> specialization).
* TestWebKitAPI/Tests/WTF/Expected.cpp:
(TestWebKitAPI::snowflake::reset):
(TestWebKitAPI::snowflake::snowflake):
(TestWebKitAPI::snowflake::~snowflake):
(TestWebKitAPI::TEST):
Modified Paths
Diff
Modified: trunk/Source/WTF/ChangeLog (224761 => 224762)
--- trunk/Source/WTF/ChangeLog 2017-11-13 19:17:09 UTC (rev 224761)
+++ trunk/Source/WTF/ChangeLog 2017-11-13 19:19:30 UTC (rev 224762)
@@ -1,3 +1,18 @@
+2017-11-13 JF Bastien <[email protected]>
+
+ std::expected: fix and test move
+ https://bugs.webkit.org/show_bug.cgi?id=179617
+
+ Reviewed by Alex Christensen.
+
+ Non-copyable move types should be able to be in an expected
+ properly.
+
+ * wtf/Expected.h:
+ (WTF::Expected::value const):
+ (WTF::Expected::error):
+ (WTF::Expected::error const):
+
2017-11-10 Jer Noble <[email protected]>
Add a FairPlay Streaming based CDM for Modern EME
Modified: trunk/Source/WTF/wtf/Expected.h (224761 => 224762)
--- trunk/Source/WTF/wtf/Expected.h 2017-11-13 19:17:09 UTC (rev 224761)
+++ trunk/Source/WTF/wtf/Expected.h 2017-11-13 19:19:30 UTC (rev 224762)
@@ -327,12 +327,12 @@
constexpr bool hasValue() const { return base::has; }
constexpr const ValueType& value() const & { return base::has ? base::s.val : (ExpectedDetail::Throw(), base::s.val); }
RELAXED_CONSTEXPR ValueType& value() & { return base::has ? base::s.val : (ExpectedDetail::Throw(), base::s.val); }
- constexpr const ValueType&& value() const && { return base::has ? base::s.val : (ExpectedDetail::Throw(), base::s.val); }
+ constexpr const ValueType&& value() const && { return WTFMove(base::has ? base::s.val : (ExpectedDetail::Throw(), base::s.val)); }
RELAXED_CONSTEXPR ValueType&& value() && { return WTFMove(base::has ? base::s.val : (ExpectedDetail::Throw(), base::s.val)); }
constexpr const ErrorType& error() const & { return !base::has ? base::s.err : (ExpectedDetail::Throw(), base::s.err); }
ErrorType& error() & { return !base::has ? base::s.err : (ExpectedDetail::Throw(), base::s.err); }
- RELAXED_CONSTEXPR ErrorType&& error() && { return !base::has ? base::s.err : (ExpectedDetail::Throw(), base::s.err); }
- constexpr const ErrorType&& error() const && { return !base::has ? base::s.err : (ExpectedDetail::Throw(), base::s.err); }
+ RELAXED_CONSTEXPR ErrorType&& error() && { return WTFMove(!base::has ? base::s.err : (ExpectedDetail::Throw(), base::s.err)); }
+ constexpr const ErrorType&& error() const && { return WTFMove(!base::has ? base::s.err : (ExpectedDetail::Throw(), base::s.err)); }
constexpr UnexpectedType getUnexpected() const { return UnexpectedType(base::s.err); }
template<class U> constexpr ValueType valueOr(U&& u) const & { return base::has ? **this : static_cast<ValueType>(std::forward<U>(u)); }
template<class U> ValueType valueOr(U&& u) && { return base::has ? WTFMove(**this) : static_cast<ValueType>(std::forward<U>(u)); }
@@ -391,10 +391,8 @@
constexpr bool hasValue() const { return base::has; }
void value() const { !base::has ? ExpectedDetail::Throw() : void(); }
constexpr const E& error() const & { return !base::has ? base::s.err : (ExpectedDetail::Throw(), base::s.err); }
- E& error() & { return !base::has ? base::s.err : (ExpectedDetail::Throw(), base::s.err); } // Not in the current paper.
- RELAXED_CONSTEXPR E&& error() && { return !base::has ? base::s.err : (ExpectedDetail::Throw(), base::s.err); }
- constexpr const E&& error() const && { return !base::has ? base::s.err : (ExpectedDetail::Throw(), base::s.err); } // Not in the current paper.
- // constexpr E& error() &;
+ E& error() & { return !base::has ? base::s.err : (ExpectedDetail::Throw(), base::s.err); }
+ RELAXED_CONSTEXPR E&& error() && { return WTFMove(!base::has ? base::s.err : (ExpectedDetail::Throw(), base::s.err)); }
constexpr UnexpectedType getUnexpected() const { return UnexpectedType(base::s.err); }
};
Modified: trunk/Tools/ChangeLog (224761 => 224762)
--- trunk/Tools/ChangeLog 2017-11-13 19:17:09 UTC (rev 224761)
+++ trunk/Tools/ChangeLog 2017-11-13 19:19:30 UTC (rev 224762)
@@ -1,3 +1,19 @@
+2017-11-13 JF Bastien <[email protected]>
+
+ std::expected: fix and test move
+ https://bugs.webkit.org/show_bug.cgi?id=179617
+
+ Reviewed by Alex Christensen.
+
+ Test that unique_ptr can be moved around properly, both has a
+ value and an error (and in a <void, unique> specialization).
+
+ * TestWebKitAPI/Tests/WTF/Expected.cpp:
+ (TestWebKitAPI::snowflake::reset):
+ (TestWebKitAPI::snowflake::snowflake):
+ (TestWebKitAPI::snowflake::~snowflake):
+ (TestWebKitAPI::TEST):
+
2017-11-13 Basuke Suzuki <[email protected]>
[Windows] Make the port's normalize_test_name() method platform independent.
Modified: trunk/Tools/TestWebKitAPI/Tests/WTF/Expected.cpp (224761 => 224762)
--- trunk/Tools/TestWebKitAPI/Tests/WTF/Expected.cpp 2017-11-13 19:17:09 UTC (rev 224761)
+++ trunk/Tools/TestWebKitAPI/Tests/WTF/Expected.cpp 2017-11-13 19:19:30 UTC (rev 224762)
@@ -27,9 +27,11 @@
#include "RefLogger.h"
+#include <memory>
#include <string>
#include <wtf/Expected.h>
+#include <wtf/StdLibExtras.h>
#include <wtf/Ref.h>
namespace WTF {
@@ -392,6 +394,72 @@
EXPECT_EQ(NonTrivialDtor::count, 11);
}
+static int snowflakes = 0;
+static int melted = 0;
+struct snowflake {
+ static void reset() { snowflakes = melted = 0; }
+ snowflake() { ++snowflakes; }
+ ~snowflake() { ++melted; }
+};
+
+TEST(WTF_Expected, unique_ptr)
+{
+ // Unique snowflakes cannot be copied.
+ {
+ auto s = makeUnexpected(std::make_unique<snowflake>());
+ EXPECT_EQ(snowflakes, 1);
+ EXPECT_EQ(melted, 0);
+ }
+ EXPECT_EQ(snowflakes, 1);
+ EXPECT_EQ(melted, 1);
+ snowflake::reset();
+
+ {
+ auto s = makeUnexpected(std::make_unique<snowflake>());
+ Unexpected<std::unique_ptr<snowflake>> c(WTFMove(s));
+ EXPECT_EQ(snowflakes, 1);
+ EXPECT_EQ(melted, 0);
+ }
+ EXPECT_EQ(snowflakes, 1);
+ EXPECT_EQ(melted, 1);
+ snowflake::reset();
+
+ auto plow = [] (std::unique_ptr<snowflake>&& s)
+ {
+ {
+ std::unique_ptr<snowflake> moved = WTFMove(s);
+ EXPECT_EQ(snowflakes, 1);
+ EXPECT_EQ(melted, 0);
+ }
+ EXPECT_EQ(snowflakes, 1);
+ EXPECT_EQ(melted, 1);
+ };
+
+ {
+ Expected<std::unique_ptr<snowflake>, int> s(std::make_unique<snowflake>());
+ plow(WTFMove(s).value());
+ }
+ EXPECT_EQ(snowflakes, 1);
+ EXPECT_EQ(melted, 1);
+ snowflake::reset();
+
+ {
+ Expected<int, std::unique_ptr<snowflake>> s(makeUnexpected(std::make_unique<snowflake>()));
+ plow(WTFMove(s).error());
+ }
+ EXPECT_EQ(snowflakes, 1);
+ EXPECT_EQ(melted, 1);
+ snowflake::reset();
+
+ {
+ Expected<void, std::unique_ptr<snowflake>> s(makeUnexpected(std::make_unique<snowflake>()));
+ plow(WTFMove(s).error());
+ }
+ EXPECT_EQ(snowflakes, 1);
+ EXPECT_EQ(melted, 1);
+ snowflake::reset();
+}
+
TEST(WTF_Expected, Ref)
{
{