Skip to content

Commit 9b7ae5a

Browse files
committed
Store raw data pointer in List
1 parent 42bd6a8 commit 9b7ae5a

File tree

5 files changed

+46
-1
lines changed

5 files changed

+46
-1
lines changed

include/scratchcpp/list.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff 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

src/scratch/list_functions.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff 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();

src/scratch/list_functions.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff 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);

test/scratch_classes/list_functions_test.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
103116
TEST(ListFunctionsTest, SizePtr)
104117
{
105118
List list("", "");

test/scratch_classes/list_test.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff 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+
6178
TEST(ListTest, SizePtr)
6279
{
6380
List list("", "test list");

0 commit comments

Comments
 (0)