From 9a9d46f6b6a09607c00bef0f85d302f2f70759a4 Mon Sep 17 00:00:00 2001 From: Ben Clayton Date: Fri, 24 Jan 2020 15:03:29 +0000 Subject: [PATCH] Fix bad usage of std::move Issue #16 describes the problem and solution perfectly. Updated tests to cover this. Fixes #16 --- include/dap/optional.h | 6 ++--- src/optional_test.cpp | 61 +++++++++++++++++++++++------------------- 2 files changed, 37 insertions(+), 30 deletions(-) diff --git a/include/dap/optional.h b/include/dap/optional.h index 06b298c..7e1d283 100644 --- a/include/dap/optional.h +++ b/include/dap/optional.h @@ -17,7 +17,7 @@ #include #include -#include // std::move +#include // std::move, std::forward namespace dap { @@ -104,7 +104,7 @@ optional::optional(optional&& other) : set(other.has_value()) { template template -optional::optional(U&& value) : val(std::move(value)), set(true) {} +optional::optional(U&& value) : val(std::forward(value)), set(true) {} template T& optional::value() { @@ -153,7 +153,7 @@ optional& optional::operator=(optional&& other) noexcept { template template optional& optional::operator=(U&& value) { - val = std::move(value); + val = std::forward(value); set = true; return *this; } diff --git a/src/optional_test.cpp b/src/optional_test.cpp index 4d78379..b2590fc 100644 --- a/src/optional_test.cpp +++ b/src/optional_test.cpp @@ -17,23 +17,27 @@ #include "gmock/gmock.h" #include "gtest/gtest.h" +#include + TEST(Optional, EmptyConstruct) { - dap::optional opt; + dap::optional opt; ASSERT_FALSE(opt); ASSERT_FALSE(opt.has_value()); } TEST(Optional, ValueConstruct) { - dap::optional opt(0); + dap::optional opt(10); ASSERT_TRUE(opt); ASSERT_TRUE(opt.has_value()); + ASSERT_EQ(opt.value(), 10); } TEST(Optional, CopyConstruct) { - dap::optional a(10); - dap::optional b(a); + dap::optional a("meow"); + dap::optional b(a); ASSERT_EQ(a, b); - ASSERT_EQ(b.value(), 10); + ASSERT_EQ(a.value(), "meow"); + ASSERT_EQ(b.value(), "meow"); } TEST(Optional, CopyCastConstruct) { @@ -44,9 +48,9 @@ TEST(Optional, CopyCastConstruct) { } TEST(Optional, MoveConstruct) { - dap::optional a(10); - dap::optional b(std::move(a)); - ASSERT_EQ(b.value(), 10); + dap::optional a("meow"); + dap::optional b(std::move(a)); + ASSERT_EQ(b.value(), "meow"); } TEST(Optional, MoveCastConstruct) { @@ -56,33 +60,36 @@ TEST(Optional, MoveCastConstruct) { } TEST(Optional, AssignValue) { - dap::optional a; - a = 10; - ASSERT_EQ(a.value(), 10); + dap::optional a; + std::string b = "meow"; + a = b; + ASSERT_EQ(a.value(), "meow"); + ASSERT_EQ(b, "meow"); } TEST(Optional, AssignOptional) { - dap::optional a; - dap::optional b(10); + dap::optional a; + dap::optional b("meow"); a = b; - ASSERT_EQ(a.value(), 10); + ASSERT_EQ(a.value(), "meow"); + ASSERT_EQ(b.value(), "meow"); } TEST(Optional, MoveAssignOptional) { - dap::optional a; - dap::optional b(10); + dap::optional a; + dap::optional b("meow"); a = std::move(b); - ASSERT_EQ(a.value(), 10); + ASSERT_EQ(a.value(), "meow"); } TEST(Optional, StarDeref) { - dap::optional a(10); - ASSERT_EQ(*a, 10); + dap::optional a("meow"); + ASSERT_EQ(*a, "meow"); } TEST(Optional, StarDerefConst) { - const dap::optional a(10); - ASSERT_EQ(*a, 10); + const dap::optional a("meow"); + ASSERT_EQ(*a, "meow"); } TEST(Optional, ArrowDeref) { @@ -102,15 +109,15 @@ TEST(Optional, ArrowDerefConst) { } TEST(Optional, Value) { - const dap::optional a(10); - ASSERT_EQ(a.value(), 10); + const dap::optional a("meow"); + ASSERT_EQ(a.value(), "meow"); } TEST(Optional, ValueDefault) { - const dap::optional a; - const dap::optional b(20); - ASSERT_EQ(a.value(10), 10); - ASSERT_EQ(b.value(10), 20); + const dap::optional a; + const dap::optional b("woof"); + ASSERT_EQ(a.value("meow"), "meow"); + ASSERT_EQ(b.value("meow"), "woof"); } TEST(Optional, CompareLT) {