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