[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