Blender V5.0
BLI_virtual_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 "BLI_array.hh"
7#include "BLI_vector.hh"
8#include "BLI_vector_set.hh"
10#include "testing/testing.h"
11
12#include "BLI_strict_flags.h" /* IWYU pragma: keep. Keep last. */
13
14namespace blender::tests {
15
16TEST(virtual_array, Span)
17{
18 std::array<int, 5> data = {3, 4, 5, 6, 7};
20 EXPECT_EQ(varray.size(), 5);
21 EXPECT_EQ(varray.get(0), 3);
22 EXPECT_EQ(varray.get(4), 7);
23 EXPECT_TRUE(varray.is_span());
24 EXPECT_FALSE(varray.is_single());
25 EXPECT_EQ(varray.get_internal_span().data(), data.data());
26}
27
28TEST(virtual_array, Single)
29{
31 EXPECT_EQ(varray.size(), 4);
32 EXPECT_EQ(varray.get(0), 10);
33 EXPECT_EQ(varray.get(3), 10);
34 EXPECT_FALSE(varray.is_span());
35 EXPECT_TRUE(varray.is_single());
36 EXPECT_EQ(varray.get_internal_single(), 10);
37}
38
39TEST(virtual_array, Array)
40{
41 Array<int> array = {1, 2, 3, 5, 8};
42 {
44 EXPECT_EQ(varray.size(), 5);
45 EXPECT_EQ(varray[0], 1);
46 EXPECT_EQ(varray[2], 3);
47 EXPECT_EQ(varray[3], 5);
48 EXPECT_TRUE(varray.is_span());
49 }
50 {
52 EXPECT_EQ(varray.size(), 5);
53 EXPECT_EQ(varray[0], 1);
54 EXPECT_EQ(varray[2], 3);
55 EXPECT_EQ(varray[3], 5);
56 EXPECT_TRUE(varray.is_span());
57 }
58 {
59 VArray<int> varray = VArray<int>::from_container(array); /* NOLINT: bugprone-use-after-move */
60 EXPECT_TRUE(varray.is_empty());
61 }
62}
63
64TEST(virtual_array, MutableArray)
65{
66 Array<int, 0> array = {1, 2, 3, 5, 8};
67 const Span<int> array_span = array;
69 EXPECT_TRUE(varray.is_span());
70 EXPECT_EQ(varray.size(), 5);
71 EXPECT_EQ(varray[0], 1);
72 EXPECT_EQ(varray[2], 3);
73 EXPECT_EQ(varray[3], 5);
74 EXPECT_EQ(varray[4], 8);
75 varray.set(2, 100);
76 EXPECT_EQ(varray[2], 100);
77
78 const Span<int> varray_span = varray.get_internal_span();
79 EXPECT_EQ(array_span, varray_span);
80 EXPECT_EQ(array_span.data(), varray_span.data());
81}
82
83TEST(virtual_array, Vector)
84{
85 Vector<int> vector = {9, 8, 7, 6};
87 EXPECT_EQ(varray.size(), 4);
88 EXPECT_EQ(varray[0], 9);
89 EXPECT_EQ(varray[3], 6);
90}
91
92TEST(virtual_array, StdVector)
93{
94 std::vector<int> vector = {5, 6, 7, 8};
96 EXPECT_EQ(varray.size(), 4);
97 EXPECT_EQ(varray[0], 5);
98 EXPECT_EQ(varray[1], 6);
99}
100
101TEST(virtual_array, StdArray)
102{
103 std::array<int, 4> array = {2, 3, 4, 5};
104 VArray<int> varray = VArray<int>::from_container(std::move(array));
105 EXPECT_EQ(varray.size(), 4);
106 EXPECT_EQ(varray[0], 2);
107 EXPECT_EQ(varray[1], 3);
108}
109
110TEST(virtual_array, VectorSet)
111{
112 VectorSet<int> vector_set = {5, 3, 7, 3, 3, 5, 1};
113 VArray<int> varray = VArray<int>::from_container(std::move(vector_set));
114 EXPECT_TRUE(vector_set.is_empty()); /* NOLINT: bugprone-use-after-move. */
115 EXPECT_EQ(varray.size(), 4);
116 EXPECT_EQ(varray[0], 5);
117 EXPECT_EQ(varray[1], 3);
118 EXPECT_EQ(varray[2], 7);
119 EXPECT_EQ(varray[3], 1);
120}
121
122TEST(virtual_array, Func)
123{
124 auto func = [](int64_t index) { return int(index * index); };
125 VArray<int> varray = VArray<int>::from_func(10, func);
126 EXPECT_EQ(varray.size(), 10);
127 EXPECT_EQ(varray[0], 0);
128 EXPECT_EQ(varray[3], 9);
129 EXPECT_EQ(varray[9], 81);
130}
131
132TEST(virtual_array, AsSpan)
133{
134 auto func = [](int64_t index) { return int(10 * index); };
135 VArray<int> func_varray = VArray<int>::from_func(10, func);
136 VArraySpan span_varray{func_varray};
137 EXPECT_EQ(span_varray.size(), 10);
138 Span<int> span = span_varray;
139 EXPECT_EQ(span.size(), 10);
140 EXPECT_EQ(span[0], 0);
141 EXPECT_EQ(span[3], 30);
142 EXPECT_EQ(span[6], 60);
143}
144
145static int get_x(const std::array<int, 3> &item)
146{
147 return item[0];
148}
149
150static void set_x(std::array<int, 3> &item, int value)
151{
152 item[0] = value;
153}
154
155TEST(virtual_array, DerivedSpan)
156{
158 vector.append({3, 4, 5});
159 vector.append({1, 1, 1});
160 {
161 VArray<int> varray = VArray<int>::from_derived_span<std::array<int, 3>, get_x>(vector);
162 EXPECT_EQ(varray.size(), 2);
163 EXPECT_EQ(varray[0], 3);
164 EXPECT_EQ(varray[1], 1);
165 }
166 {
167 VMutableArray<int> varray =
169 EXPECT_EQ(varray.size(), 2);
170 EXPECT_EQ(varray[0], 3);
171 EXPECT_EQ(varray[1], 1);
172 varray.set(0, 10);
173 varray.set(1, 20);
174 EXPECT_EQ(vector[0][0], 10);
175 EXPECT_EQ(vector[1][0], 20);
176 }
177}
178
179TEST(virtual_array, MutableToImmutable)
180{
181 std::array<int, 4> array = {4, 2, 6, 4};
182 {
184 VArray<int> varray = mutable_varray;
185 EXPECT_TRUE(varray.is_span());
186 EXPECT_EQ(varray.size(), 4);
187 EXPECT_EQ(varray[1], 2);
188 EXPECT_EQ(mutable_varray.size(), 4);
189 }
190 {
192 EXPECT_EQ(mutable_varray.size(), 4);
193 VArray<int> varray = std::move(mutable_varray);
194 EXPECT_TRUE(varray.is_span());
195 EXPECT_EQ(varray.size(), 4);
196 EXPECT_EQ(varray[1], 2);
197 EXPECT_EQ(mutable_varray.size(), 0); /* NOLINT: bugprone-use-after-move */
198 }
199 {
201 EXPECT_TRUE(varray.is_span());
202 EXPECT_EQ(varray.size(), 4);
203 EXPECT_EQ(varray[1], 2);
204 }
205}
206
207TEST(virtual_array, MaterializeCompressed)
208{
209 IndexMaskMemory memory;
210 {
211 std::array<int, 10> array = {0, 10, 20, 30, 40, 50, 60, 70, 80, 90};
213 std::array<int, 3> compressed_array;
215 compressed_array);
216 EXPECT_EQ(compressed_array[0], 30);
217 EXPECT_EQ(compressed_array[1], 60);
218 EXPECT_EQ(compressed_array[2], 70);
220 compressed_array);
221 EXPECT_EQ(compressed_array[0], 20);
222 EXPECT_EQ(compressed_array[1], 80);
223 EXPECT_EQ(compressed_array[2], 90);
224 }
225 {
227 std::array<int, 3> compressed_array;
229 compressed_array);
230 EXPECT_EQ(compressed_array[0], 4);
231 EXPECT_EQ(compressed_array[1], 4);
232 EXPECT_EQ(compressed_array[2], 4);
233 compressed_array.fill(0);
235 compressed_array);
236 EXPECT_EQ(compressed_array[0], 4);
237 EXPECT_EQ(compressed_array[1], 4);
238 EXPECT_EQ(compressed_array[2], 4);
239 }
240 {
241 VArray<int> varray = VArray<int>::from_func(10, [](const int64_t i) { return int(i * i); });
242 std::array<int, 3> compressed_array;
244 compressed_array);
245 EXPECT_EQ(compressed_array[0], 25);
246 EXPECT_EQ(compressed_array[1], 49);
247 EXPECT_EQ(compressed_array[2], 64);
249 compressed_array);
250 EXPECT_EQ(compressed_array[0], 1);
251 EXPECT_EQ(compressed_array[1], 4);
252 EXPECT_EQ(compressed_array[2], 9);
253 }
254}
255
256TEST(virtual_array, EmptySpanWrapper)
257{
258 {
259 VArray<int> varray;
260 VArraySpan<int> span1 = varray;
261 EXPECT_TRUE(span1.is_empty());
262 VArraySpan<int> span2 = std::move(span1);
263 EXPECT_TRUE(span2.is_empty());
264 }
265 {
266 VMutableArray<int> varray;
267 MutableVArraySpan<int> span1 = varray;
268 EXPECT_TRUE(span1.is_empty());
269 MutableVArraySpan<int> span2 = std::move(span1);
270 EXPECT_TRUE(span2.is_empty());
271 }
272 {
273 GVArray varray;
274 GVArraySpan span1 = varray;
275 EXPECT_TRUE(span1.is_empty());
276 GVArraySpan span2 = std::move(span1);
277 EXPECT_TRUE(span2.is_empty());
278 }
279 {
280 GVMutableArray varray;
281 GMutableVArraySpan span1 = varray;
282 EXPECT_TRUE(span1.is_empty());
283 GMutableVArraySpan span2 = std::move(span1);
284 EXPECT_TRUE(span2.is_empty());
285 }
286}
287
288} // namespace blender::tests
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
BMesh const char void * data
long long int int64_t
bool is_empty() const
static IndexMask from_indices(Span< T > indices, IndexMaskMemory &memory)
constexpr bool is_empty() const
Definition BLI_span.hh:509
constexpr const T * data() const
Definition BLI_span.hh:215
constexpr int64_t size() const
Definition BLI_span.hh:252
constexpr bool is_empty() const
Definition BLI_span.hh:260
void materialize_compressed_to_uninitialized(const IndexMask &mask, MutableSpan< T > r_span) const
T get(const int64_t index) const
void materialize_compressed(const IndexMask &mask, MutableSpan< T > r_span) const
Span< T > get_internal_span() const
static VArray from_derived_span(Span< StructT > values)
static VArray from_single(T value, const int64_t size)
static VArray from_func(const int64_t size, GetFunc get_func)
static VArray from_span(Span< T > values)
static VArray from_container(ContainerT container)
static VMutableArray from_derived_span(MutableSpan< StructT > values)
void set(const int64_t index, T value)
static VMutableArray from_container(ContainerT container)
MutableSpan< T > get_internal_span() const
static VMutableArray from_span(MutableSpan< T > values)
static int get_x(const std::array< int, 3 > &item)
static void set_x(std::array< int, 3 > &item, int value)
TEST(blf_load, load)
Definition BLF_tests.cc:34
i
Definition text_draw.cc:230