[Bf-blender-cvs] [e852f7d356b] functions: create SmallVector from MappedArrayRef
Jacques Lucke
noreply at git.blender.org
Sat Jul 6 17:30:32 CEST 2019
Commit: e852f7d356b929a59282b026930494de3fa5d20f
Author: Jacques Lucke
Date: Sat Jul 6 17:12:11 2019 +0200
Branches: functions
https://developer.blender.org/rBe852f7d356b929a59282b026930494de3fa5d20f
create SmallVector from MappedArrayRef
===================================================================
M source/blender/blenlib/BLI_array_ref.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_array_ref.hpp b/source/blender/blenlib/BLI_array_ref.hpp
index 1143fd636ca..5a03c041475 100644
--- a/source/blender/blenlib/BLI_array_ref.hpp
+++ b/source/blender/blenlib/BLI_array_ref.hpp
@@ -260,6 +260,12 @@ template<typename ArrayT, typename ValueT, ValueT (*GetValue)(ArrayT &item)> cla
return m_size;
}
+ ValueT operator[](uint index)
+ {
+ BLI_assert(index < m_size);
+ return GetValue(m_start[index]);
+ }
+
class It {
private:
MappedArrayRef m_array_ref;
diff --git a/source/blender/blenlib/BLI_small_vector.hpp b/source/blender/blenlib/BLI_small_vector.hpp
index cd76a5bf031..3f743dd5e8f 100644
--- a/source/blender/blenlib/BLI_small_vector.hpp
+++ b/source/blender/blenlib/BLI_small_vector.hpp
@@ -108,6 +108,20 @@ template<typename T, uint N = 4> class SmallVector {
m_size = values.size();
}
+ /**
+ * Create a vector from a mapped array ref. This can e.g. be used to create vectors from
+ * map.keys() for map.values().
+ */
+ template<typename ArrayT, typename ValueT, ValueT (*GetValue)(ArrayT &item)>
+ SmallVector(MappedArrayRef<ArrayT, ValueT, GetValue> values) : SmallVector()
+ {
+ this->reserve(values.size());
+ for (uint i = 0; i < values.size(); i++) {
+ std::uninitialized_copy_n(&values[i], 1, m_elements + i);
+ }
+ m_size = values.size();
+ }
+
/**
* Create a vector from a ListBase.
*/
diff --git a/tests/gtests/blenlib/BLI_small_vector_test.cc b/tests/gtests/blenlib/BLI_small_vector_test.cc
index 9ba6f6480a6..6aa3915720e 100644
--- a/tests/gtests/blenlib/BLI_small_vector_test.cc
+++ b/tests/gtests/blenlib/BLI_small_vector_test.cc
@@ -1,6 +1,8 @@
#include "testing/testing.h"
#include "BLI_small_vector.hpp"
+#include "BLI_small_map.hpp"
+using BLI::SmallMap;
using BLI::SmallVector;
using IntVector = SmallVector<int>;
@@ -39,6 +41,27 @@ TEST(small_vector, InitializerListConstructor)
EXPECT_EQ(vec[3], 6);
}
+TEST(small_vector, MappedArrayRefConstructor)
+{
+ SmallMap<int, int> map;
+ map.add(2, 5);
+ map.add(1, 6);
+ map.add(3, 2);
+
+ IntVector keys = map.keys();
+ IntVector values = map.values();
+
+ EXPECT_EQ(keys.size(), 3);
+ EXPECT_TRUE(keys.contains(1));
+ EXPECT_TRUE(keys.contains(2));
+ EXPECT_TRUE(keys.contains(3));
+
+ EXPECT_EQ(values.size(), 3);
+ EXPECT_TRUE(values.contains(2));
+ EXPECT_TRUE(values.contains(5));
+ EXPECT_TRUE(values.contains(6));
+}
+
TEST(small_vector, NonIntrusiveListBaseConstructor)
{
ListBase list = {0};
More information about the Bf-blender-cvs
mailing list