File tree Expand file tree Collapse file tree 4 files changed +38
-0
lines changed
Expand file tree Collapse file tree 4 files changed +38
-0
lines changed Original file line number Diff line number Diff 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 ;
Original file line number Diff line number Diff 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. */
190216const std::vector<std::shared_ptr<Block>> &Target::blocks () const
191217{
Original file line number Diff line number Diff 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 ;
Original file line number Diff line number Diff 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);
You can’t perform that action at this time.
0 commit comments