[Bf-blender-cvs] [e0af39a0dcc] functions: construct SmallVector from ListBase

Jacques Lucke noreply at git.blender.org
Tue Jul 2 16:11:51 CEST 2019


Commit: e0af39a0dcc103b8306c278723ba5783a23dd122
Author: Jacques Lucke
Date:   Tue Jul 2 15:00:38 2019 +0200
Branches: functions
https://developer.blender.org/rBe0af39a0dcc103b8306c278723ba5783a23dd122

construct SmallVector from ListBase

===================================================================

M	source/blender/blenlib/BLI_listbase_wrapper.hpp
M	source/blender/blenlib/BLI_small_vector.hpp
M	tests/gtests/blenlib/BLI_small_vector_test.cc

===================================================================

diff --git a/source/blender/blenlib/BLI_listbase_wrapper.hpp b/source/blender/blenlib/BLI_listbase_wrapper.hpp
index 2f99b15713d..82e64af69fd 100644
--- a/source/blender/blenlib/BLI_listbase_wrapper.hpp
+++ b/source/blender/blenlib/BLI_listbase_wrapper.hpp
@@ -48,13 +48,13 @@ template<typename T, bool intrusive> class ListBaseWrapper {
       return m_current != iterator.m_current;
     }
 
-    T *operator*() const
+    T operator*() const
     {
       if (intrusive) {
-        return (T *)m_current;
+        return (T)m_current;
       }
       else {
-        return (T *)((LinkData *)m_current)->data;
+        return (T)((LinkData *)m_current)->data;
       }
     }
   };
diff --git a/source/blender/blenlib/BLI_small_vector.hpp b/source/blender/blenlib/BLI_small_vector.hpp
index b52d573f4f5..5f18347acd4 100644
--- a/source/blender/blenlib/BLI_small_vector.hpp
+++ b/source/blender/blenlib/BLI_small_vector.hpp
@@ -34,6 +34,7 @@
 
 #include "BLI_utildefines.h"
 #include "BLI_array_ref.hpp"
+#include "BLI_listbase_wrapper.hpp"
 
 #include "MEM_guardedalloc.h"
 
@@ -106,6 +107,23 @@ template<typename T, uint N = 4> class SmallVector {
     m_size = values.size();
   }
 
+  /**
+   * Create a vector from a ListBase.
+   */
+  SmallVector(ListBase &values, bool intrusive_next_and_prev_pointers) : SmallVector()
+  {
+    if (intrusive_next_and_prev_pointers) {
+      for (T value : ListBaseWrapper<T, true>(&values)) {
+        this->append(value);
+      }
+    }
+    else {
+      for (T value : ListBaseWrapper<T, false>(&values)) {
+        this->append(value);
+      }
+    }
+  }
+
   /**
    * Create a copy of another vector.
    * The other vector will not be changed.
diff --git a/tests/gtests/blenlib/BLI_small_vector_test.cc b/tests/gtests/blenlib/BLI_small_vector_test.cc
index c38597128ec..9ba6f6480a6 100644
--- a/tests/gtests/blenlib/BLI_small_vector_test.cc
+++ b/tests/gtests/blenlib/BLI_small_vector_test.cc
@@ -1,7 +1,8 @@
 #include "testing/testing.h"
 #include "BLI_small_vector.hpp"
 
-using IntVector = BLI::SmallVector<int>;
+using BLI::SmallVector;
+using IntVector = SmallVector<int>;
 
 TEST(small_vector, DefaultConstructor)
 {
@@ -38,6 +39,42 @@ TEST(small_vector, InitializerListConstructor)
   EXPECT_EQ(vec[3], 6);
 }
 
+TEST(small_vector, NonIntrusiveListBaseConstructor)
+{
+  ListBase list = {0};
+  BLI_addtail(&list, BLI_genericNodeN(POINTER_FROM_INT(42)));
+  BLI_addtail(&list, BLI_genericNodeN(POINTER_FROM_INT(60)));
+  BLI_addtail(&list, BLI_genericNodeN(POINTER_FROM_INT(90)));
+  BLI::SmallVector<void *> vec(list, false);
+  EXPECT_EQ(vec.size(), 3);
+  EXPECT_EQ(POINTER_AS_INT(vec[0]), 42);
+  EXPECT_EQ(POINTER_AS_INT(vec[1]), 60);
+  EXPECT_EQ(POINTER_AS_INT(vec[2]), 90);
+  BLI_freelistN(&list);
+}
+
+struct TestListValue {
+  TestListValue *prev, *next;
+  int value;
+};
+
+TEST(small_vector, IntrusiveListBaseConstructor)
+{
+  ListBase list = {0};
+  BLI_addtail(&list, new TestListValue{0, 0, 4});
+  BLI_addtail(&list, new TestListValue{0, 0, 6});
+  BLI_addtail(&list, new TestListValue{0, 0, 7});
+  SmallVector<TestListValue *> vec(list, true);
+  EXPECT_EQ(vec.size(), 3);
+  EXPECT_EQ(vec[0]->value, 4);
+  EXPECT_EQ(vec[1]->value, 6);
+  EXPECT_EQ(vec[2]->value, 7);
+
+  delete vec[0];
+  delete vec[1];
+  delete vec[2];
+}
+
 TEST(small_vector, CopyConstructor)
 {
   IntVector vec1 = {1, 2, 3};
@@ -115,7 +152,7 @@ TEST(small_vector, Iterator)
 
 TEST(small_vector, BecomeLarge)
 {
-  BLI::SmallVector<int, 4> vec;
+  SmallVector<int, 4> vec;
   for (int i = 0; i < 100; i++) {
     vec.append(i * 5);
   }
@@ -141,7 +178,7 @@ TEST(small_vector, ReturnByValue)
 
 TEST(small_vector, VectorOfVectors_Append)
 {
-  BLI::SmallVector<IntVector> vec;
+  SmallVector<IntVector> vec;
   EXPECT_EQ(vec.size(), 0);
 
   IntVector v({1, 2});
@@ -156,7 +193,7 @@ TEST(small_vector, VectorOfVectors_Append)
 
 TEST(small_vector, VectorOfVectors_Fill)
 {
-  BLI::SmallVector<IntVector> vec(3);
+  SmallVector<IntVector> vec(3);
   vec.fill({4, 5});
 
   EXPECT_EQ(vec[0][0], 4);



More information about the Bf-blender-cvs mailing list