File tree Expand file tree Collapse file tree 5 files changed +46
-1
lines changed
Expand file tree Collapse file tree 5 files changed +46
-1
lines changed Original file line number Diff line number Diff line change @@ -41,7 +41,13 @@ class LIBSCRATCHCPP_EXPORT List : public Entity
4141 void setMonitor (Monitor *monitor);
4242
4343 /* ! Returns a pointer to the raw list data. */
44- inline ValueData *data () const { return m_dataPtr->data (); }
44+ inline ValueData *data () const { return m_rawDataPtr; }
45+
46+ /* !
47+ * Returns a pointer to pointer to the raw list data.
48+ * \note This is used internally by compiled code for various optimizations.
49+ */
50+ inline ValueData *const *dataPtr () const { return &m_rawDataPtr; }
4551
4652 /* !
4753 * Returns a pointer to the list size.
@@ -247,6 +253,8 @@ class LIBSCRATCHCPP_EXPORT List : public Entity
247253 value_free (&m_dataPtr->back ());
248254 m_dataPtr->erase (m_dataPtr->end ());
249255 }
256+
257+ m_rawDataPtr = m_dataPtr->data ();
250258 }
251259
252260 inline size_t getAllocSize (size_t x)
@@ -264,6 +272,7 @@ class LIBSCRATCHCPP_EXPORT List : public Entity
264272
265273 spimpl::unique_impl_ptr<ListPrivate> impl;
266274 veque::veque<ValueData> *m_dataPtr = nullptr ; // NOTE: accessing through pointer is faster! (from benchmarks)
275+ ValueData *m_rawDataPtr = nullptr ;
267276 size_t m_size = 0 ;
268277};
269278
Original file line number Diff line number Diff line change @@ -38,6 +38,11 @@ extern "C"
3838 return list->data ();
3939 }
4040
41+ ValueData *const *list_data_ptr (List *list)
42+ {
43+ return list->dataPtr ();
44+ }
45+
4146 size_t *list_size_ptr (List *list)
4247 {
4348 return list->sizePtr ();
Original file line number Diff line number Diff line change @@ -21,6 +21,7 @@ extern "C"
2121
2222 ValueData *list_get_item (List *list, size_t index);
2323 ValueData *list_data (List *list);
24+ ValueData *const *list_data_ptr (List *list);
2425 size_t *list_size_ptr (List *list);
2526 const size_t *list_alloc_size_ptr (List *list);
2627 size_t list_size (List *list);
Original file line number Diff line number Diff line change @@ -100,6 +100,19 @@ TEST(ListFunctionsTest, Data)
100100 ASSERT_EQ (data, list.data ());
101101}
102102
103+ TEST (ListFunctionsTest, DataPtr)
104+ {
105+ List list (" " , " " );
106+ list.append (" Lorem" );
107+ list.append (" ipsum" );
108+ list.append (" dolor" );
109+ list.append (" sit" );
110+ list.append (" amet" );
111+
112+ ValueData *const *dataPtr = list_data_ptr (&list);
113+ ASSERT_EQ (dataPtr, list.dataPtr ());
114+ }
115+
103116TEST (ListFunctionsTest, SizePtr)
104117{
105118 List list (" " , " " );
Original file line number Diff line number Diff line change @@ -58,6 +58,23 @@ TEST(ListTest, Data)
5858 ASSERT_EQ (&data[4 ], &list[4 ]);
5959}
6060
61+ TEST (ListTest, DataPtr)
62+ {
63+ List list (" " , " " );
64+ list.append (" Lorem" );
65+ list.append (" ipsum" );
66+ list.append (" dolor" );
67+ list.append (" sit" );
68+ list.append (" amet" );
69+
70+ ValueData *data = *list.dataPtr ();
71+ ASSERT_EQ (&data[0 ], &list[0 ]);
72+ ASSERT_EQ (&data[1 ], &list[1 ]);
73+ ASSERT_EQ (&data[2 ], &list[2 ]);
74+ ASSERT_EQ (&data[3 ], &list[3 ]);
75+ ASSERT_EQ (&data[4 ], &list[4 ]);
76+ }
77+
6178TEST (ListTest, SizePtr)
6279{
6380 List list (" " , " test list" );
You can’t perform that action at this time.
0 commit comments