[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