[Bf-blender-cvs] [0ceef31d99c] functions-experimental-refactor: support for full pointer array in virtual list
Jacques Lucke
noreply at git.blender.org
Thu Oct 31 11:44:12 CET 2019
Commit: 0ceef31d99c91c2711752307996ed41497a64b01
Author: Jacques Lucke
Date: Thu Oct 31 10:59:46 2019 +0100
Branches: functions-experimental-refactor
https://developer.blender.org/rB0ceef31d99c91c2711752307996ed41497a64b01
support for full pointer array in virtual list
===================================================================
M source/blender/blenkernel/BKE_generic_virtual_list_ref.h
M source/blender/blenlib/BLI_virtual_list_ref.h
M tests/gtests/blenlib/BLI_virtual_list_ref_test.cc
===================================================================
diff --git a/source/blender/blenkernel/BKE_generic_virtual_list_ref.h b/source/blender/blenkernel/BKE_generic_virtual_list_ref.h
index b9b5b2cdced..476621a2cf3 100644
--- a/source/blender/blenkernel/BKE_generic_virtual_list_ref.h
+++ b/source/blender/blenkernel/BKE_generic_virtual_list_ref.h
@@ -16,6 +16,7 @@ class GenericVirtualListRef {
enum Category {
Single,
FullArray,
+ FullPointerArray,
RepeatedArray,
};
@@ -30,6 +31,9 @@ class GenericVirtualListRef {
struct {
const void *data;
} full_array;
+ struct {
+ const void *const *data;
+ } full_pointer_array;
struct {
const void *data;
uint real_size;
@@ -51,7 +55,7 @@ class GenericVirtualListRef {
{
m_virtual_size = array.size();
m_type = &array.type();
- m_category = FullArray;
+ m_category = Category::FullArray;
m_data.full_array.data = array.buffer();
}
@@ -67,7 +71,7 @@ class GenericVirtualListRef {
GenericVirtualListRef list;
list.m_virtual_size = virtual_size;
list.m_type = &type;
- list.m_category = Single;
+ list.m_category = Category::Single;
list.m_data.single.data = buffer;
return list;
}
@@ -77,7 +81,7 @@ class GenericVirtualListRef {
GenericVirtualListRef list;
list.m_virtual_size = size;
list.m_type = &type;
- list.m_category = FullArray;
+ list.m_category = Category::FullArray;
list.m_data.full_array.data = buffer;
return list;
}
@@ -88,6 +92,18 @@ class GenericVirtualListRef {
GET_TYPE<T>(), (const void *)array.begin(), array.size());
}
+ static GenericVirtualListRef FromFullPointerArray(const CPPType &type,
+ const void *const *buffer,
+ uint size)
+ {
+ GenericVirtualListRef list;
+ list.m_virtual_size = size;
+ list.m_type = &type;
+ list.m_category = Category::FullPointerArray;
+ list.m_data.full_pointer_array.data = buffer;
+ return list;
+ }
+
static GenericVirtualListRef FromRepeatedArray(const CPPType &type,
const void *buffer,
uint real_size,
@@ -96,7 +112,7 @@ class GenericVirtualListRef {
GenericVirtualListRef list;
list.m_virtual_size = virtual_size;
list.m_type = &type;
- list.m_category = RepeatedArray;
+ list.m_category = Category::RepeatedArray;
list.m_data.repeated_array.data = buffer;
list.m_data.repeated_array.real_size = real_size;
return list;
@@ -111,11 +127,13 @@ class GenericVirtualListRef {
{
BLI_assert(index < m_virtual_size);
switch (m_category) {
- case Single:
+ case Category::Single:
return m_data.single.data;
- case FullArray:
+ case Category::FullArray:
return POINTER_OFFSET(m_data.full_array.data, index * m_type->size());
- case RepeatedArray:
+ case Category::FullPointerArray:
+ return m_data.full_pointer_array.data[index];
+ case Category::RepeatedArray:
uint real_index = index % m_data.repeated_array.real_size;
return POINTER_OFFSET(m_data.repeated_array.data, real_index * m_type->size());
}
@@ -127,11 +145,14 @@ class GenericVirtualListRef {
{
BLI_assert(GET_TYPE<T>().is_same_or_generalization(*m_type));
switch (m_category) {
- case Single:
+ case Category::Single:
return VirtualListRef<T>::FromSingle((const T *)m_data.single.data, m_virtual_size);
- case FullArray:
+ case Category::FullArray:
return VirtualListRef<T>::FromFullArray((const T *)m_data.full_array.data, m_virtual_size);
- case RepeatedArray:
+ case Category::FullPointerArray:
+ return VirtualListRef<T>::FromFullPointerArray(
+ (const T *const *)m_data.full_pointer_array.data, m_virtual_size);
+ case Category::RepeatedArray:
return VirtualListRef<T>::FromRepeatedArray((const T *)m_data.repeated_array.data,
m_data.repeated_array.real_size,
m_virtual_size);
diff --git a/source/blender/blenlib/BLI_virtual_list_ref.h b/source/blender/blenlib/BLI_virtual_list_ref.h
index be8decec9de..2a561957a81 100644
--- a/source/blender/blenlib/BLI_virtual_list_ref.h
+++ b/source/blender/blenlib/BLI_virtual_list_ref.h
@@ -10,6 +10,7 @@ template<typename T> class VirtualListRef {
enum Category {
Single,
FullArray,
+ FullPointerArray,
RepeatedArray,
};
@@ -23,6 +24,9 @@ template<typename T> class VirtualListRef {
struct {
const T *data;
} full_array;
+ struct {
+ const T *const *data;
+ } full_pointer_array;
struct {
const T *data;
uint real_size;
@@ -33,7 +37,7 @@ template<typename T> class VirtualListRef {
VirtualListRef()
{
m_virtual_size = 0;
- m_category = FullArray;
+ m_category = Category::FullArray;
m_data.single.data = nullptr;
}
@@ -41,7 +45,7 @@ template<typename T> class VirtualListRef {
{
VirtualListRef list;
list.m_virtual_size = virtual_size;
- list.m_category = Single;
+ list.m_category = Category::Single;
list.m_data.single.data = data;
return list;
}
@@ -50,7 +54,7 @@ template<typename T> class VirtualListRef {
{
VirtualListRef list;
list.m_virtual_size = size;
- list.m_category = FullArray;
+ list.m_category = Category::FullArray;
list.m_data.full_array.data = data;
return list;
}
@@ -60,13 +64,27 @@ template<typename T> class VirtualListRef {
return VirtualListRef::FromFullArray(array.begin(), array.size());
}
+ static VirtualListRef FromFullPointerArray(const T *const *data, uint size)
+ {
+ VirtualListRef list;
+ list.m_virtual_size = size;
+ list.m_category = Category::FullPointerArray;
+ list.m_data.full_pointer_array.data = data;
+ return list;
+ }
+
+ static VirtualListRef FromFullPointerArray(ArrayRef<const T *> data)
+ {
+ return VirtualListRef::FromFullPointerArray(data.begin(), data.size());
+ }
+
static VirtualListRef FromRepeatedArray(const T *data, uint real_size, uint virtual_size)
{
BLI_assert(virtual_size == 0 || real_size > 0);
VirtualListRef list;
list.m_virtual_size = virtual_size;
- list.m_category = RepeatedArray;
+ list.m_category = Category::RepeatedArray;
list.m_data.repeated_array.data = data;
list.m_data.repeated_array.real_size = real_size;
return list;
@@ -81,11 +99,13 @@ template<typename T> class VirtualListRef {
{
BLI_assert(index < m_virtual_size);
switch (m_category) {
- case Single:
+ case Category::Single:
return *m_data.single.data;
- case FullArray:
+ case Category::FullArray:
return m_data.full_array.data[index];
- case RepeatedArray:
+ case Category::FullPointerArray:
+ return *m_data.full_pointer_array.data[index];
+ case Category::RepeatedArray:
uint real_index = index % m_data.repeated_array.real_size;
return m_data.repeated_array.data[real_index];
}
@@ -97,14 +117,6 @@ template<typename T> class VirtualListRef {
{
return m_virtual_size;
}
-
- void materialize(MutableArrayRef<T> dst) const
- {
- BLI_assert(dst.size() == m_virtual_size);
- for (uint i = 0; i < m_virtual_size; i++) {
- dst[i] = (*this)[i];
- }
- }
};
} // namespace BLI
diff --git a/tests/gtests/blenlib/BLI_virtual_list_ref_test.cc b/tests/gtests/blenlib/BLI_virtual_list_ref_test.cc
index dd1350c27ad..8dc1802e47f 100644
--- a/tests/gtests/blenlib/BLI_virtual_list_ref_test.cc
+++ b/tests/gtests/blenlib/BLI_virtual_list_ref_test.cc
@@ -32,6 +32,22 @@ TEST(virtual_list_ref, FromFullArray)
EXPECT_EQ(list[3], 8);
}
+TEST(virtual_list_ref, FromFullPointerArray)
+{
+ int a1 = 3;
+ int a2 = 6;
+ int a3 = 2;
+ std::array<const int *, 5> pointers = {&a1, &a3, &a1, &a2, &a2};
+
+ auto list = VirtualListRef<int>::FromFullPointerArray(pointers);
+ EXPECT_EQ(list.size(), 5);
+ EXPECT_EQ(list[0], 3);
+ EXPECT_EQ(list[1], 2);
+ EXPECT_EQ(list[2], 3);
+ EXPECT_EQ(list[3], 6);
+ EXPECT_EQ(list[4], 6);
+}
+
TEST(virtual_list_ref, FromRepeatedArray)
{
std::vector<int> values = {3, 4};
More information about the Bf-blender-cvs
mailing list