[Bf-blender-cvs] [4a2193927dc] functions: improve ArrayRef

Jacques Lucke noreply at git.blender.org
Mon May 13 10:16:53 CEST 2019


Commit: 4a2193927dcca08de2b6620996e42a4ac84f5259
Author: Jacques Lucke
Date:   Sun May 12 19:47:46 2019 +0200
Branches: functions
https://developer.blender.org/rB4a2193927dcca08de2b6620996e42a4ac84f5259

improve ArrayRef

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

M	source/blender/blenlib/BLI_array_ref.hpp
M	source/blender/functions/backends/llvm/builder.cpp
M	source/blender/functions/backends/llvm/builder.hpp
M	tests/gtests/blenlib/BLI_array_ref_test.cc

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

diff --git a/source/blender/blenlib/BLI_array_ref.hpp b/source/blender/blenlib/BLI_array_ref.hpp
index 5577fee85b5..8f28b880d25 100644
--- a/source/blender/blenlib/BLI_array_ref.hpp
+++ b/source/blender/blenlib/BLI_array_ref.hpp
@@ -12,11 +12,16 @@ template<typename T> class ArrayRef {
  public:
   ArrayRef() = default;
 
+  ArrayRef(T &value) : m_start(&value), m_size(1)
+  {
+  }
+
   ArrayRef(T *start, uint size) : m_start(start), m_size(size)
   {
   }
 
-  ArrayRef(SmallVector<T> &vector) : m_start(vector.begin()), m_size(vector.size())
+  template<uint N>
+  ArrayRef(const SmallVector<T, N> &vector) : m_start(vector.begin()), m_size(vector.size())
   {
   }
 
@@ -24,6 +29,10 @@ template<typename T> class ArrayRef {
   {
   }
 
+  ArrayRef(const std::initializer_list<T> &list) : m_start((T *)list.begin()), m_size(list.size())
+  {
+  }
+
   ArrayRef slice(uint start, uint length) const
   {
     BLI_assert(start + length <= this->size());
@@ -62,6 +71,36 @@ template<typename T> class ArrayRef {
   {
     return m_size;
   }
+
+  bool contains(const T &value)
+  {
+    for (T &element : *this) {
+      if (element == value) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  uint count(const T &value)
+  {
+    uint counter = 0;
+    for (T &element : *this) {
+      if (element == value) {
+        counter++;
+      }
+    }
+    return counter;
+  }
+
+  SmallVector<T> to_small_vector() const
+  {
+    SmallVector<T> vector;
+    for (T &value : *this) {
+      vector.append(value);
+    }
+    return vector;
+  }
 };
 
 template<typename ArrayT, typename ValueT, ValueT (*GetValue)(ArrayT &item)>
diff --git a/source/blender/functions/backends/llvm/builder.cpp b/source/blender/functions/backends/llvm/builder.cpp
index 79209510538..e9d7ab9fc84 100644
--- a/source/blender/functions/backends/llvm/builder.cpp
+++ b/source/blender/functions/backends/llvm/builder.cpp
@@ -66,14 +66,6 @@ llvm::Value *CodeBuilder::CreateCallPointer(void *func_ptr,
   return m_builder.CreateCall(wrapper_function, to_llvm_array_ref(args));
 }
 
-llvm::Value *CodeBuilder::CreateCallPointer(void *func_ptr,
-                                            llvm::FunctionType *ftype,
-                                            const LLVMValues &args,
-                                            const char *function_name)
-{
-  return this->CreateCallPointer(func_ptr, ftype, LLVMValuesRef(args), function_name);
-}
-
 llvm::Value *CodeBuilder::CreateCallPointer(void *func_ptr,
                                             LLVMValuesRef args,
                                             llvm::Type *return_type,
@@ -85,14 +77,6 @@ llvm::Value *CodeBuilder::CreateCallPointer(void *func_ptr,
   return this->CreateCallPointer(func_ptr, ftype, args, function_name);
 }
 
-llvm::Value *CodeBuilder::CreateCallPointer(void *func_ptr,
-                                            const LLVMValues &args,
-                                            llvm::Type *return_type,
-                                            const char *function_name)
-{
-  return this->CreateCallPointer(func_ptr, LLVMValuesRef(args), return_type, function_name);
-}
-
 static void assert_impl(bool value, const char *message)
 {
   if (!value) {
diff --git a/source/blender/functions/backends/llvm/builder.hpp b/source/blender/functions/backends/llvm/builder.hpp
index 93de20c4033..96c111aa1fe 100644
--- a/source/blender/functions/backends/llvm/builder.hpp
+++ b/source/blender/functions/backends/llvm/builder.hpp
@@ -352,18 +352,10 @@ class CodeBuilder {
                                  llvm::FunctionType *ftype,
                                  LLVMValuesRef args,
                                  const char *function_name = "");
-  llvm::Value *CreateCallPointer(void *func_ptr,
-                                 llvm::FunctionType *ftype,
-                                 const LLVMValues &args,
-                                 const char *function_name = "");
   llvm::Value *CreateCallPointer(void *func_ptr,
                                  LLVMValuesRef args,
                                  llvm::Type *return_type,
                                  const char *function_name = "");
-  llvm::Value *CreateCallPointer(void *func_ptr,
-                                 const LLVMValues &args,
-                                 llvm::Type *return_type,
-                                 const char *function_name = "");
 
   llvm::Value *CreateCall(llvm::Function *function, LLVMValuesRef args)
   {
diff --git a/tests/gtests/blenlib/BLI_array_ref_test.cc b/tests/gtests/blenlib/BLI_array_ref_test.cc
index 5c71bb27542..84d743e5180 100644
--- a/tests/gtests/blenlib/BLI_array_ref_test.cc
+++ b/tests/gtests/blenlib/BLI_array_ref_test.cc
@@ -66,9 +66,64 @@ TEST(array_ref, Slice)
   EXPECT_EQ(slice[1], 6);
 }
 
-TEST(small_vector, SliceEmpty)
+TEST(array_ref, SliceEmpty)
 {
   IntVector a = {4, 5, 6, 7};
   auto slice = IntArrayRef(a).slice(2, 0);
   EXPECT_EQ(slice.size(), 0);
 }
+
+TEST(array_ref, Contains)
+{
+  IntVector a = {4, 5, 6, 7};
+  IntArrayRef a_ref = a;
+  EXPECT_TRUE(a_ref.contains(4));
+  EXPECT_TRUE(a_ref.contains(5));
+  EXPECT_TRUE(a_ref.contains(6));
+  EXPECT_TRUE(a_ref.contains(7));
+  EXPECT_FALSE(a_ref.contains(3));
+  EXPECT_FALSE(a_ref.contains(8));
+}
+
+TEST(array_ref, Count)
+{
+  IntVector a = {2, 3, 4, 3, 3, 2, 2, 2, 2};
+  IntArrayRef a_ref = a;
+  EXPECT_EQ(a_ref.count(1), 0);
+  EXPECT_EQ(a_ref.count(2), 5);
+  EXPECT_EQ(a_ref.count(3), 3);
+  EXPECT_EQ(a_ref.count(4), 1);
+  EXPECT_EQ(a_ref.count(5), 0);
+}
+
+TEST(array_ref, ToSmallVector)
+{
+  IntVector a = {1, 2, 3, 4};
+  IntArrayRef a_ref = a;
+  IntVector b = a_ref.to_small_vector();
+  IntVector::all_equal(a, b);
+}
+
+static void test_ref_from_initializer_list(IntArrayRef ref)
+{
+  EXPECT_EQ(ref.size(), 4);
+  EXPECT_EQ(ref[0], 3);
+  EXPECT_EQ(ref[1], 6);
+  EXPECT_EQ(ref[2], 8);
+  EXPECT_EQ(ref[3], 9);
+}
+
+TEST(array_ref, FromInitializerList)
+{
+  test_ref_from_initializer_list({3, 6, 8, 9});
+}
+
+TEST(array_ref, FromSingleValue)
+{
+  int a = 4;
+  IntArrayRef a_ref(a);
+  EXPECT_EQ(a_ref.size(), 1);
+  EXPECT_EQ(a_ref[0], 4);
+  a = 10;
+  EXPECT_EQ(a_ref[0], 10);
+}



More information about the Bf-blender-cvs mailing list