Skip to content

Commit 34acf56

Browse files
authored
Optional copy constructor and assignment operator (#23)
* Regression tests for crash in optional * Copy constructor and assignment operator for optional
1 parent 97a363f commit 34acf56

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

include/optional.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,23 @@ class optional {
4747
{
4848
reset();
4949
}
50+
51+
optional& operator=(optional const& other)
52+
{
53+
_value = nullptr;
54+
if (other.has_value()) {
55+
_value = new T{ other.value() };
56+
}
57+
return *this;
58+
}
59+
60+
optional(const optional& other)
61+
{
62+
_value = nullptr;
63+
if (other.has_value()) {
64+
_value = new T{ other.value() };
65+
}
66+
}
5067

5168
optional(T const& val)
5269
: _value(new T{val})

tests/optional_test.cc

Lines changed: 57 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,65 @@ TEST(OptionalTest, ValidTest) {
3636
EXPECT_EQ(5, index.value());
3737
}
3838

39-
TEST(OptionalTest, AssignmentTest) {
39+
TEST(OptionalTest, AssignmentFromValueTest) {
4040
optional_t<int> index(5);
4141
index = 3;
4242
EXPECT_TRUE(index.has_value());
4343
EXPECT_EQ(3, index.value());
4444
}
45+
46+
TEST(OptionalTest, AssignmentFromOptionalTest) {
47+
optional_t<int> v1(5);
48+
const optional_t<int> v2(2);
49+
v1 = v2;
50+
EXPECT_TRUE(v1.has_value());
51+
EXPECT_EQ(2, v1.value());
52+
EXPECT_TRUE(v2.has_value());
53+
EXPECT_EQ(2, v2.value());
54+
}
55+
56+
TEST(OptionalTest, AssignmentFromNullOptionalTest) {
57+
optional_t<int> v1(5);
58+
const optional_t<int> v2;
59+
v1 = v2;
60+
EXPECT_FALSE(v1.has_value());
61+
EXPECT_FALSE(v2.has_value());
62+
}
63+
64+
TEST(OptionalTest, AssignmentToNullFromValueTest) {
65+
optional_t<int> index;
66+
index = 3;
67+
EXPECT_TRUE(index.has_value());
68+
EXPECT_EQ(3, index.value());
69+
}
70+
71+
TEST(OptionalTest, AssignmentToNullFromOptionalTest) {
72+
optional_t<int> v1;
73+
const optional_t<int> v2(2);
74+
v1 = v2;
75+
EXPECT_TRUE(v1.has_value());
76+
EXPECT_EQ(2, v1.value());
77+
EXPECT_TRUE(v2.has_value());
78+
EXPECT_EQ(2, v2.value());
79+
}
80+
81+
TEST(OptionalTest, AssignmentToNullFromNullOptionalTest) {
82+
optional_t<int> v1;
83+
const optional_t<int> v2;
84+
v1 = v2;
85+
EXPECT_FALSE(v1.has_value());
86+
EXPECT_FALSE(v2.has_value());
87+
}
88+
89+
TEST(OptionalTest, CopyConstructorTest) {
90+
const optional_t<int> v2(5);
91+
const optional_t<int> v1(v2);
92+
EXPECT_TRUE(v1.has_value());
93+
EXPECT_EQ(5, v2.value());
94+
}
95+
96+
TEST(OptionalTest, CopyConstructorNullTest) {
97+
const optional_t<int> v2;
98+
const optional_t<int> v1(v2);
99+
EXPECT_FALSE(v1.has_value());
100+
}

0 commit comments

Comments
 (0)