Skip to content

Commit d1cfb5d

Browse files
committed
Target: Add listData() method
1 parent fedc9e5 commit d1cfb5d

File tree

4 files changed

+38
-0
lines changed

4 files changed

+38
-0
lines changed

include/scratchcpp/target.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,8 @@ class LIBSCRATCHCPP_EXPORT Target : public Drawable
5353
int findList(const std::string &listName) const;
5454
int findListById(const std::string &id) const;
5555

56+
List **listData();
57+
5658
const std::vector<std::shared_ptr<Block>> &blocks() const;
5759
int addBlock(std::shared_ptr<Block> block);
5860
std::shared_ptr<Block> blockAt(int index) const;

src/scratch/target.cpp

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,7 @@ int Target::addList(std::shared_ptr<List> list)
150150
return it - impl->lists.begin();
151151

152152
impl->lists.push_back(list);
153+
impl->listDataDirty = true;
153154
list->setTarget(this);
154155

155156
return impl->lists.size() - 1;
@@ -186,6 +187,31 @@ int Target::findListById(const std::string &id) const
186187
return it - impl->lists.begin();
187188
}
188189

190+
/*! Returns an array of list pointers (for optimized list access). */
191+
List **Target::listData()
192+
{
193+
if (impl->listDataDirty) {
194+
const size_t len = impl->lists.size();
195+
196+
if (len == 0) {
197+
impl->listDataDirty = false;
198+
return nullptr;
199+
}
200+
201+
if (impl->listData)
202+
impl->listData = (List **)realloc(impl->listData, len * sizeof(List *));
203+
else
204+
impl->listData = (List **)malloc(len * sizeof(List *));
205+
206+
for (size_t i = 0; i < len; i++)
207+
impl->listData[i] = impl->lists[i].get();
208+
209+
impl->listDataDirty = false;
210+
}
211+
212+
return impl->listData;
213+
}
214+
189215
/*! Returns the list of blocks. */
190216
const std::vector<std::shared_ptr<Block>> &Target::blocks() const
191217
{

src/scratch/target_p.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ struct TargetPrivate
3131
bool variableDataDirty = true;
3232
ValueData **variableData = nullptr;
3333
std::vector<std::shared_ptr<List>> lists;
34+
bool listDataDirty = true;
35+
List **listData = nullptr;
3436
std::vector<std::shared_ptr<Block>> blocks;
3537
std::vector<std::shared_ptr<Comment>> comments;
3638
int costumeIndex = -1;

test/scratch_classes/target_test.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,17 @@ TEST(TargetTest, Lists)
119119

120120
Target target;
121121
ASSERT_EQ(target.addList(l1), 0);
122+
ASSERT_TRUE(target.listData());
123+
ASSERT_EQ(target.listData()[0], l1.get());
122124
ASSERT_EQ(target.addList(l2), 1);
123125
ASSERT_EQ(target.addList(l3), 2);
126+
ASSERT_EQ(target.listData()[0], l1.get());
127+
ASSERT_EQ(target.listData()[1], l2.get());
128+
ASSERT_EQ(target.listData()[2], l3.get());
124129
ASSERT_EQ(target.addList(l2), 1); // add existing list
130+
ASSERT_EQ(target.listData()[0], l1.get());
131+
ASSERT_EQ(target.listData()[1], l2.get());
132+
ASSERT_EQ(target.listData()[2], l3.get());
125133

126134
ASSERT_EQ(l1->target(), &target);
127135
ASSERT_EQ(l2->target(), &target);

0 commit comments

Comments
 (0)