Title: [224762] trunk
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)
 {
     {
_______________________________________________
webkit-changes mailing list
[email protected]
https://lists.webkit.org/mailman/listinfo/webkit-changes

Reply via email to