diff options
author | Andreas Kling <kling@serenityos.org> | 2021-09-04 00:44:10 +0200 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-09-04 03:02:08 +0200 |
commit | 7dda773426881fa54354c23677aaa911608b3eb9 (patch) | |
tree | 02a2f3fecc55ad2695bbba1a7d74649410034aca /Tests | |
parent | 0b36499f4688e784b1d2a30675afcd11d9414db9 (diff) | |
download | serenity-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.cpp | 21 |
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 { |