[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