Skip to content

Commit 0838494

Browse files
authored
Merge pull request #250 from scratchcpp/variable_list_clone
Add clone method to Variable and List class
2 parents 4c49258 + d13078b commit 0838494

File tree

7 files changed

+63
-8
lines changed

7 files changed

+63
-8
lines changed

include/scratchcpp/list.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class LIBSCRATCHCPP_EXPORT List
3939

4040
std::string toString() const;
4141

42+
std::shared_ptr<List> clone();
43+
4244
private:
4345
spimpl::unique_impl_ptr<ListPrivate> impl;
4446
};

include/scratchcpp/variable.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class LIBSCRATCHCPP_EXPORT Variable : public Entity
2929
bool isCloudVariable() const;
3030
void setIsCloudVariable(bool isCloudVariable);
3131

32+
std::shared_ptr<Variable> clone();
33+
3234
private:
3335
spimpl::unique_impl_ptr<VariablePrivate> impl;
3436
};

src/scratch/list.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,3 +76,14 @@ std::string List::toString() const
7676

7777
return ret;
7878
}
79+
80+
/*! Creates a copy of the list. */
81+
std::shared_ptr<List> List::clone()
82+
{
83+
auto copy = std::make_shared<List>(id(), impl->name);
84+
85+
for (const Value &item : *this)
86+
copy->push_back(item);
87+
88+
return copy;
89+
}

src/scratch/sprite.cpp

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,17 +57,12 @@ std::shared_ptr<Sprite> Sprite::clone()
5757
const auto &vars = variables();
5858

5959
for (auto var : vars)
60-
clone->addVariable(std::make_shared<Variable>(var->id(), var->name(), var->value()));
60+
clone->addVariable(var->clone());
6161

6262
const auto &l = lists();
6363

64-
for (auto list : l) {
65-
auto newList = std::make_shared<List>(list->id(), list->name());
66-
clone->addList(newList);
67-
68-
for (const Value &item : *list)
69-
newList->push_back(item);
70-
}
64+
for (auto list : l)
65+
clone->addList(list->clone());
7166

7267
clone->setCurrentCostume(currentCostume());
7368
clone->setLayerOrder(layerOrder());

src/scratch/variable.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,3 +48,9 @@ void Variable::setIsCloudVariable(bool isCloudVariable)
4848
{
4949
impl->isCloudVariable = isCloudVariable;
5050
}
51+
52+
/*! Creates a copy of the variable. */
53+
std::shared_ptr<Variable> Variable::clone()
54+
{
55+
return std::make_shared<Variable>(id(), impl->name, impl->value, impl->isCloudVariable);
56+
}

test/scratch_classes/list_test.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -170,3 +170,22 @@ TEST(ListTest, ToString)
170170
list.push_back(8);
171171
ASSERT_EQ(list.toString(), "098");
172172
}
173+
174+
TEST(ListTest, Clone)
175+
{
176+
List list("abc", "test list");
177+
list.push_back("Lorem");
178+
list.push_back("ipsum");
179+
list.push_back("dolor");
180+
list.push_back("sit");
181+
list.push_back("amet");
182+
183+
std::shared_ptr<List> clone = list.clone();
184+
ASSERT_TRUE(clone);
185+
ASSERT_EQ(clone->id(), list.id());
186+
ASSERT_EQ(clone->name(), list.name());
187+
ASSERT_EQ(clone->size(), list.size());
188+
189+
for (std::size_t i = 0; i < list.size(); i++)
190+
ASSERT_EQ(list[i], (*clone)[i]);
191+
}

test/scratch_classes/variable_test.cpp

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,23 @@ TEST(VariableTest, IsCloudVariable)
5656
var.setIsCloudVariable(true);
5757
ASSERT_TRUE(var.isCloudVariable());
5858
}
59+
60+
TEST(VariableTest, Clone)
61+
{
62+
std::shared_ptr<Variable> clone;
63+
std::vector<std::shared_ptr<Variable>> vars;
64+
65+
vars.push_back(std::make_shared<Variable>("abc", "var1"));
66+
vars.push_back(std::make_shared<Variable>("abc", "var2", "test"));
67+
vars.push_back(std::make_shared<Variable>("abc", "var3", "test", true));
68+
vars.push_back(std::make_shared<Variable>("abc", "var4", "test", false));
69+
70+
for (auto var : vars) {
71+
clone = var->clone();
72+
ASSERT_TRUE(clone);
73+
ASSERT_EQ(clone->id(), var->id());
74+
ASSERT_EQ(clone->name(), var->name());
75+
ASSERT_EQ(clone->value(), var->value());
76+
ASSERT_EQ(clone->isCloudVariable(), var->isCloudVariable());
77+
}
78+
}

0 commit comments

Comments
 (0)