[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