summaryrefslogtreecommitdiff
path: root/Tests
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-09-04 00:44:10 +0200
committerAndreas Kling <kling@serenityos.org>2021-09-04 03:02:08 +0200
commit7dda773426881fa54354c23677aaa911608b3eb9 (patch)
tree02a2f3fecc55ad2695bbba1a7d74649410034aca /Tests
parent0b36499f4688e784b1d2a30675afcd11d9414db9 (diff)
downloadserenity-7dda773426881fa54354c23677aaa911608b3eb9.zip
AK: Add rvalue-ref qualifiers for Optional's value() and value_or()
This avoids a value copy when calling value() or value_or() on a temporary Optional. This is very common when using the HashMap::get() API like this: auto value = hash_map.get(key).value_or(fallback_value);
Diffstat (limited to 'Tests')
-rw-r--r--Tests/AK/TestOptional.cpp21
1 files changed, 21 insertions, 0 deletions
diff --git a/Tests/AK/TestOptional.cpp b/Tests/AK/TestOptional.cpp
index 485a37f248..006fe20716 100644
--- a/Tests/AK/TestOptional.cpp
+++ b/Tests/AK/TestOptional.cpp
@@ -34,6 +34,27 @@ TEST_CASE(move_optional)
EXPECT_EQ(x.has_value(), false);
}
+TEST_CASE(optional_rvalue_ref_qualified_getters)
+{
+ struct DontCopyMe {
+ DontCopyMe() { }
+ ~DontCopyMe() = default;
+ DontCopyMe(DontCopyMe&&) = default;
+ DontCopyMe& operator=(DontCopyMe&&) = default;
+ DontCopyMe(DontCopyMe const&) = delete;
+ DontCopyMe& operator=(DontCopyMe const&) = delete;
+
+ int x { 13 };
+ };
+
+ auto make_an_optional = []() -> Optional<DontCopyMe> {
+ return DontCopyMe {};
+ };
+
+ EXPECT_EQ(make_an_optional().value().x, 13);
+ EXPECT_EQ(make_an_optional().value_or(DontCopyMe {}).x, 13);
+}
+
TEST_CASE(optional_leak_1)
{
struct Structure {