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) {