Skip to content

Commit 2964406

Browse files
authored
Merge pull request azubieta#5 from azubieta/declare_copy_and_move_operators
Add copy and move operators and constructors
2 parents c7ecdd0 + b59e920 commit 2964406

File tree

3 files changed

+61
-13
lines changed

3 files changed

+61
-13
lines changed

include/XdgUtils/DesktopEntry/DesktopEntry.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,12 @@ namespace XdgUtils {
3030

3131
DesktopEntry(const DesktopEntry& other);
3232

33+
DesktopEntry& operator=(const DesktopEntry& other);
34+
35+
DesktopEntry(DesktopEntry&& other) noexcept;
36+
37+
DesktopEntry& operator=(DesktopEntry&& other) noexcept;
38+
3339
virtual ~DesktopEntry();
3440

3541
/**

src/DesktopEntry/DesktopEntry.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,24 @@ namespace XdgUtils {
150150
priv->updatePaths();
151151
}
152152

153+
DesktopEntry& DesktopEntry::operator=(const DesktopEntry& other) {
154+
priv->ast = other.priv->ast;
155+
priv->updatePaths();
156+
157+
return *this;
158+
}
159+
160+
DesktopEntry::DesktopEntry::DesktopEntry(DesktopEntry&& other) noexcept {
161+
priv = std::move(other.priv);
162+
}
163+
164+
165+
DesktopEntry& DesktopEntry::operator=(DesktopEntry&& other) noexcept {
166+
priv = std::move(other.priv);
167+
168+
return *this;
169+
}
170+
153171
DesktopEntry::~DesktopEntry() = default;
154172

155173
std::string DesktopEntry::get(const std::string& path, const std::string& fallback) const {
@@ -220,6 +238,7 @@ namespace XdgUtils {
220238
return !(rhs == *this);
221239
}
222240

241+
223242
DesktopEntryKeyValue DesktopEntry::operator[](const DesktopEntryKeyPath& keyPath) {
224243
auto entry = priv->getOrCreateEntry(keyPath);
225244

tests/DesktopEntry/TestDesktopEntry.cpp

Lines changed: 36 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
#include <XdgUtils/DesktopEntry/DesktopEntry.h>
44

5-
using namespace XdgUtils;
5+
using namespace XdgUtils::DesktopEntry;
66

77
class TestDesktopEntry : public ::testing::Test {
88
protected:
@@ -29,13 +29,13 @@ class TestDesktopEntry : public ::testing::Test {
2929

3030

3131
TEST_F(TestDesktopEntry, create) {
32-
DesktopEntry::DesktopEntry a;
32+
DesktopEntry a;
3333
auto entryPath = "Desktop Entry/Name";
3434
auto entryValue = "A";
3535
a.set(entryPath, entryValue);
3636

3737
// Copy constructor
38-
DesktopEntry::DesktopEntry b = a;
38+
DesktopEntry b = a;
3939
ASSERT_EQ(a.get(entryPath), b.get(entryPath));
4040

4141
ASSERT_EQ(a, b);
@@ -45,7 +45,7 @@ TEST_F(TestDesktopEntry, create) {
4545
}
4646

4747
TEST_F(TestDesktopEntry, readWrite) {
48-
DesktopEntry::DesktopEntry entry;
48+
DesktopEntry entry;
4949

5050
std::stringstream in(exampleDesktopEntry);
5151
in >> entry;
@@ -57,7 +57,7 @@ TEST_F(TestDesktopEntry, readWrite) {
5757
}
5858

5959
TEST_F(TestDesktopEntry, paths) {
60-
DesktopEntry::DesktopEntry entry{
60+
DesktopEntry entry{
6161
"[Desktop Entry]\n"
6262
"Version=1.0\n"
6363
"Type=Application\n"
@@ -104,7 +104,7 @@ TEST_F(TestDesktopEntry, get) {
104104
"Name=Create a new Foo!\n"
105105
"Icon=fooview-new\n";
106106

107-
DesktopEntry::DesktopEntry entry;
107+
DesktopEntry entry;
108108

109109
std::stringstream in(s);
110110
in >> entry;
@@ -115,7 +115,7 @@ TEST_F(TestDesktopEntry, get) {
115115
}
116116

117117
TEST_F(TestDesktopEntry, set) {
118-
DesktopEntry::DesktopEntry entry;
118+
DesktopEntry entry;
119119
entry.set("A/B", "C");
120120

121121
std::stringstream out;
@@ -126,7 +126,7 @@ TEST_F(TestDesktopEntry, set) {
126126
}
127127

128128
TEST_F(TestDesktopEntry, edit) {
129-
DesktopEntry::DesktopEntry entry;
129+
DesktopEntry entry;
130130

131131
std::stringstream in(exampleDesktopEntry);
132132
in >> entry;
@@ -157,7 +157,7 @@ TEST_F(TestDesktopEntry, edit) {
157157
}
158158

159159
TEST_F(TestDesktopEntry, exists) {
160-
DesktopEntry::DesktopEntry entry;
160+
DesktopEntry entry;
161161

162162
std::stringstream in(exampleDesktopEntry);
163163
in >> entry;
@@ -167,7 +167,7 @@ TEST_F(TestDesktopEntry, exists) {
167167
}
168168

169169
TEST_F(TestDesktopEntry, removeGroup) {
170-
DesktopEntry::DesktopEntry entry;
170+
DesktopEntry entry;
171171

172172
std::string entryStr = {"[G1]\nName=1\n[g2]\nName=2\n"};
173173
std::stringstream in(entryStr);
@@ -184,7 +184,7 @@ TEST_F(TestDesktopEntry, removeGroup) {
184184
}
185185

186186
TEST_F(TestDesktopEntry, removeEntry) {
187-
DesktopEntry::DesktopEntry entry;
187+
DesktopEntry entry;
188188

189189
std::string entryStr = {"[G1]\nName=1\nIcon=1\n[g2]\nName=2\n"};
190190
std::stringstream in(entryStr);
@@ -201,7 +201,7 @@ TEST_F(TestDesktopEntry, removeEntry) {
201201
}
202202

203203
TEST_F(TestDesktopEntry, arraySubscriptOperatorAccessGroup) {
204-
DesktopEntry::DesktopEntry entry;
204+
DesktopEntry entry;
205205

206206
entry["Group"] = "Group";
207207

@@ -212,7 +212,7 @@ TEST_F(TestDesktopEntry, arraySubscriptOperatorAccessGroup) {
212212
}
213213

214214
TEST_F(TestDesktopEntry, arraySubscriptOperatorAccessEntry) {
215-
DesktopEntry::DesktopEntry entry;
215+
DesktopEntry entry;
216216
entry["Group/Key"] = "My App";
217217

218218
ASSERT_EQ(static_cast<std::string>(entry["Group/Key"]), "My App");
@@ -223,3 +223,26 @@ TEST_F(TestDesktopEntry, arraySubscriptOperatorAccessEntry) {
223223
ASSERT_EQ(out.str(), "[Group]\n"
224224
"Key=My App");
225225
}
226+
227+
TEST_F(TestDesktopEntry, copy) {
228+
DesktopEntry a;
229+
a["g/k"] = "v";
230+
231+
// Assert that values are copied
232+
DesktopEntry b = a;
233+
ASSERT_EQ(static_cast<std::string>(b["g/k"]), "v");
234+
235+
// Assert that b inner data pointers are different from the a ones
236+
b["g/k"] = "v1";
237+
ASSERT_EQ(static_cast<std::string>(a["g/k"]), "v");
238+
ASSERT_EQ(static_cast<std::string>(b["g/k"]), "v1");
239+
}
240+
241+
TEST_F(TestDesktopEntry, move) {
242+
DesktopEntry a;
243+
a["g/k"] = "v";
244+
245+
// Assert that values are copied
246+
DesktopEntry b = std::move(a);
247+
ASSERT_EQ(static_cast<std::string>(b["g/k"]), "v");
248+
}

0 commit comments

Comments
 (0)