Blender  V3.3
BLI_generic_array_test.cc
Go to the documentation of this file.
1 /* SPDX-License-Identifier: Apache-2.0 */
2 
3 #include "testing/testing.h"
4 
5 #include "MEM_guardedalloc.h"
6 
7 #include "BLI_array.hh"
8 #include "BLI_generic_array.hh"
9 
10 namespace blender::tests {
11 
12 TEST(generic_array, TypeConstructor)
13 {
14  GArray array(CPPType::get<float>());
15  EXPECT_TRUE(array.data() == nullptr);
16  EXPECT_EQ(array.size(), 0);
17  EXPECT_EQ(array.as_span().typed<float>().size(), 0);
18  EXPECT_TRUE(array.is_empty());
19 }
20 
21 TEST(generic_array, MoveConstructor)
22 {
23  GArray array_a(CPPType::get<int32_t>(), (int64_t)10);
24  GMutableSpan span_a = array_a.as_mutable_span();
25  MutableSpan<int32_t> typed_span_a = span_a.typed<int32_t>();
26  typed_span_a.fill(42);
27 
28  const GArray array_b = std::move(array_a);
29  Span<int32_t> typed_span_b = array_b.as_span().typed<int32_t>();
30  EXPECT_FALSE(array_b.data() == nullptr);
31  EXPECT_EQ(array_b.size(), 10);
32  EXPECT_EQ(typed_span_b[4], 42);
33 
34  /* Make sure the copy constructor cleaned up the original, but it shouldn't clear the type. */
35  EXPECT_TRUE(array_a.data() == nullptr); /* NOLINT: bugprone-use-after-move */
36  EXPECT_EQ(array_a.size(), 0); /* NOLINT: bugprone-use-after-move */
37  EXPECT_TRUE(array_a.is_empty()); /* NOLINT: bugprone-use-after-move */
38  EXPECT_EQ(array_b.type(), array_a.type()); /* NOLINT: bugprone-use-after-move */
39 }
40 
41 TEST(generic_array, CopyConstructor)
42 {
43  GArray array_a(CPPType::get<int32_t>(), (int64_t)10);
44  GMutableSpan span_a = array_a.as_mutable_span();
45  MutableSpan<int32_t> typed_span_a = span_a.typed<int32_t>();
46  typed_span_a.fill(42);
47 
48  /* From span directly. */
49  const GArray array_b = array_a.as_span();
50  Span<int32_t> typed_span_b = array_b.as_span().typed<int32_t>();
51  EXPECT_FALSE(array_b.data() == nullptr);
52  EXPECT_EQ(array_b.size(), 10);
53  EXPECT_EQ(typed_span_b[4], 42);
54  EXPECT_FALSE(array_a.is_empty());
55 
56  /* From array. */
57  const GArray array_c = array_a;
58  Span<int32_t> typed_span_c = array_c.as_span().typed<int32_t>();
59  EXPECT_FALSE(array_c.data() == nullptr);
60  EXPECT_EQ(array_c.size(), 10);
61  EXPECT_EQ(typed_span_c[4], 42);
62  EXPECT_FALSE(array_a.is_empty());
63 }
64 
65 TEST(generic_array, BufferAndSizeConstructor)
66 {
67  int32_t *values = (int32_t *)MEM_malloc_arrayN(12, sizeof(int32_t), __func__);
68  void *buffer = (void *)values;
69  GArray array(CPPType::get<int32_t>(), buffer, 4);
70  EXPECT_FALSE(array.data() == nullptr);
71  EXPECT_EQ(array.size(), 4);
72  EXPECT_FALSE(array.is_empty());
73  EXPECT_EQ(array.as_span().typed<int>().size(), 4);
74  EXPECT_EQ(array[0], &values[0]);
75  EXPECT_EQ(array[1], &values[1]);
76  EXPECT_EQ(array[2], &values[2]);
77  EXPECT_EQ(array[3], &values[3]);
78 }
79 
80 TEST(generic_array, Reinitialize)
81 {
82  GArray array(CPPType::get<int32_t>(), (int64_t)5);
83  EXPECT_FALSE(array.data() == nullptr);
84  GMutableSpan span = array.as_mutable_span();
85  MutableSpan<int32_t> typed_span = span.typed<int32_t>();
86  typed_span.fill(77);
87  EXPECT_FALSE(typed_span.data() == nullptr);
88  typed_span[2] = 8;
89  EXPECT_EQ(array[2], &typed_span[2]);
90  EXPECT_EQ(typed_span[0], 77);
91  EXPECT_EQ(typed_span[1], 77);
92 
93  array.reinitialize(10);
94  EXPECT_EQ(array.size(), 10);
95  span = array.as_mutable_span();
96  EXPECT_EQ(span.size(), 10);
97 
98  typed_span = span.typed<int32_t>();
99  EXPECT_FALSE(typed_span.data() == nullptr);
100 
101  array.reinitialize(0);
102  EXPECT_EQ(array.size(), 0);
103 }
104 
105 TEST(generic_array, InContainer)
106 {
108  for (GArray<> &array : arrays) {
109  array = GArray(CPPType::get<int32_t>(), (int64_t)5);
110  array.as_mutable_span().typed<int32_t>().fill(55);
111  }
112  for (GArray<> &array : arrays) {
113  EXPECT_EQ(array.as_span().typed<int32_t>()[3], 55);
114  }
115 }
116 
117 } // namespace blender::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
Read Guarded memory(de)allocation.
size_t size() const
bool is_empty() const
GMutableSpan as_mutable_span()
int64_t size() const
GSpan as_span() const
const void * data() const
const CPPType & type() const
MutableSpan< T > typed() const
Span< T > typed() const
constexpr void fill(const T &value)
Definition: BLI_span.hh:527
constexpr T * data() const
Definition: BLI_span.hh:548
ccl_global float * buffer
void *(* MEM_malloc_arrayN)(size_t len, size_t size, const char *str)
Definition: mallocn.c:34
TEST(any, DefaultConstructor)
Definition: BLI_any_test.cc:10
static RawVector< RawArray< int64_t, 0 > > arrays
__int64 int64_t
Definition: stdint.h:89
signed int int32_t
Definition: stdint.h:77